04_自定义DbUtils之增删改
-
相同点
- 1,获取连接
- 4,执行sql语句
- 5,释放资源
-
不同点
- 2,sql语句
- 3,设置参数
-
代码实现
public static void update(String sql , Object... parameters){ Connection connection = null; PreparedStatement statement = null; try { connection = JDBCUtils.getConnection(); statement = connection.prepareStatement(sql); //设置参数值的时候,参照的是parameters的个数! 应该参照有多少个问号? ParameterMetaData parameterMetaData = statement.getParameterMetaData(); for (int i = 0; i < parameterMetaData.getParameterCount(); i++) { statement.setObject(i + 1,parameters[i]); } statement.executeUpdate(); } catch (Exception throwables) { throwables.printStackTrace(); } finally { JDBCUtils.release(connection, statement); } }
05_自定义DbUtils之查询
-
相同点
- 1,获取连接
- 5,释放资源
-
不同点
- 2,sql语句
- 3,设置参数
- 4,处理结果集
-
代码实现
-
MyResultSetHandler接口
- 处理结果集,并得到想要的类型的数据
public interface MyResultSetHandler<T> { /** * 处理结果集,并返回想要的类型的数据 * @param resultSet 结果集 * @return 要的类型的数据 * @throws Exception */ T handle(ResultSet resultSet) throws Exception; }
-
通用query方法
public static<T> T query(String sql ,MyResultSetHandler<T> handler,Object... parameters ){ Connection connection = null; PreparedStatement statement = null; ResultSet resultSet = null; try { connection = JDBCUtils.getConnection(); statement = connection.prepareStatement(sql); for (int i = 0; i < statement.getParameterMetaData().getParameterCount(); i++) { statement.setObject(i+1 , parameters[i]); } resultSet = statement.executeQuery(); //处理结果集 , 返回结果 T t = handler.handle(resultSet); return t; } catch (Exception throwables) { throwables.printStackTrace(); } finally { JDBCUtils.release(connection,statement,resultSet); } return null; }
-
测试代码
User existUser = MyDbUtils.query("select * from tb_user where id = ?", new MyResultSetHandler<User>() { @Override public User handle(ResultSet resultSet) throws Exception { User user = null; while (resultSet.next()) { Integer id = resultSet.getInt("id"); String username = resultSet.getString("username"); String password = resultSet.getString("password"); user = new User(id, username, password); } return user; } }, 2); System.out.println(existUser);
-
存在的问题
- 结果集的处理太麻烦,具体体现在处理结果集的具体实现上!!
-
解决思路
- 如果结果集处理之后返回的是单条记录,封装好一个MyBeanHandler
- 如果结果集处理之后返回的是多条记录,封装好一个MyBeanListHandler
-
03_自定义DbUtils之MyBeanHandler
-
概念
- 封装单条记录的结果集处理
-
开发步骤
- MyResultSetHandler接口上的泛型由MyBeanHandler的泛型确定
- 声明一个Class对象的引用
- 重写handle方法
-
代码实现
public class MyBeanHandler<T> implements MyResultSetHandler<T> { private Class<T> clazz;//User类Class对象,也可以是Student类Class对象 public MyBeanHandler(Class<T> clazz) { this.clazz = clazz; } @Override public T handle(ResultSet resultSet) throws Exception { T t = clazz.newInstance(); //处理结果集 while (resultSet.next()){ //id属性值,username属性值,password属性值 Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { //字段名称 String fieldName = field.getName(); //字段值 Object fieldValue = resultSet.getObject(fieldName); //将字段值设置Class对象对应的java实体对象 //获取字段对应set方法 String methodName = "set" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1); Method method = clazz.getMethod(methodName, field.getType()); if (null != method) { method.invoke(t,fieldValue); } }+ } return t; } }
04_自定义DbUtils之MyBeanListHandler
-
概念
- 封装多条记录的结果集处理
-
开发步骤
- MyResultSetHandler接口上的泛型由MyBeanListHandler的泛型确定
- 已经确定了返回的是集合,只是不确定集合中的元素的类型
- MyBeanListHandler只确定集合中元素的类型就可以了
- 声明一个Class对象的引用
- 重写handle方法
- MyResultSetHandler接口上的泛型由MyBeanListHandler的泛型确定
-
代码实现
public class MyBeanListHandler<T> implements MyResultSetHandler<List<T>> { private Class<? extends T> clazz;//集合中元素的Class对象 public MyBeanListHandler(Class<? extends T> clazz) { this.clazz = clazz; } @Override public List<T> handle(ResultSet resultSet) throws Exception { List<T> list = new ArrayList<>(); while (resultSet.next()) { //循环一次,就是一条记录,就是一个对象 T t = clazz.newInstance(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { String fieldName = field.getName(); Object fieldValue = resultSet.getObject(fieldName); //获取set方法 String methodName = "set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1); Method method = clazz.getMethod(methodName, field.getType()); if (null != method) { method.invoke(t,fieldValue); } } list.add(t); } return list; } }