java mysql dbutils_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 packagebean;2

3 public classStudent {4 private intid;5 privateString name;6 private intage;7 private intscore;8

9 publicStudent() {10 }11

12 public Student(int id, String name, int age, intscore) {13 this.id =id;14 this.name =name;15 this.age =age;16 this.score =score;17 }18

19 public intgetId() {20 returnid;21 }22

23 public void setId(intid) {24 this.id =id;25 }26

27 publicString getName() {28 returnname;29 }30

31 public voidsetName(String name) {32 this.name =name;33 }34

35 public intgetAge() {36 returnage;37 }38

39 public void setAge(intage) {40 this.age =age;41 }42

43 public intgetScore() {44 returnscore;45 }46

47 public void setScore(intscore) {48 this.score =score;49 }50

51 @Override52 publicString 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 classTest {2 public static void main(String[] args) throwsClassNotFoundException, IOException, SQLException {3 //从properties文件中加载数据库配置

4 Properties properties = newProperties();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 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 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 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 studentBeanListHandler = new BeanListHandler<>(Student.class); //要用List

4 List list = queryRunner.query(connection, sql, studentBeanListHandler); //返回值的类型是List5 //遍历这个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 = newProperties();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=newMysqlDataSource();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一样复杂的操作,操作十分简便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值