示例

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

 package bean;

 public class Student {
private int id;
private String name;
private int age;
private int score; public Student() {
} public Student(int id, String name, int age, int score) {
this.id = id;
this.name = name;
this.age = age;
this.score = score;
} 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 int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public int getScore() {
return score;
} public void setScore(int score) {
this.score = score;
} @Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", score=" + score +
'}';
}
}

DbUtils将结果集中的记录映射到JavaBean中时,采用的方式和Spring的设值注入一样:先调用空参的构造器,再调用setter()方法进行初始化。

所以一定要有空参的构造器、setter()方法,要么不写构造器,调用默认的空参构造器;如果写了带参的构造器,就必须显示写空参的构造器。

4、新建测试类test.Test

 public class Test {
public static void main(String[] args) throws ClassNotFoundException, IOException, SQLException {
//从properties文件中加载数据库配置
Properties properties = new Properties();
InputStream fis = Class.forName("test.Test").getResourceAsStream("/mysql.properties");
properties.load(fis);
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
String user = properties.getProperty("user");
String password = properties.getProperty("password"); DbUtils.loadDriver(driver); //静态方法加载驱动
Connection connection = DriverManager.getConnection(url, user, password); //获取连接
QueryRunner queryRunner = new QueryRunner(); //创建QueryRunner对象,增删查改都要通过QueryRunner对象来完成 //查询
String sql = "select * from student_tb where id=?";
BeanHandler<Student> studentBeanHandler = new BeanHandler<>(Student.class); //结果集处理器,将结果集中的记录映射到指定的类中
Student student = queryRunner.query(connection, sql, studentBeanHandler, 1); //执行查询,将结果集中的记录映射到JavaBean中,返回的就是目标类型,不必强转
System.out.println(student); //可通过getter()方法获取属性值(对应表中的字段值) DbUtils.close(connection); //静态方法关闭连接
}
}

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()。

查询

 //查询,结果集中只有一条记录的情况
String sql = "select * from student_tb where id=?";
BeanHandler<Student> studentBeanHandler = new BeanHandler<>(Student.class); //<>中指定目标类型,()中指定目标类型的class
Student student = queryRunner.query(connection, sql, studentBeanHandler,1); //执行查询,,返回的就是目标类型,不必强转
System.out.println(student); //可通过getter()方法获取属性值(对应表中的字段值)
 //查询,结果集中只有一条记录,直接获取某个字段的值
String sql = "select name from student_tb where id=?";
ScalarHandler<String> scalarHandler = new ScalarHandler<>();
String name = queryRunner.query(connection, sql, scalarHandler,1); //获取的是某个字段的值
System.out.println(name);

使用BeanHandler封装为Bean,再使用getter()获取也行。

 //查询,结果集中有多条记录的情况
String sql = "select * from student_tb";
BeanListHandler<Student> studentBeanListHandler = new BeanListHandler<>(Student.class); //要用List
List<Student> list = queryRunner.query(connection, sql, studentBeanListHandler); //返回值的类型是List<目标JavaBean>
//遍历这个list就是遍历结果集

增、删、改

   //插入
String sql = "insert into student_tb (name,age,score) values (?,?,?)";
//queryRunner.update(connection, sql, "曹操",20,90); //返回值是int,受影响的记录数
Object[] values = {"曹操",20,90};
queryRunner.update(connection, sql,values ); //?部分的参数值也可以写成数组形式

增、删、改的用法都差不多,不再一一列举。

批量操作

语法:QueryRunner对象.batch(数据库连接,sql语句,Object[][]) ;

最后一个参数是二维数组,一行对应一个sql语句?部分的参数值。

如果使用的是连接池,可缺省第一个参数数据库连接。

 //批量插入
String sql = "insert into student_tb (name,age,score) values (?,?,?)";
Object[][] values = {{"曹操", 20, 90}, {"刘备", 20, 90}, {"孙权", 18, 88}};
queryRunner.batch(connection, sql,values); //批量执行,返回的是int[],一个值对应一个sql语句影响的记录数

DbUtils的批量操作是批量执行相似的sql语句(只有?部分的值不同)。

使用数据源

 //从properties文件中加载数据源配置
Properties properties = new Properties();
InputStream fis = Class.forName("test.Test").getResourceAsStream("/mysqlDataSource.properties");
properties.load(fis);
//String driver = properties.getProperty("driver"); //不必使用driver
String url = properties.getProperty("url");
String user = properties.getProperty("user");
String password = properties.getProperty("password"); //配置数据源
MysqlDataSource dataSource=new MysqlDataSource();
dataSource.setURL(url);
dataSource.setUser(user);
dataSource.setPassword(password); //DbUtils.loadDriver(driver); //数据库驱动提供的数据源自带驱动,不用再加载驱动
QueryRunner queryRunner = new QueryRunner(dataSource); //需传入一个数据源,操作数据库时会自动获取连接,不必手动获取连接
String sql = "insert into student_tb (name,age,score) values (?,?,?)";
queryRunner.update(sql,"曹操", 20, 90); //不必传入连接,会自动从数据源获取连接

不必手动获取连接、关闭连接,很方便。

数据库驱动自带的数据源、C3P0、DBCP的操作方式差不多,此处不再一一写出。

Hibernate也是将结果集中的记录映射为实体对象,相比之下,DbUtils体积极小(只有一个jar包),没有hql一样复杂的操作,操作十分简便。

Java DbUtils 操作数据库的更多相关文章

  1. Java程序操作数据库SQLserver详解

    数据库基本操作:增删改查(CRUD) crud介绍(增.删.改.查操作) CRUD是指在做计算处理时的增加(Create).查询(Retrieve)(重新得到数据).更新(Update)和删除(Del ...

  2. java jdbc操作数据库通用代码

    1.准备工作 1> 新建一个配置文件,名为jdbc.properties将其放入src中 2>在项目中导入jdbc驱动,注意连接不同的数据库,所用到的驱动是不一样的,这些在网上都能找到 具 ...

  3. java连接操作数据库

    Connection 类prepareStatement(String sql) 创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库. PreparedState ...

  4. Java jdbc 操作数据库详解

    原文地址https://www.cnblogs.com/huguodong/p/5910859.html JDBC(Java Data Base Connectivity,java数据库连接)是一种用 ...

  5. 07_数据库创建,添加c3p0操作所需的jar包,编写c3p0-config.xml文件,编写User.java,编写jdbcUtils.java实现操作数据库的模板工具类,UserDao编写,Dao

     1  创建day14数据库,创建user.sql表: A 创建数据库 day14 B 创建数据表 users create table users ( id int primary keyaut ...

  6. java dbutils查询数据库时无法给部分字段赋值原因

    1,javaBean如下: public class User {        /**     * 用户唯一标识(ID)     */    private String uid;    /**   ...

  7. Java Web的数据库操作(一)

    一.JDBC技术 1.JDBC简介 JDBC是Java程序与数据库系统通信的标准API,它定义在JDK的API中,通过JDBC技术,Java程序可以非常方便地与各种数据库交互,JDBC在Java程序与 ...

  8. servlet操作数据库

    工具:myeclipse 数据库工具:mysql java ee操作数据库,首先要导入数据库驱动文件,我用的是mysql 刚开始,很多人代码正确但是就是连接不上,原因就是忘了驱动文件的导入. 我的驱动 ...

  9. serlvet操作数据库

    工具:eclipse 数据库工具:mysql java ee操作数据库,首先要导入数据库驱动文件,我用的是mysql 刚开始,很多人代码正确但是就是连接不上,原因就是忘了驱动文件的导入. 我的驱动文件 ...

随机推荐

  1. 开始Golang之旅了

  2. 07_LACP负载分担(数通华为)

    1. 网络拓扑 2. SW1配置:[SW1]vlan batch 10 20[SW1]interface GigabitEthernet 0/0/1[SW1-GigabitEthernet0/0/1] ...

  3. Vue 实现点击展开收起

    Vue 展开收起功能实现 之前写项目的时候提到了一个需求 展开/收起 所有内容的需求 .因之前一值是重构,自己写功能还是比较少的,于是网上搜了一下,发现很多东西其实是jq的功能 虽然可以拿过来用,但是 ...

  4. 解决栏登 F~~~秋~~~之后只有火狐能上网的问题

    我发现F~~~完秋~~~只有火狐可以上网,惊了,后来发现是没有关代理服雾气 1.打开Chrome->设置 2.翻到最后点击显示高级设置 3.找到网络标签,点击更改代理服务器按钮 4.点击连接标签 ...

  5. 洛谷p3353在你窗外闪耀的星星题解

    题目 首先被题目甜到了 本来搜标签搜的线段树,结果发现这题目很吸引我我果断点开 觉得前缀和就能A啊 于是乎 要注意 窗户旁边是可以看到的 所以前缀和的时候是不用再-1的 //前缀和 //注意坑点 // ...

  6. ML学习笔记(1)

    2019/03/09 16:16 归一化方法: 简单放缩(线性归一化):这种归一化方法比较适用在数值比较集中的情况.这种方法有个缺陷,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用 ...

  7. 常用STL使用指北

    常用STL使用指北 set和multiset set和multiset都是基于红黑树(显然是一个二叉搜索树)的STL. 定义 我们可以使用(multi)set<元素类型>名称来定义一个(m ...

  8. 微信公众平台开发(150)——从新浪云SAE上传图片到图文消息

    从新浪云SAE上传图片到图文消息,只能用于图文消息中, 没有个数限制 if (!empty($_FILES['qrcode']['name'])){ $filename = time()." ...

  9. 【IntelliJ IDEA学习之五】IntelliJ IDEA 搭建项目

    版本:IntelliJIDEA2018.1.4 一.同一窗口展示多个应用(弊端:耗内存) idea没有eclipse workspace的概念,如果想在同一窗口显示多个应用,可以按照如下方式来做:1. ...

  10. github打开慢,甚至打不开,怎么办,解决方案方法

    有人使用github后,在某些网络下发现打开慢,甚至打不开,这都是因为他是国外站:目前互联网的连接机制导致超过一定的路由节点的连接就会出现这个问题,解决办法就是直接告诉本机ip.不要先层层询问域名转i ...