一、DBCP:Apache推出的 DataBase Connection Pool
使用步骤:1>复制jar文件到工程目录下 commons-dbcp-1.4.jar
2>添加属性资源文件dbconfig.properties
3>编写数据源,对DBCP进行封装
public class DBCPUtils { //dbcp内部有一个数据源 //数据源又被成为连接池 private static DataSource dataSource = null; static{ Properties properties = new Properties(); try { //静态代码块,类加载器classloader它加载类文件时,就会运行类的静态代码块 //利用类加载器,将加载一个资源文件dbcpconfig.properties文 //把资源文件的键值放入到properties中 properties.load(DBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties")); //使用工厂创建一个数据源 dataSource = BasicDataSourceFactory.createDataSource(properties); } catch (Exception e) { e.printStackTrace(); } } //连接方法 public static Connection getConnection(){ try { return dataSource.getConnection(); } catch (SQLException e) { throw new RuntimeException("服务器繁忙,请稍后再试"); } } //关流 public static void closeAll(PreparedStatement ps,Connection conn) { if(ps!=null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } //关流 public static void closeAll(ResultSet rs,PreparedStatement ps,Connection conn) { if(rs!=null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(ps!=null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
//测试类 public class Test { public static void main(String[] args) { Connection conn = null; conn = DBCPUtils.getConnection(); PreparedStatement ps = null; ResultSet rs=null; String sql="select * from tb_user where id =?"; try { ps= conn.prepareStatement(sql); ps.setInt(1, 1); rs=ps.executeQuery(); if(rs.next()){ System.out.println(rs.getString("username")); } } catch (SQLException e) { e.printStackTrace(); }finally{ DBCPUtils.closeAll(rs, ps, conn); } } }
二、C3P0:源于开元社区
区别:配置文件类型不一样
dbcp:properties
c3p0:xml
//对C3P0进行封装 public class C3P0Utils { //连接池对象 private static DataSource dataSource = new ComboPooledDataSource(); //不用写静态代码块 public static Connection getConnection(){ try { return dataSource.getConnection(); } catch (SQLException e) { throw new RuntimeException("服务器繁忙,请稍后再试"); } } //封装一个访问内部连接池的方法,为后期使用dbutils时方便使用 public static DataSource getDataSource(){ return dataSource; } public static void closeAll(PreparedStatement ps,Connection conn) { if(ps!=null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void closeAll(ResultSet rs,PreparedStatement ps,Connection conn) { if(rs!=null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } closeAll(ps,conn); } }
//测试类 public class Test { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs=null; //获取数据源 conn = C3P0Utils.getConnection(); String sql="select * from tb_user where id =?"; try { ps= conn.prepareStatement(sql); ps.setInt(1, 1); rs=ps.executeQuery(); if(rs.next()){ System.out.println(rs.getString("username")); } } catch (SQLException e) { e.printStackTrace(); }finally{ C3P0Utils.closeAll(rs, ps, conn); } } }
三、DBUtils数据库操作工具集
DBUtils也是Apache出品,用于操作数据库的增删查改
一般来说DBUtils要配合一款数据库连接池使用,使用c3p0做叙述
1>运行sql语句需要用到QueryRunner对象
2>方法中有query方法和update方法
3>查询结果用ResultSetBandler来实现
这里的C3P0使用二中的C3P0Utils
//测试类DBUtils public class TestDBUtils { public static void main(String[] args) throws Exception { test(); } public static void test() throws Exception{ //创建dbutils例子 //创建queryrunner对象,参数是一个数据源 QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql="select * from user"; //1 //queryrunner的query方法的第二个参数resultsethander对象需要一个泛型 //这个泛型就是resultsethander返回值得类型 //resultsethander的handle方法的返回值会交给queryrunner的query方法,作为返回值返回 /*String result = qr.query(sql,new ResultSetHandler<String>(){ @Override public String handle(ResultSet rs) throws SQLException { if(rs.next()){ return rs.getString("password"); }else{ return null; } } }); System.out.println(result);*/ //2 //User user =qr.query(sql, new UserResultSetHandle()); //System.out.println(user); //3 //User user = qr.query(sql,new BeanResultSetHandle<User>(User.class)); //System.out.println(user); //4 Map<String,Object> map = qr.query(sql, new MapHander()); System.out.println(map); } static class UserResultSetHandle implements ResultSetHandler<User>{ @Override public User handle(ResultSet rs) throws SQLException { if(rs.next()){ User user = new User(); user.setId(rs.getInt("id")); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); return user; } return null; } } static class BeanResultSetHandle<T> implements ResultSetHandler<T>{ private Class<T> clazz = null; public BeanResultSetHandle(Class<T> clazz){ this.clazz = clazz; } @Override public T handle(ResultSet rs) throws SQLException { try { if(rs.next()){ T object = clazz.newInstance(); Field [] fields =clazz.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { fields[i].setAccessible(true); fields[i].set(object, rs.getObject(fields[i].getName())); } return object; } } catch (Exception e) { e.printStackTrace(); } return null; } } static class MapHander implements ResultSetHandler<Map<String,Object>> { @Override public Map<String, Object> handle(ResultSet rs) throws SQLException { if(rs.next()){ Map<String,Object> map =new HashMap<String,Object>(); for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) { String key= rs.getMetaData().getColumnName(i+1); Object value =rs.getObject(i+1); map.put(key, value); } return map; } return null; } } }
将要查询的数据进行封装,不再一一实现
public class TestResultSetHander { //1、Arrayhander,适合取一条记录 public static void test1() throws SQLException{ QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql= "select id,username,password from user where id=? and username=?"; Object [] arr=qr.query(sql, new ArrayHandler(), 2,"李四"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+","); } } //2、ArrayListHander,适合取出多条记录 //每一条记录都是Object[],再将Object存入list中 public static void test2() throws SQLException{ QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql="select * from user"; List<Object[]> list =qr.query(sql, new ArrayListHandler()); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); for (int j = 0; j < list.get(i).length; j++) { System.out.print(list.get(i)[j]+","); } System.out.println(); } } //3、columnListHander取一列数据 public static void test3() throws SQLException{ QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql="select * from user"; //ColumnListHander构造方法可以传入一个int值,如果不传入,默认是1 //这个值表示的是结果集列的序号,列的序号从1开始, List<Object> list = qr.query(sql, new ColumnListHandler(2)); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } //4、MapHander取一条记录,将记录放入Map集合中 public static void test4() throws SQLException{ QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql= "select * from user where id =? "; Map<String, Object> map =qr.query(sql, new MapHandler(),2); System.out.println(map); for (Map.Entry<String,Object> m: map.entrySet()) { System.out.println(m.getKey()+"--"+m.getValue()); } } //5、keyedhander //取出一个查询集合,返回一个map的map,每一条记录封装到map中,每一字段又在map里面的map中 //Map<Object,Map<String,Object>> public static void test5() throws SQLException{ QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql= "select * from user"; Map<Object,Map<String,Object>> map =qr.query(sql, new KeyedHandler(3)); for (Map.Entry<Object,Map<String,Object>> m: map.entrySet()) { System.out.print(m.getKey()+":"); for(Map.Entry<String, Object> mm:m.getValue().entrySet()){ System.out.print(mm.getKey()+":"+mm.getValue()); } System.out.println(); System.out.println("-----"); } } //6、MapListHandler //List<Map<String,Object>> //每一行都是一个Map,再讲Map放入List中 public static void test6() throws SQLException{ QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql= "select * from user"; List<Map<String,Object>> list =qr.query(sql, new MapListHandler()); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); for(Map.Entry<String,Object> m :list.get(i).entrySet()){ System.out.println(m.getKey()+"--"+m.getValue()); } System.out.println("------"); } } //7、scalarhandler取单行单列,***加强记忆 //比如:比如说求count()* public static void test7() throws SQLException{ QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); //String sql = "select count(*),count(*)+1,count(*)+2,count(*)+3,count(*)+4 from user "; String sql = "select count(*) from user"; Object object =qr.query(sql, new ScalarHandler()); //******当查询count()的时候,返回的是一个long型 //当转为integer和int时会报classcastexception //拿到的object,只能换成long //Long转为long为拆箱 //long转为int为基本数据的类型转换,造成精度损失 //Long转为Integer类转化异常 System.out.println(object); } //8、beanhander public static void test8() throws SQLException{ QueryRunner qr = new QueryRunner(); String sql = "select * from user where id = ?"; User user = qr.query(sql, new BeanHandler<User>(User.class),3); System.out.println(user); } public static void main(String[] args) throws SQLException { test1(); } //增删改 public static void testInsert() throws SQLException{ QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql = "insert into user values(?,?,?)"; int rs =qr.update(sql,4,"maliu","12345"); if(rs>0){ System.out.println("数据添加成功"); } } public static void testUpdate() throws SQLException{ QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql = "update user set password =? where id=?"; int rs =qr.update(sql,"maliu",4); if(rs>0){ System.out.println("数据修改成功"); } } public static void testDelete() throws SQLException{ QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql = "delete from user where id =?"; int rs =qr.update(sql,4); if(rs>0){ System.out.println("数据删除成功"); } } }
User实体类
public class User { private int id ; private String username; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", password=" + password + "]"; } }
c3p0-config.xml 配置文件,存放在src目录下
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8</property> <property name="user">root</property> <property name="password">dang</property> <property name="checkoutTimeout">30000</property> <property name="idleConnectionTestPeriod">30</property> <property name="initialPoolSize">10</property> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> </default-config> </c3p0-config>
//使用c3p0做1-100加的总和,每次睡眠1秒,且程序中途终止,再次运行不影响结果 public class Excise1 { public static void main(String[] args) throws SQLException { Object arr[]= task(); int id =(int)arr[0]+1; int sum=(int)arr[1]; for (int i=id;i <=100; i++) { sum+=i; update(i,sum); System.out.println(i+"------"+sum); } } //作业 public static Object [] task() throws SQLException{ QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql ="select * from tb_task"; Object arr [] =qr.query(sql, new ArrayHandler()); return arr; } public static void update(int i,int sum) throws SQLException{ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql ="update tb_task set id=?,sum=?"; int r =qr.update(sql,i,sum); } }
//自己实现ResultSetHandler,查询所有的数据并存入list中返回
public class Excise2 { public static void main(String[] args) { try { test(); } catch (SQLException e) { e.printStackTrace(); } } public static void test() throws SQLException{ QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql="select * from user"; List<User> list =(List) qr.query(sql, new BeanListHandler<User>(User.class)); for (Object object : list) { System.out.println(object); } } static class BeanListHandler<T> implements ResultSetHandler<List<T>>{ private Class <T> cls= null; public BeanListHandler(Class<T> clazz) { this.cls = clazz; } @Override public List<T> handle(ResultSet rs) { List<T> list = new ArrayList<T>(); Field [] fields =cls.getDeclaredFields(); try { for(;rs.next();){ //创建由此类对象表示的类的新实例。 该类被实例化为一个具有空参数列表的new表达式。 如果类尚未初始化,则初始化该类。 T object = null; try { object = cls.newInstance(); } catch (Exception e) { e.printStackTrace(); } for (int i = 0; i < fields.length; i++) { fields[i].setAccessible(true); String colName=fields[i].getName(); try { fields[i].set(object, rs.getObject(colName)); } catch (Exception e) { e.printStackTrace(); } } list.add(object); } } catch (SecurityException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return list; } } }