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里


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方法,永远返回当前线程放入的数据。线程局部变量


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

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

 

相关文章