MySql的初学习 -- 第十五章 -- DBUtils
博客说明
文章内容输出来源:拉勾教育Java就业急训营
什么是DBUtils
使用JDBC我们发现冗余的代码太多了,为了简化开发 我们选择使用 DbUtils
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程 序的开发,同时也不会影响程序的性能。
Dbutils核心功能
- QueryRunner 中提供对sql语句操作的API.
- ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
- DbUtils类,他就是一个工具类,定义了关闭资源与事务处理相关方法.
准备工作
- 将这个 jar包添加到 myJar文件夹中
JavaBean组件
JavaBean 就是一个类, 开发中通常用于封装数据,有一下特点
- 需要实现 序列化接口, Serializable
- 提供私有字段: private 类型 变量名;
- 提供 getter 和 setter
- 提供 空参构造
创建类和数据库的表对应
- 我们可以创建一个 entity包,专门用来存放 JavaBean类
创建一个JavaBean
package com.entity;
import java.io.Serializable;
import java.util.Date;
public class Employee implements Serializable {
//对应数据库字段,类型和名称要一致
private int id;
private String name;
private String gender;
private double salary;
private Date join_date;
private int dept_id;
//提供空参构造
public Employee() {
}
//提供有参构造
public Employee(int id, String name, String gender, double salary, Date join_date, int dept_id) {
this.id = id;
this.name = name;
this.gender = gender;
this.salary = salary;
this.join_date = join_date;
this.dept_id = dept_id;
}
//get、set方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Date getJoin_date() {
return join_date;
}
public void setJoin_date(Date join_date) {
this.join_date = join_date;
}
public int getDept_id() {
return dept_id;
}
public void setDept_id(int dept_id) {
this.dept_id = dept_id;
}
//toString方法方便打印
@Override
public String toString() {
return "Employee{" +
"编号=" + id +
", 姓名='" + name + '\'' +
", 性别=" + gender +
", 工资=" + salary +
", 入职时间=" + join_date +
", 部门编号=" + dept_id +
'}';
}
}
DBUtils完成 CRUD(增删改查)
QueryRunner的创建
第一步,需要在之前建的DruidUtils中增加一个获取连接池的方法,QueryRunner的自动模式会用到
/**
* 获取连接池的方法
* @return
*/
public static DataSource getDataSource(){
return dataSource;
}
QueryRunner核心类库的创建方式
public class DBUtilsDemo {
//QueryRunner 核心类的创建方式
public static void main(String[] args) {
//方式1:手动模式
QueryRunner queryRunner = new QueryRunner();
//方式2:自动模式 提供数据库连接对象,DBUtils会自动的维护连接
QueryRunner queryRunner1 = new QueryRunner(DruidUtils.getDataSource());
}
}
QueryRunner实现增删改
增加数据,手动模式
/**
* 增加数据,手动模式
* @throws SQLException
*/
@Test
public void testInsert() throws SQLException {
//1.创建QueryRunner 手动模式创建
QueryRunner qr = new QueryRunner();
//2.编写 占位符方式SQL
String sql = "insert into table values (?,?,?)";
//3.设置占位符的参数
Object[] param = {
null,"张飞","男"};
//4.执行update方法
Connection con = DruidUtils.gerConnection();
int i = qr.update(con, sql, param);
System.out.println(i);
//5.释放资源
//con.close();
//安静的关闭
DbUtils.closeQuietly(con);
}
修改数据,自动模式
/**
* 修改数据,自动模式
* @throws SQLException
*/
@Test
public void testUpdate() throws SQLException {
//1.创建QueryRunner 自动模式创建
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2.编写 占位符方式SQL
String sql = "Update employee set name= ? where id = ?";
//3.设置占位符参数
Object[] param = {
"关羽",1};
//4.执行修改操作 自动模式不需要传入Connection对象
qr.update(sql,param);
//5.自动模式下不需要释放资源,因为QueryRunner的自动模式已经包含,会自动
}
删除数据,自动模式
/**
* 删除数据
* @throws SQLException
*/
@Test
public void testDelete() throws SQLException {
//1.创建QueryRunner 自动模式创建
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2.编写 占位符方式SQL
String sql = "delete from employee where id = ?";
Object param = 1;
qr.update(sql,param);
//5.自动模式下不需要释放资源,因为QueryRunner的自动模式已经包含,会自动
}
QueryRunner实现查询
QueryRunner实现查询需要用到ResultSetHandler接口
- ResultSetHandler可以对查询出来的ResultSet结果集进行处理,达到一些业务上的需求。
- ResultSetHandler接口的几个常见实现类实现数据库的查询,可以大大减少代码量,优化 程序。
ResultSetHandler 实现类 | 说明 |
---|---|
ArrayHandler | 将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这 条记录中的每一个字段的值 |
ArrayListHandler | 将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集 合中。 |
BeanHandler | 将结果集中第一条记录封装到一个指定的javaBean中. |
BeanListHandler | 将结果集中每一条记录封装到指定的javaBean中,再将这些javaBean在封装到List 集合中 |
ColumnListHandler | 将结果集中指定的列的字段值,封装到一个List集合中 |
KeyedHandler | 将结果集中每一条记录封装到Map<String,Object>,在将这个map集合做为另一个 Map的value,另一个Map集合的key是指定的字段的值。 |
MapHandler | 将结果集中第一条记录封装到了Map<String,Object>集合中,key就是字段名称, value就是字段值 |
MapListHandler | 将结果集中每一条记录封装到了Map<String,Object>集合中,key就是字段名称, value就是字段值,在将这些Map封装到List集合中。 |
ScalarHandler | 它是用于封装单个数据。例如 select count(*) from 表操作。 |
方法 | 说明 |
---|---|
query(String sql, handler ,Object[] param) | 自动模式创建QueryRunner, 执行查询 |
query(Connection con,String sql,handler,Object[] param) | 手动模式创建QueryRunner, 执行查询 |
下面会对加粗的方法都进行例子演示
ArrayHandler:查询一条数据,封装到数组中
/**
* 查询id为1的数据,封装到数组中
*/
@Test
public void testSelect01() throws SQLException {
//1.创建QueryRunner 自动模式创建
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2.编写Sql
String sql = "select * from employee where id=?";
Object param = 1;
//3.执行查询,获得结果集
//ArrayHandler:结果集中的第一条记录封装到一个Object[]数组
Object[] query = qr.query(sql, new ArrayHandler(), param);
//4.获取数据
System.out.println(Arrays.toString(query));
}
ArrayListHandler:查询全部数据,封装到list集合中
/**
* 查询全部数据,封装到list集合中
*/
@Test
public void testSelect02() throws SQLException {
//1.创建QueryRunner 自动模式创建
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2.编写Sql
String sql = "select * from employee";
//3.执行查询,获得结果集
List<Object[]> query = qr.query(sql, new ArrayListHandler());
//4.获取数据
for (Object[] objects : query) {
System.out.println(Arrays.toString(objects));
}
}
BeanHandler:查询一条数据,封装到JavaBean中,再将JavaBean放到list集合中
/**
* 查询id为1的数据,封装到JavaBean中,再将JavaBean放到list集合中
*/
@Test
public void testSelect03() throws SQLException {
//1.创建QueryRunner 自动模式创建
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2.编写Sql
String sql = "select * from employee where id=?";
Object param = 1;
//3.执行查询,获得结果集
//BeanHandler(<Class<T> type>)
//创建BeanHandler需要传递一个参数,参数就是JavaBean类的class文件对象
//我自己建的JavaBean:Employee
//Employee.class 通过反射区创建 Employee对象,将结果集封装到对象中,并返回
Employee employee = qr.query(sql, new BeanHandler<Employee>(Employee.class), param);//ArrayHandler:结果集中的第一条记录封装到一个Object[]数组
//4.获取数据
System.out.println(employee);
}
BeanListHandler:查询全部数据,封装到JavaBean中,再将JavaBean放到list集合中
/**
* 查询全部数据,封装到JavaBean中,再将JavaBean放到list集合中
*/
@Test
public void testSelect04() throws SQLException {
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
String sql = "select * from employee";
List<Employee> query = qr.query(sql, new BeanListHandler<Employee>(Employee.class));
for (Employee employee : query) {
System.out.println(employee);
}
}
MapHandler:查询数据,封装到Map中
/**
* 查询id为1的数据,封装到Map中
* MapHandLer 将结果的第一条数据封装到Map<String,Object>中 key对应的是列名,value对应的是值
*/
@Test
public void testSelect05() throws SQLException {
//1.创建QueryRunner 自动模式创建
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2.编写Sql
String sql = "select * from employee where id = ?";
//3.执行查询,获得结果集
Map<String, Object> map = qr.query(sql, new MapHandler(), 1);
//4.获取map
Set<Map.Entry<String, Object>> entries = map.entrySet();
//5.获取数据
for (Map.Entry<String, Object> entry : entries) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
}
ScalarHandler :查询一个数据
/**
* 查询所有员工工资总额
* ScalarHandler 用于封装单个的数据
*/
@Test
public void testSelect06() throws SQLException {
//1.创建QueryRunner 自动模式创建
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2.编写Sql
String sql = "select sum(salary) from employee";
//3.这里转成double是因为工资的类型是double,以后需要什么类型转什么类型即可
Double sum = (double)qr.query(sql, new ScalarHandler<>());
//4.获取数据
System.out.println(sum);
}