JDBC4.JDBCUtils实现CRUD操作
Posted 王六六的IT日常
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC4.JDBCUtils实现CRUD操作相关的知识,希望对你有一定的参考价值。
DBUtils实现CRUD操作
API介绍:
-
org.apache.commons.dbutils.QueryRunner
-
org.apache.commons.dbutils.ResultSetHandler
-
工具类:org.apache.commons.dbutils.DbUtils
-
QueryRunner提供数据库操作的一系列重载的update()和query()操作
-
QueryRunner类提供了两个构造器:
默认的构造器
需要一个 javax.sql.DataSource 来作参数的构造器 -
ResultSetHandler接口用于处理数据库查询操作得到的结果集。不同的结果集的情形,由其不同的子类实现
1.添加
方式一:向数据表中添加一条记录
@Test
public void test1() {
Connection connection = null;
try {
//1. 先获取数据库的连接 调用工具类
connection = JDBCUtils.getConnection();
//2. 提供一个添加操作的sql
String sql = "insert into customers(name,email,birth)values('王海','tom@126.com','2020-09-08')";
//3. 使用提供好的QueryRunner,调用update()方法,实现数据的插入
QueryRunner runner = new QueryRunner();
int count = runner.update(connection, sql);
System.out.println("添加了" + count + "条记录");
} catch (Exception e) {
e.printStackTrace();
} finally {
//4. 资源的关闭
JDBCUtils.close(connection);
}
}
方式二:使用带占位符的sql 比较推荐 共用一个sql 大文件用 insert一次一条
@Test
public void test2() {
Connection connection = null;
try {
//1. 先获取数据库的连接
connection = JDBCUtils.getConnection();
//2. 提供一个包含占位符的sql '?'就是占位符
//String sql = "insert into customers(name,email,birth,photo)values(?,?,?,?)";
String sql = "insert into customers(name,email,birth)values(?,?,?)";
//3. 使用提供好的QueryRunner,调用update()方法,实现数据的插入
QueryRunner runner = new QueryRunner();
//有几个占位符添加几个参数
int count = runner.update(connection, sql,"丸子","wanzi@163.com","2021-10-5");
//int count = runner.update(connection, sql,"丸子","wanzi@163.com",new Date(23423423432423L));
System.out.println("添加了" + count + "条记录");
} catch (Exception e) {
e.printStackTrace();
} finally {
//4. 资源的关闭
JDBCUtils.close(connection);
}
}
2.删除(使用占位符)
//删除记录的操作 自带批量
@Test
public void test3(){
Connection connection = null;
try {
//1. 先获取数据库的连接
connection = JDBCUtils.getConnection();
//2. 提供一个包含占位符的sql
String sql = "delete from customers where id > ?";
//3. 使用提供好的QueryRunner,调用update()方法,实现数据的插入
QueryRunner runner = new QueryRunner();
//params:19填充占位符
int count = runner.update(connection, sql,19);
System.out.println("删除了" + count + "条记录");
} catch (Exception e) {
e.printStackTrace();
} finally {
//4. 资源的关闭
JDBCUtils.close(connection);
}
}
3.修改
//修改表数据的操作 自带批量
@Test
public void test4(){
Connection connection = null;
try {
//1. 先获取数据库的连接
connection = JDBCUtils.getConnection();
//2. 提供一个包含占位符的sql
String sql = "update customers set email = ? where id = ?";
//3. 使用提供好的QueryRunner,调用update()方法,实现数据的插入
QueryRunner runner = new QueryRunner();
//params填充占位符
int count = runner.update(connection, sql,"tom@gmail.com",19);
System.out.println("修改了" + count + "条记录");
} catch (Exception e) {
e.printStackTrace();
} finally {
//4. 资源的关闭
JDBCUtils.close(connection);
}
}
4.查询
ResultSetHandler接口的主要实现类:
- BeanHandler:对应查询表中的一条记录,以对象的方式返回
- BeanListHandler:对应查询表中的多条记录,以对象构成的集合的方式返回
- MapHandler:对应查询表中的一条记录,结果集ResultSetHandler<Map<String,Object>>里的数据以map对象的方式返回。
map中key为表中的字段名,map中value为表中一条数据的数据值。 - MapListHandler:对应查询表中的多条记录,以map对象构成的List的方式返回。ResultSetHandler<List<Map<String, Object>>> 。按map中的key排序
map中key为表中的字段名,map中value为表中一条数据的数据值。 - ScalarHandler:用于查询表中的特殊值。比如:count(*) \\ max(xxx)
query源码:
ResultSetHandler<T> rsh
表示结果集
public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
PreparedStatement stmt = null;
ResultSet rs = null;
Object result = null;
try {
stmt = this.prepareStatement(conn, sql);
this.fillStatement(stmt, params);
rs = this.wrap(stmt.executeQuery());
result = rsh.handle(rs);
} catch (SQLException var33) {
this.rethrow(var33, sql, params);
} finally {
try {
this.close(rs);
} finally {
this.close((Statement)stmt);
}
}
return result;
}
BeanHandler源码:
public class BeanHandler<T> implements ResultSetHandler<T> {
private final Class<T> type;
private final RowProcessor convert;
public BeanHandler(Class<T> type) {
this(type, ArrayHandler.ROW_PROCESSOR);
}
public BeanHandler(Class<T> type, RowProcessor convert) {
this.type = type;
this.convert = convert;
}
public T handle(ResultSet rs) throws SQLException {
return rs.next() ? this.convert.toBean(rs, this.type) : null;
}
}
测试数据表的查询操作,返回结果集:
public class QueryTest {
/*
* BeanHandler:对应查询表中的一条记录,以对象的方式返回
*
* */
@Test
public void test1() {
Connection connection = null;
try {
//1.获取数据库的连接
connection = JDBCUtils.getConnection();
//2.提供一条带占位符的查询语句sql
String sql = "select id,name,email,birth from customers where id = ?";
//3. 创建QueryRunner的实例
QueryRunner runner = new QueryRunner();
//4. 通过QueryRunner的实例,调用其query() BeanHandler
BeanHandler<Customer> handler = new BeanHandler<>(Customer.class);
Customer customer = runner.query(connection, sql, handler, 1);
System.out.println(customer);
} catch (Exception e) {
e.printStackTrace();
} finally {
//5. 关闭资源
JDBCUtils.close(connection);
}
}
/*
* BeanListHandler:对应查询表中的多条记录,以对象构成的集合的方式返回
*
* */
@Test
public void test2() {
Connection connection = null;
try {
//1.获取数据库的连接
connection = JDBCUtils.getConnection();
//2.提供一条带占位符的查询语句sql
String sql = "select id,name,email,birth from customers where id > ?";
//3. 创建QueryRunner的实例
QueryRunner runner = new QueryRunner();
//4. 通过QueryRunner的实例,调用其query() BeanListHandler---- ResultSetHandler<List>
//BeanListHandler<Customer> handler = new BeanListHandler<>(Customer.class);
ResultSetHandler<List<Customer>> handler = new BeanListHandler<>(Customer.class);
List<Customer> list = runner.query(connection, sql, handler, 1);
list.forEach(System.out::println);
} catch (Exception e) {
e.printStackTrace();
} finally {
//5. 关闭资源
JDBCUtils.close(connection);
}
}
/*
* MapHandler:对应查询表中的一条记录,结果集ResultSetHandler<Map<String,Object>>里数据以map对象的方式返回。
* map中key为表中的字段名,map中value为表中一条数据的数据值。
*
* */
@Test
public void test3() {
Connection connection = null;
try {
//1.获取数据库的连接
connection = JDBCUtils.getConnection();
//2.提供一条带占位符的查询语句sql
String sql = "select id,name,email,birth from customers where id = ?";
//3. 创建QueryRunner的实例
QueryRunner runner = new QueryRunner();
//4. 通过QueryRunner的实例,调用其query()
//MapHandler handler = new MapHandler();
//结果集 Map<String,Object>
ResultSetHandler<Map<String,Object>> handler = new MapHandler();
Map<String, Object> map = runner.query(connection, sql, handler, 1);
System.out.println(map);
} catch (Exception e) {
e.printStackTrace();
} finally {
//5. 关闭资源
JDBCUtils.close(connection);
}
}
/*
* MapListHandler:对应查询表中的多条记录,以map对象构成的List的方式返回。ResultSetHandler<List<Map<String, Object>>>
* 按map中的key排序
* map中key为表中的字段名,map中value为表中一条数据的数据值。
*
* */
@Test
public void test4() {
Connection connection = null;
try {
//1.获取数据库的连接
connection = JDBCUtils.getConnection();
//2.提供一条带占位符的查询语句sql
String sql = "select id,name,email,birth from customers where id > ?";
//3. 创建QueryRunner的实例
QueryRunner runner = new QueryRunner();
//4. 通过QueryRunner的实例,调用其query()
ResultSetHandler<List<Map<String, Object>>> handler = new MapListHandler();
List<Map<String, Object>> list = runner.query(connection, sql, handler, 1);
list.forEach(System.out::println);
} catch (Exception e) {
e.printStackTrace();
} finally {
//5. 关闭资源
JDBCUtils.close(connection);
}
}
/*
* ScalarHandler:用于查询表中的特殊值。比如:count(*) \\ max(xxx)
*
* */
@Test
public void test5(){
Connection connection = null;
try {
//1.获取数据库的连接
connection = JDBCUtils.getConnection();
//2.提供一条带占位符的查询语句sql
String sql = "select count(*) from customers";
//3. 创建QueryRunner的实例
QueryRunner runner = new QueryRunner();
//4. 通过QueryRunner的实例,调用其query()
ScalarHandler handler = new ScalarHandler();
long count = (long) runner.query(connection, sql, handler);
System.out.println("查询到表中一共有" + count + "条记录");
} catch (Exception e) {
e.printStackTrace();
} finally {
//5. 关闭资源
JDBCUtils.close(connection);
}
}
@Test
public void test6(){
Connection connection = null;
try {
//1.获取数据库的连接
connection = JDBCUtils.getConnection();
//2.提供一条带占位符的查询语句sql
String sql = "select max(birth) from customers";
//3. 创建QueryRunner的实例
QueryRunner runner = new QueryRunner();
//4. 通过QueryRunner的实例,调用其query()
ScalarHandler handler = new ScalarHandler();
Date birth = (Date) runner.query(connection, sql, handler);
System.out.println("查询到表中最大的birth是:" + birth);
} catch (Exception e) {
e.printStackTrace();
} finally {
//5. 关闭资源
JDBCUtils.close(connection);
}
}
}
SELECT id,NAME,email,birth FROM customers WHERE id = 1;
sql查询结果集如下👇
对应test1运行,查询一条数据结果如下:
查询多条数据结果如下:
以map对象的方式返回:
以List<Map<String, Object>>的方式返回结果集如下:
test5运行结果如下:
ORM(object relational mapping)编程思想:
- 数据库中的一个表 与 Java中的一个类对应
- 表中的一条记录 与 类中一个对象对应
- 表中的一个列(或字段) 与 类中的一个属性对应
public class Customer {
private int id;
private String name;
private String email;
private Date birth;
// private Blob photo;
@Override
public String toString() {
return "Customer{" +
"id=" + id +
", name='" + name + '\\'' +
", email='" + email + '\\'' +
", birth=" + birth +
'}';
}
public Customer(int id, String name, String email, Date birth) {
this.id = id;
this.name = name;
this.email = email;
this.birth = birth;
}
public Customer() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() 以上是关于JDBC4.JDBCUtils实现CRUD操作的主要内容,如果未能解决你的问题,请参考以下文章
mybatis实现CRUD操作和优化代码及调试(mysql数据库)
kratos学习从零使用kratos创建一个CRUD的demo,是gorm做数据库操作,经过几天研究,调试代码开源放到github上,还是非常方便的。服务也实现了CRUD的http接口。