Java 之数据库连接池DBCP、C3P0、DBUtils工具类QueryRunner类和ResultSetHander接口

一、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;
		}
		
	}
}






    

猜你喜欢

转载自blog.csdn.net/qq_41813207/article/details/80229992