Spring-学习笔记06【spring_day02资料_dbutils】

  • Java后端 学习路线 笔记汇总表【黑马程序员】
  1. Spring-学习笔记01【Spring框架简介】【day01】
  2. Spring-学习笔记02【程序间耦合】
  3. Spring-学习笔记03【Spring的IOC和DI】
  4. Spring-学习笔记04【Spring的常用注解】【day02】
  5. Spring-学习笔记05【基于XML的IOC的案例】
  6. Spring-学习笔记06【Spring的新注解】 day02资料_dbutils
  7. Spring-学习笔记07【银行转账案例】【day03】
  8. Spring-学习笔记08【面向切面编程AOP】
  9. Spring-学习笔记09【JdbcTemplate的基本使用】【day04】
  10. Spring-学习笔记10【Spring事务控制】

目录

01_分析jdbc中操作问题-抽取增删改方法的通用方法

1.1、DBAssit.java

02_抽取查询方法-编写封装一个实体对象的结果集处理器

2.1、BeanHandler.java

03_实现查询所有的封装以及dbutils介绍

04_dbutils的使用


01_分析jdbc中操作问题-抽取增删改方法的通用方法

 

1.1、DBAssit.java

package com.itheima.dbassit;import com.itheima.handler.ResultSetHandler;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;/*** 封装的工具类*/
public class DBAssit {private DataSource dataSource;public DBAssit(DataSource dataSource) {this.dataSource = dataSource;}/*** 执行增删改的方法** @param sql* @param params* @return*/public int update(String sql, Object... params) {Connection conn = null;PreparedStatement pstm = null;try {//1.得到连接conn = dataSource.getConnection();//2.使用连接和参数的sql语句创建预处理对象pstm = conn.prepareStatement(sql);//3.得到sql语句参数的源信息(有几个参数,都什么类型等等)ParameterMetaData pmd = pstm.getParameterMetaData();//4.判断语句中参数的个数和方法参数params的个数是否一致,不一致肯定没法执行int parameterCount = pmd.getParameterCount();//参数的个数(问号的个数)if (parameterCount > 0) {if (params == null) {throw new NullPointerException("没有sql语句执行必须的参数");}if (params.length != parameterCount) {throw new RuntimeException("传入的参数个数和语句所需的参数个数不一致,语句无法执行");}}//5.给sql语句的参数赋值for (int i = 0; i < parameterCount; i++) {pstm.setObject(i + 1, params[i]);}//6.执行语句int res = pstm.executeUpdate();//7.返回执行结果return res;} catch (Exception e) {throw new RuntimeException(e);} finally {release(conn, pstm, null);}}public Object query(String sql, ResultSetHandler rsh, Object... params) {Connection conn = null;PreparedStatement pstm = null;ResultSet rs = null;try {//1.得到连接conn = dataSource.getConnection();//2.使用连接和参数的sql语句创建预处理对象pstm = conn.prepareStatement(sql);//3.得到sql语句参数的源信息(有几个参数,都什么类型等等)ParameterMetaData pmd = pstm.getParameterMetaData();//4.判断语句中参数的个数和方法参数params的个数是否一致,不一致肯定没法执行int parameterCount = pmd.getParameterCount();//参数的个数(问号的个数)if (parameterCount > 0) {if (params == null) {throw new NullPointerException("没有sql语句执行必须的参数");}if (params.length != parameterCount) {throw new RuntimeException("传入的参数个数和语句所需的参数个数不一致,语句无法执行");}}//5.给sql语句的参数赋值for (int i = 0; i < parameterCount; i++) {pstm.setObject(i + 1, params[i]);}//6.执行语句rs = pstm.executeQuery();//7.返回执行结果return rsh.handle(rs);} catch (Exception e) {throw new RuntimeException(e);} finally {release(conn, pstm, rs);}}private void release(Connection conn, PreparedStatement pstm, ResultSet rs) {if (rs != null) {try {rs.close();} catch (Exception e) {e.printStackTrace();}}if (pstm != null) {try {pstm.close();} catch (Exception e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (Exception e) {e.printStackTrace();}}}
}

02_抽取查询方法-编写封装一个实体对象的结果集处理器

2.1、BeanHandler.java

package com.itheima.handler.impl;import com.itheima.handler.ResultSetHandler;import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;/*** 结果集封装的具体实现类。* 此类实现的是把一个结果集rs的内容封装到一个指定的实体类对象中* 使用要求:实体类中的属性必须和表中的列名一致(sql语句查询出来的列名一致)** @param */
public class BeanHandler implements ResultSetHandler {private Class domainClass;public BeanHandler(Class domainClass) {this.domainClass = domainClass;}/*** 把rs的内容封装到domainClass所表示的类中** @param rs* @return*/@Overridepublic Object handle(ResultSet rs) {try {//1.创建一个实体类对象Object bean = domainClass.newInstance();//2.判断是否有结果集if (rs.next()) {//3.得到结果集rs中所有的列名//要想得到列名,得先得到结果集的源信息ResultSetMetaData rsmd = rs.getMetaData();//得到源信息之后,还要得到有多少列int columnCount = rsmd.getColumnCount();//遍历列数for (int i = 1; i <= columnCount; i++) {//得到每列的名称String columnName = rsmd.getColumnName(i);//列名其实就是实体类的属性名称,于是就可以使用列名得到实体类中属性的描述器PropertyDescriptor pd = new PropertyDescriptor(columnName, domainClass);//实体类中定义的私有类成员和它的get以及set方法//获取属性的写入方法(set方法)Method method = pd.getWriteMethod();//获取当前列名所对应的值Object columnValue = rs.getObject(columnName);//通过执行写方法把得到的值给属性赋上method.invoke(bean, columnValue);}}//4.返回return bean;} catch (Exception e) {throw new RuntimeException(e);}}
}

03_实现查询所有的封装以及dbutils介绍

04_dbutils的使用


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部