Java DbUtils 操作数据库
2019/08/19 12:58:17 来源:Linux社区 作者:chy18883701161

示例

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

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

BaseResultSetHandler有3个子类:

增删查改都是通过QueryRunner对象来实现的:

说明:

查询

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语句(只有?部分的值不同)。

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

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址https://www.linuxidc.com/Linux/2019-08/160214.htm


6

本栏最新