示例
1、新建项目,把数据库驱动、DbUtils的jar包添加到项目中
2、新建文件夹resource,标识为资源根目录,下面新建数据库连接的配置文件mysql.properties
driver=
com.mysql.cj.jdbc.Driver
url=jdbc:mysql:
//localhost:3306/my_db?serverTimezone=GMT
user=
chy
password=abcd
?serverTimezone=GMT是为了解决时区问题,GMT、UTC均可。
3、新建实体类bean.Student
1 package bean;
2
3 public class Student {
4 private int id;
5 private String name;
6 private int age;
7 private int score;
8
9 public Student() {
10 }
11
12 public Student(
int id, String name,
int age,
int score) {
13 this.id =
id;
14 this.name =
name;
15 this.age =
age;
16 this.score =
score;
17 }
18
19 public int getId() {
20 return id;
21 }
22
23 public void setId(
int id) {
24 this.id =
id;
25 }
26
27 public String getName() {
28 return name;
29 }
30
31 public void setName(String name) {
32 this.name =
name;
33 }
34
35 public int getAge() {
36 return age;
37 }
38
39 public void setAge(
int age) {
40 this.age =
age;
41 }
42
43 public int getScore() {
44 return score;
45 }
46
47 public void setScore(
int score) {
48 this.score =
score;
49 }
50
51 @Override
52 public String toString() {
53 return "Student{" +
54 "id=" + id +
55 ", name='" + name + '\'' +
56 ", age=" + age +
57 ", score=" + score +
58 '}'
;
59 }
60 }
DbUtils将结果集中的记录映射到JavaBean中时,采用的方式和Spring的设值注入一样:先调用空参的构造器,再调用setter()方法进行初始化。
所以一定要有空参的构造器、setter()方法,要么不写构造器,调用默认的空参构造器;如果写了带参的构造器,就必须显示写空参的构造器。
4、新建测试类test.Test
1 public class Test {
2 public static void main(String[] args)
throws ClassNotFoundException, IOException, SQLException {
3 //从properties文件中加载数据库配置
4 Properties properties =
new Properties();
5 InputStream fis = Class.forName("test.Test").getResourceAsStream("/mysql.properties"
);
6 properties.load(fis);
7 String driver = properties.getProperty("driver"
);
8 String url = properties.getProperty("url"
);
9 String user = properties.getProperty("user"
);
10 String password = properties.getProperty("password"
);
11
12 DbUtils.loadDriver(driver);
//静态方法加载驱动
13 Connection connection = DriverManager.getConnection(url, user, password);
//获取连接
14 QueryRunner queryRunner =
new QueryRunner();
//创建QueryRunner对象,增删查改都要通过QueryRunner对象来完成
15
16 //查询
17 String sql = "select * from student_tb where id=?"
;
18 BeanHandler<Student> studentBeanHandler =
new BeanHandler<>(Student.
class);
//结果集处理器,将结果集中的记录映射到指定的类中
19 Student student = queryRunner.query(connection, sql, studentBeanHandler, 1);
//执行查询,将结果集中的记录映射到JavaBean中,返回的就是目标类型,不必强转
20 System.out.println(student);
//可通过getter()方法获取属性值(对应表中的字段值)
21
22 DbUtils.close(connection);
//静态方法关闭连接
23 }
24 }
ResultSetHandler
结果集处理器ResultSetHandler是一个接口,不能直接使用。
(1)使用ResultSetHandler的实现类ScalarHandler
ScalarHandler适合只有一条记录的结果集,获取的是该条记录某个字段的值。
(2)ResultSetHandler有一个抽象子类BaseResultSetHandler,BaseResultSetHandler有3个实现类
BeanHandler 将结果集中的记录映射为一个JavaBean,适合结果集中只有一条记录的情况BeanListHandler 将结果集中的所有记录映射为一个JavaBean的List集合,一条记录就是一个元素,就是一个JavaBean。BeanMapHandler 将结果集映射为JavaBean的Map集合
增删查改都是通过QueryRunner对象来实现的:
查:QueryRunner对象.query(数据库连接,sql语句,结果集处理器,sql语句中的?部分的参数值)增、删、改:QueryRunner对象.update(数据库连接,sql语句,sql语句中?部分的参数值)
说明:
最后一个是个数不确定的参数,可以没有,也可以有多个,有多个时逗号隔开即可,也可以写成数组的形式。如果使用了数据源,可缺省第一个参数数据库连接。QueryRunner并非像名字中的query一样只能用于查询,QueryRunner提供的insert()方法不常用、不方便,插入也要用update()。
查询
1 //查询,结果集中只有一条记录的情况
2 String sql = "select * from student_tb where id=?"
;
3 BeanHandler<Student> studentBeanHandler =
new BeanHandler<>(Student.
class);
//<>中指定目标类型,()中指定目标类型的class
4 Student student = queryRunner.query(connection, sql, studentBeanHandler,1);
//执行查询,,返回的就是目标类型,不必强转
5 System.out.println(student);
//可通过getter()方法获取属性值(对应表中的字段值)
1 //查询,结果集中只有一条记录,直接获取某个字段的值
2 String sql = "select name from student_tb where id=?"
;
3 ScalarHandler<String> scalarHandler =
new ScalarHandler<>
();
4 String name = queryRunner.query(connection, sql, scalarHandler,1);
//获取的是某个字段的值
5 System.out.println(name);
使用BeanHandler封装为Bean,再使用getter()获取也行。
1 //查询,结果集中有多条记录的情况
2 String sql = "select * from student_tb"
;
3 BeanListHandler<Student> studentBeanListHandler =
new BeanListHandler<>(Student.
class);
//要用List
4 List<Student> list = queryRunner.query(connection, sql, studentBeanListHandler);
//返回值的类型是List<目标JavaBean>
5 //遍历这个list就是遍历结果集
增、删、改
1 //插入
2 String sql = "insert into student_tb (name,age,score) values (?,?,?)"
;
3 //queryRunner.update(connection, sql, "曹操",20,90); //返回值是int,受影响的记录数
4 Object[] values = {"曹操",20,90
};
5 queryRunner.update(connection, sql,values );
//?部分的参数值也可以写成数组形式
增、删、改的用法都差不多,不再一一列举。
批量操作
语法:QueryRunner对象.batch(数据库连接,sql语句,Object[][]) ;
最后一个参数是二维数组,一行对应一个sql语句?部分的参数值。
如果使用的是连接池,可缺省第一个参数数据库连接。
1 //批量插入
2 String sql = "insert into student_tb (name,age,score) values (?,?,?)"
;
3 Object[][] values = {{"曹操", 20, 90}, {"刘备", 20, 90}, {"孙权", 18, 88
}};
4 queryRunner.batch(connection, sql,values);
//批量执行,返回的是int[],一个值对应一个sql语句影响的记录数
DbUtils的批量操作是批量执行相似的sql语句(只有?部分的值不同)。
使用数据源
1 //从properties文件中加载数据源配置
2 Properties properties =
new Properties();
3 InputStream fis = Class.forName("test.Test").getResourceAsStream("/mysqlDataSource.properties"
);
4 properties.load(fis);
5 //String driver = properties.getProperty("driver"); //不必使用driver
6 String url = properties.getProperty("url"
);
7 String user = properties.getProperty("user"
);
8 String password = properties.getProperty("password"
);
9
10 //配置数据源
11 MysqlDataSource dataSource=
new MysqlDataSource();
12 dataSource.setURL(url);
13 dataSource.setUser(user);
14 dataSource.setPassword(password);
15
16 //DbUtils.loadDriver(driver); //数据库驱动提供的数据源自带驱动,不用再加载驱动
17 QueryRunner queryRunner =
new QueryRunner(dataSource);
//需传入一个数据源,操作数据库时会自动获取连接,不必手动获取连接
18 String sql = "insert into student_tb (name,age,score) values (?,?,?)"
;
19 queryRunner.update(sql,"曹操", 20, 90);
//不必传入连接,会自动从数据源获取连接
不必手动获取连接、关闭连接,很方便。
数据库驱动自带的数据源、C3P0、DBCP的操作方式差不多,此处不再一一写出。
Hibernate也是将结果集中的记录映射为实体对象,相比之下,DbUtils体积极小(只有一个jar包),没有hql一样复杂的操作,操作十分简便。
转载于:https://www.cnblogs.com/chy18883701161/p/11374640.html