0


【精品】JDBC模板类

1、准备工作

数据库

在这里插入图片描述
对应的SQL语句:

  1. CREATETABLE`tb_user`(`id`intNOTNULLAUTO_INCREMENTCOMMENT'编号',`name`varchar(5)DEFAULTNULLCOMMENT' 姓名',`gender`bit(1)DEFAULTNULLCOMMENT'性别',`tel`char(11)DEFAULTNULLCOMMENT'电话',`credits`intDEFAULTNULLCOMMENT'总的积分',PRIMARYKEY(`id`),UNIQUEKEY`tel`(`tel`))ENGINE=InnoDBAUTO_INCREMENT=109DEFAULTCHARSET=utf8mb3 COMMENT='用户表';

实体类

  1. @Getter@Setter@NoArgsConstructor@AllArgsConstructor@Builder@ToStringpublicclassUser{privateInteger id;privateString name;privateBoolean gender;privateString tel;privateInteger credits;publicUser(String name,Boolean gender,String tel,Integer credits){this.name = name;this.gender = gender;this.tel = tel;this.credits = credits;}}

JDBC工具类

参考博客:JDBC工具类

2、定义JDBC模板

定义Handler接口,用来规范处理结果集的接口

  1. publicinterfaceResultSetHandler<T>{Tprocess(ResultSet rSet);}

自定义Handler实现类

查询有多少条的

  1. publicclassScalarHandler<T>implementsResultSetHandler<T>{privateClass<T> clazz;publicBeanHandler(Class<T> clazz){this.clazz = clazz;}@OverridepublicTprocess(ResultSet rs){T res =null;try{while(rs.next()){
  2. res =(T) rs.getObject(1);break;}}catch(Exception e){
  3. e.printStackTrace();}return res;}}

将结果转换成对象的

  1. publicclassBeanHandler<T>implementsResultSetHandler<T>{privateClass<T> clazz;publicBeanHandler(Class<T> clazz){this.clazz = clazz;}@OverridepublicTprocess(ResultSet rs){// 创建 List 用于存放装箱后的对象try{// 获取类的属性描述符BeanInfo beanInfo =Introspector.getBeanInfo(clazz,Object.class);PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();// 对结果集进行装箱操作while(rs.next()){T obj = clazz.getDeclaredConstructor().newInstance();for(PropertyDescriptor pd : pds){Object value = rs.getObject(pd.getName());
  2. pd.getWriteMethod().invoke(obj, value);}return obj;}}catch(Exception e){
  3. e.printStackTrace();}returnnull;}}

将结果集转换成对象集合的

  1. publicclassBeanListHandler<T>implementsResultSetHandler<List<T>>{privateClass<T> clazz;publicBeanHandler(Class<T> clazz){this.clazz = clazz;}@OverridepublicList<T>process(ResultSet rs){// 创建 List 用于存放装箱后的对象List<T> list =newArrayList<T>();try{// 获取类的属性描述符BeanInfo beanInfo =Introspector.getBeanInfo(clazz,Object.class);PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();// 对结果集进行装箱操作while(rs.next()){T obj = clazz.getDeclaredConstructor().newInstance();for(PropertyDescriptor pd : pds){Object value = rs.getObject(pd.getName());
  2. pd.getWriteMethod().invoke(obj, value);}
  3. list.add(obj);}}catch(Exception e){
  4. e.printStackTrace();}return list;}}

自定义模板类

  1. publicclassJdbcTemplate{/**
  2. * 具类,私有化无参构造函数
  3. */privateJdbcTemplate(){}/**
  4. * DML 操作模板方法
  5. * @param sql 执行操作的 SQL 语句
  6. * @param args SQL 语句参数
  7. */publicstaticintupdate(String sql,Object... args){// 获取数据库连接 connConnection conn =JdbcUtil.getConnection();PreparedStatement ps =null;try{
  8. ps = conn.prepareStatement(sql);// 给预编译好的 sql 语句中的占位符进行赋值if(args !=null&& args.length >0){for(int i =0; i < args.length; i++){
  9. ps.setObject(i +1, args[i]);}}// 执行 SQL 语句int res = ps.executeUpdate();return res;}catch(SQLException e){
  10. e.printStackTrace();}finally{// 释放数据库连接JdbcUtil.release(conn, ps,null);}return-1;}/**
  11. * DQL 操作模板
  12. * @param sql 执行操作的 SQL 语句
  13. * @param handler 对数据库返回结果集进行装箱的操作类
  14. * @param args SQL 语句参数
  15. * @return 返回数据库查询结果集
  16. */publicstatic<T>Tquery(String sql,ResultSetHandler<T> handler,Object... args){Connection conn =JdbcUtil.getConnection();PreparedStatement ps =null;ResultSet rs =null;try{
  17. ps = conn.prepareStatement(sql);if(args !=null&& args.length >0){for(int i =0; i < args.length; i++){
  18. ps.setObject(i +1, args[i]);}}
  19. rs = ps.executeQuery();// 调用处理结果集类对数据库查询结果集进行装箱return handler.process(rs);}catch(SQLException e){
  20. e.printStackTrace();}finally{// 释放数据库连接JdbcUtil.release(conn, ps, rs);}returnnull;}}

3、测试

UserDao接口

  1. publicinterfaceUserDao{intinsert(User user);intdeleteById(Integer id);intupdate(User user);UserselectById(Integer id);List<User>list();longselectCount();StringselectNameById(Integer id);}

UserDaoImpl实现类

  1. publicclassUserDaoImplimplementsUserDao{@Overridepublicintinsert(User user){String sql ="INSERT INTO tb_user(name, gender, tel,credits) VALUES(?, ?, ?, ?)";Object[] args =newObject[]{user.getName(), user.getGender(), user.getTel(), user.getCredits()};returnJdbcTemplate.update(sql, args);}@OverridepublicintdeleteById(Integer id){String sql ="DELETE FROM tb_user WHERE id = ?";returnJdbcTemplate.update(sql, id);}@Overridepublicintupdate(User user){String sql ="UPDATE tb_user SET name = ?,gender= ?,tel=?,credits=? WHERE id = ?";Object[] args =newObject[]{user.getName(), user.getGender(), user.getTel(), user.getCredits(), user.getId()};returnJdbcTemplate.update(sql, args);}@OverridepublicUserselectById(Integer id){String sql ="SELECT id, name,gender, tel,credits FROM tb_user WHERE id = ?";returnJdbcTemplate.query(sql,newBeanHandler<>(User.class), id);}@OverridepublicList<User>list(){String sql ="SELECT id, name, gender, tel,credits FROM tb_user";returnJdbcTemplate.query(sql,newBeanListHandler<>(User.class));}@OverridepublicLongselectCount(){String sql ="Select count(*) from tb_user";returnJdbcTemplate.query(sql,newScalarHandler(Long.class));}@OverridepublicStringselectNameById(Integer id){String sql ="select name from tb_user where id =?";String name =JdbcTemplate.query(sql,newScalarHandler<>(String.class), id);System.out.println(name);}}

测试代码

  1. classUserDaoImplTest{privateUserDao userDao =newUserDaoImpl();@Testvoidsave(){User user =newUser("asdf",true,"32143214312",77);
  2. userDao.insert(user);}@Testvoiddelete(){int res = userDao.deleteById(108);System.out.println(res);}@Testvoidupdate(){User user =newUser(3,"asdf",true,"32143214312",77);int res = userDao.update(user);System.out.println(res);}@Testvoidget(){User user = userDao.selectById(5);System.out.println(user);}@Testvoidlist(){List<User> list = userDao.list();
  3. list.forEach(System.out::println);}@TestvoidselectCount(){}@TestvoidselectNameById(){}}
标签: Handler 模板

本文转载自: https://blog.csdn.net/lianghecai52171314/article/details/124201136
版权归原作者 梁云亮 所有, 如有侵权,请联系我们删除。

“【精品】JDBC模板类”的评论:

还没有评论