您当前的位置: 首页 > 

梁云亮

暂无认证

  • 1浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【精品】模拟DBUtils自定义JDBC模板类

梁云亮 发布时间:2022-04-15 18:36:50 ,浏览量:1

简介

利用DBUtils能够大大减少JDBC代码的编写,本博客我们模拟实现一个简单的DBUtils。

1、准备工作 数据库

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

CREATE TABLE `tb_user` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '编号',
  `name` varchar(5) DEFAULT NULL COMMENT ' 姓名',
  `gender` bit(1) DEFAULT NULL COMMENT '性别',
  `tel` char(11) DEFAULT NULL COMMENT '电话',
  `credits` int DEFAULT NULL COMMENT '总的积分',
  PRIMARY KEY (`id`),
  UNIQUE KEY `tel` (`tel`)
) ENGINE=InnoDB AUTO_INCREMENT=109 DEFAULT CHARSET=utf8mb3 COMMENT='用户表';
实体类
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
public class User {
    private Integer id;
    private String name;
    private Boolean gender;
    private String tel;
    private Integer credits;

    public User(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接口,用来规范处理结果集的接口
public interface ResultSetHandler {
    T process(ResultSet rSet);
}
自定义Handler实现类 查询有多少条的
public class ScalarHandler implements ResultSetHandler {
    private Class clazz;

    public BeanHandler(Class clazz) {
        this.clazz = clazz;
    }
    
    @Override
    public T process(ResultSet rs) {
    	T res = null;
        try {
	        while (rs.next()) {
	            res = (T) rs.getObject(1);
	            break;
	        }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return res;
    }
}
将结果转换成对象的
public class BeanHandler implements ResultSetHandler {
    private Class clazz;

    public BeanHandler(Class clazz) {
        this.clazz = clazz;
    }
    
    @Override
    public T process(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());
                    pd.getWriteMethod().invoke(obj, value);
                }
               return obj;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
将结果集转换成对象集合的
public class BeanListHandler implements ResultSetHandler {
    private Class clazz;

    public BeanHandler(Class clazz) {
        this.clazz = clazz;
    }
    
    @Override
    public List process(ResultSet rs) {
        // 创建 List 用于存放装箱后的对象
        List list = new ArrayList();
        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());
                    pd.getWriteMethod().invoke(obj, value);
                }
                list.add(obj);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

}
自定义模板类
public class JdbcTemplate {
    /**
     * 具类,私有化无参构造函数
     */
    private JdbcTemplate() {
    }

    /**
     * DML 操作模板方法
     * @param sql  执行操作的 SQL 语句
     * @param args SQL 语句参数
     */
    public static int update(String sql, Object... args) {
        // 获取数据库连接 conn
        Connection conn = JdbcUtil.getConnection();
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(sql);
            // 给预编译好的 sql 语句中的占位符进行赋值
            if (args != null && args.length > 0) {
                for (int i = 0; i  0) {
                for (int i = 0; i             
关注
打赏
1665409997
查看更多评论
0.0544s