Java DbUtils 操作数据库

2019-08-26 06:01:14来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

Java DbUtils 操作数据库

 

示例

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是一个接口,查询时处理结果集要用到这个,用来将结果集中的记录映射到指定的实体类中(JavaBean)。

BaseResultSetHandler是一个抽象类,implements  ResultSethandler。要创建结果集处理器的实例,这2个都不能直接创建实例。

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 * 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
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:【JVM从小白学成大佬】2.Java虚拟机运行时数据区

下一篇:从零写一个编译器(七):语义分析之符号表的数据结构