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