DBUtils介绍

1.作用

  1)DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
  2)DBUtils封装了对JDBC的操作,简化了JDBC操作。可以少写代码。
    a.对于数据表的读操作,他可以把结果转换成List,Array,Set等java集合,便于程序员操作;
    b.对于数据表的写操作,也变得很简单(只需写sql语句)
    c.可以使用数据源,使用JNDI,数据库连接池等技术来优化性能--重用已经构建好的数据库连接对象

2.DBUtils的三个核心对象

  1)QueryRunner类:用来进行增删改查
    常用的方法:
      (1)query():用于执行select
      (2)update():用于执行insert/update/delete
      (3)batch():用于进行批处理
  2)ResultSetHandler接口:用来处理结果集
  3)DBUtils类:工具类:定义关闭资源和事务处理的方法

3.DBUtils入门 步骤:

  1)导入jar包
  2)创建QueryRunner对象
  3)使用query方法执行select
  4)使用ResultSetHandler封装结果集
  5)使用DBUTtils类释放资源

4.QueryRunner对象   

  (1)构造函数:
    1)new QueryRunner();
      它的事务可以手动控制。也就是说此对象调用的方法(如:query、update、batrch)参数中要有Connection对象。
    2)new QueryRunner(DataSource ds);
      它的事务是自动控制的。一个sql一个事务。此对象调用的方法(如:query、update、batrch)参数中无需Connection对象。
  (2)CRUD代码:

public class TestCRUD {
    @Test
    public void testSelect() throws SQLException {
        //创建一个QueryRunner对象
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        //执行查询语句并返回结果
        List<User> query = qr.query("select * from users", new BeanListHandler<User>(User.class));
        for(User user:query){
            System.out.println(user);
        }
    }
    @Test
    public void TestInsert() throws SQLException {
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        qr.update("insert into users(name,password,email,birthday) values(?,?,?,?)","tom","123","tom@163.com","1993-2-1");

    }

    @Test
    public void TestUpdate() throws SQLException {
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        qr.update("update users set name=?,password=? where id=?","marry","asd",11);

    }
    @Test
    public void TestDelete() throws SQLException {
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        qr.update("delete from users where id=?",9);

    }
    @Test
    public void TestBatch() throws SQLException {
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        Object[][] objects = new Object[10][];//高维数组代表执行的次数
        for (int i=0; i < objects.length;i++){
            objects[i] = new Object[]{"tom"+ i,"123","tom@163.com","1993-2-1"};
        }
        qr.batch("insert into users(name,password,email,birthday) values(?,?,?,?)", objects);

    }
}

 

 

5.ResultSetHandler

   ResultSetHandler下的所有结果处理器
  ArrayHandler:取1条记录。把该条记录的每列值封装到一个数组中Object[]
  ArrayListHandler:取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中
  ColumnListHandler:取某一列的数据。封装到List中。
  KeyedHandler:取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。
  MapHandler:取1条记录。把当前记录的列名和列值放到一个Map中
  MapListHandler:取多条记录。把每条记录封装到一个Map中,再把Map封装到List中
  ScalarHandler:取单行单列数据
  BeanHandler:把结果集转换为Bean
  BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里

DBUtils介绍
package day14.test;

import day14.bean.User;
import day14.utils.C3P0Util;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.*;
import org.junit.Test;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

public class TestResultSetHandler {
    @Test////ArrayHandler:适合取1条记录。把该条记录的每列值封装到一个数组中Object[]
    public void test1() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(C3P0Util.getDataSource());
        Object[] objects = queryRunner.query("select * from users where id=?", new ArrayHandler(), 10);
        for (Object o: objects) {
            System.out.println(o);
        }
    }
    @Test//ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],
        // 把数组封装到一个List中
    public void test2() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(C3P0Util.getDataSource());
        List<Object[]> list = queryRunner.query("select * from users", new ArrayListHandler());
        for(Object[] objects : list){
            for(Object o : objects){
                System.out.println(o);
            }
            System.out.println("===============");        }
    }
    @Test////ColumnListHandler:取某一列的数据。封装到List中。
    public void test3() throws SQLException {
        QueryRunner queryRunner = new QueryRunner(C3P0Util.getDataSource());
        List<Object> list = queryRunner.query("select name,password from users", new ColumnListHandler(1));
        for (Object o : list) {
            System.out.println(o);
        }
    }
    @Test//KeyedHandler:取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。
    public void test4() throws SQLException {
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        //大Map的key是表中的某列数据,小Map中的key是表的列名
        Map<Object, Map<String, Object>> map = qr.query("select * from users", new KeyedHandler(1));
        for(Map.Entry<Object, Map<String, Object>> map1 : map.entrySet()){
            for(Map.Entry<String,Object> m : map1.getValue().entrySet()){
                System.out.println(m.getKey()+"\t"+m.getValue());
            }
            System.out.println("==========================");
        }
    }
    @Test////MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
    public void test5() throws SQLException {
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        Map<String, Object> map = qr.query("select * from users", new MapHandler());
        for(Map.Entry<String,Object> m : map.entrySet()){
            System.out.println(m.getKey()+"\t"+m.getValue());
        }
    }
    @Test////MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中
    public void test6() throws SQLException {
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        List<Map<String, Object>> list = qr.query("select * from users", new MapListHandler());
        for (Map<String, Object> map : list) {
            for (Map.Entry<String, Object> m : map.entrySet()) {
                System.out.println(m.getKey() + "\t" + m.getValue());
            }
            System.out.println("==============");
        }
    }
        @Test////ScalarHandler:适合取单行单列数据
        public void test7() throws SQLException {
            QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
            Object o = qr.query("select count(*) from users", new ScalarHandler(1));
            System.out.println(o);
    }
    @Test////BeanHandler
    public void test8() throws SQLException {
        QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());
        User user = qr.query("select * from users", new BeanHandler<User>(User.class));
        System.out.println(user);
    }

}
View Code

6.ThreadLocal

  调用该类的get方法,永远返回当前线程放入的数据。线程局部变量

DBUtils介绍
public class TestThreadLocal {
    public static void main(String[] args) {
        ThreadLocal tl = new ThreadLocal();
        tl.set("p");
        MyThread mt = new MyThread(tl);
        mt.start();
        System.out.println(tl.get());
    }
}
View Code DBUtils介绍
public class MyThread extends Thread{
    private final ThreadLocal tl;

    public MyThread(ThreadLocal tl){
        this.tl = tl;
    }
    @Override
    public void run() {
        System.out.println(tl.get()+"aaaa");
    }
}
View Code

 

上一篇:8、Flutter 实现 生成二维码


下一篇:Codeforces K. Ice Skating(求强连通分量)