Java DbUtils 操作数据库
2019-08-26 06:01:14来源:博客园 阅读 ()
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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash