简介
利用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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?