数据库连接池:dbcp和c3p0,以及数据库操作框架Dbutils

12 篇文章 0 订阅
3 篇文章 0 订阅

前提:创建数据库表

CREATE DATABASE test
USE `test`;
CREATE TABLE `user` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  `age` int(10) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
insert  into `user`(`id`,`name`,`age`,`birthday`) values (1,'zfx',24,'1991-03-24'),(2,'zjy',23,'1992-06-28');



(1),dbcp连接池

1,commons-dbcp-1.4.jar         dbcp的jar包,主要用来创建连接放到池中

     commons-pool-1.5.6.jar    dbcp依赖包

    mysql-connector-java-5.1.5-bin.jar        连接mysql数据库的


2,dbcp连接池的连个核心类

       BasicDataSource - 此实现了javax.sql.DataSource接口。

       BasicDataSourceFactory– 工厂类,通过读取一个资源文件,创建一个dataSource。


3,将连接用的信息,放到dbcp.properties文件中去

driverClassName=com.mysql.jdbc.Driver
username=root
password=root
url=jdbc:mysql:///test?characterEncoding=UTF8
maxActive=2

4,创建一个工具类,用来维护唯一的连接池dataSource

/**
 * 
 * @author zfx
 * 静态工具类
 *
 */
public class DbcpDataSourceUtils {
	//创建一个静态的dataSource
	private static DataSource dataSource ;
	//在静态代码块中给dataSource设置值初始化
	static{
		Properties p = new Properties();
		try {
			p.load(DbcpDataSourceUtils.class.getClassLoader().getResourceAsStream("cn/zfx/demo6/DSpool/dbcp.properties"));
			// 在dbcp中有一个工工厂类可以通读取一个资源文件创建一个dataSource,
			//会自动读取properties中设置的值
			dataSource = BasicDataSourceFactory.createDataSource(p);
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
	
	//获取整个连接池的静态方法
	public static DataSource getDs(){
		return dataSource ;
	}
	
	//获取connection的静态方法
	public static Connection getConn(){
		Connection conn = null ;
		try {
			conn = dataSource.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return  conn ;
	}

5,测试dbcp连接池

/**
	 * 从dbcp连接池中获取连接并查询数据库
	 */
	@Test
	public void testDbcp(){
		//1:获取连接
		Connection conn = DbcpDataSourceUtils.getConn();
		try {
			//2:获取数据操作对象
			Statement statement = conn.createStatement();
			//3:执行
			ResultSet resultSet = statement.executeQuery("select *  from user");
			//4:遍历封装
			while(resultSet.next()){
				System.out.println(resultSet.getInt("id"));
				System.out.println(resultSet.getString("name"));
				System.out.println(resultSet.getInt("age"));
				System.out.println(resultSet.getDate("birthday"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

(2),c3p0连接池

1,c3p0-0.9.1.2.jar     c3p0 的jar

2,数据库连接池的静态工具类

/**
 * @author zfx
 * 静态工具类
 */
public class C3p0DataSourceUtils {

	private static ComboPooledDataSource dataSource = new ComboPooledDataSource()  ;
	static{
		Properties p = new Properties();
		try {
			p.load(C3p0DataSourceUtils.class.getClassLoader().getResourceAsStream("cn/zfx/demo6/DSpool/dbcp.properties"));
			dataSource.setDriverClass(p.getProperty("driverClassName"));
			dataSource.setJdbcUrl(p.getProperty("url"));
			dataSource.setUser(p.getProperty("username"));
			dataSource.setPassword(p.getProperty("password"));
			dataSource.setMaxPoolSize(Integer.parseInt(p.getProperty("maxActive")));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//获取连接池方法
	public static DataSource getDs(){
		return dataSource;
	}
	
	///获取connection连接方法
	public static Connection getconnnection(){
		Connection connection = null;
		try {
			connection = dataSource.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return connection;
	}

3,测试工具类

        @Test
 	public void testC3p0(){
		Connection connection = null;
		connection = C3p0DataSourceUtils.getconnnection();
		try {
			Statement statement = connection.createStatement();
			ResultSet resultSet = statement.executeQuery("select *  from user");
			while(resultSet.next()){
				System.out.println(resultSet.getInt("id"));
				System.out.println(resultSet.getString("name"));
				System.out.println(resultSet.getInt("age"));
				System.out.println(resultSet.getDate("birthday"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

(3),Dbutils学习

1,commons-dbutils-1.4.jar


2,Dbutils核心

       Dbutils有两个核心类: -

       QueryRunner– 此类可以执行所有sql语句 。insert ,update,datete,select,create

               实例方法为:

               QueryRunner run = newQueryRunner(Datasource) ; 从dbcp中获取DataSource

               Run.query() – 用于执行select语句。

               Run.update() 用于执行所有有非selecet 方法.

   ResultSetHandler– 执行结果的封装句柄。回调函数。

               此句柄只用于run.query(sql,handler)方法中,用于封装查询的结果。且这种封装自动的。

3,测试方法

@Test
	public void test(){
		QueryRunner runner = new QueryRunner(C3p0DataSourceUtils.getDs());
		String sql = "select *  from user";
		try {
			/**
			 * BeanListHandler ,将查询的结果封装到指定的泛型bean中,然后再封装到list中
			 */
			List<User> userList = runner.query(sql, new BeanListHandler<>(User.class));
			for(User user : userList){
				System.out.println(user);
			}
			/**
			 * ArrayHandler , 将查询的结果封装成Object[] – 只返回第一行
			 */
			Object [] obj = runner.query(sql, new ArrayHandler());
			for(int i=0; i< obj.length; i++){
				System.out.println(obj[i]);
			}
			/**
			 * ArrayListHandler 查询多有行,将每一行封装成Object[]然后再放到list中去
			 */
			List<Object[]>  objList = runner.query(sql, new ArrayListHandler());
			for(Object [] o : objList){
				for(int q=0;q<o.length; q++){
					System.out.println(o[q]);
				}
			}
			/**
			 * BeanHandler 只查询查询到的第一行,将结果封装成Bean
			 * 要求javaBeean的属性与列名相同
			 */
			User user = runner.query(sql, new BeanHandler<>(User.class));
			/**
			 * BeanListHandler 将查询到的所有Bean放到List
			 */
			List<User> userLists = runner.query(sql,new BeanListHandler<User>(User.class));
			
			/**
			 * ColumnListHandler 只查询某一个字段:将这个字段放到List<Object>
			 */
			List<Object> users = runner.query(sql, new ColumnListHandler(2));
			for(Object ob :users){
				System.out.println(ob);
			}
			/**
			 *  KeyedHandler 以某外列,为key值,保存到Map,中Map<String,Object>
			 */
			Map<Object,Map<String,Object>> map = runner.query(sql,new KeyedHandler("id"));
			
			/**
			 * MapHandler 将查询到的第一行,封装到一个map,与BeanHandler类似
			 */

			Map m = runner.query(sql, new MapHandler());
			
			/**
			 * MapListHandler 所有结果封装成List<Map> BeanListHander类似
			 */
			List<Map<String,Object>> maps = runner.query(sql, new MapListHandler());
			
			/**
			 *  ScalarHandler 用于查询聚合函数时使用:用于count
			 */
			Object count = runner.query("select round(avg(age),2) from user",new ScalarHandler());
			System.out.println(count);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值