1.C3P0连接池
* 创建C3P0连接池的工具类:我们可以使用工具类获取数据库连接对象conn
* 连接池的规范接口:javax.sql.DataSource 接口
* 接口中的获取连接的方法:Connection getConnection() 尝试建立与此 DataSource 对象所表示的数据源的连接。
*
* C3P0连接池实现了连接池的规范接口DataSource,重写了接口中获取连接的方法 getConnection
* com.mchange.v2.c3p0.ComboPooledDataSource implements DataSource接口
*
* C3P0连接池工具类的创建步骤:
* 1.在成员位置创建一个ComboPooledDataSource对象
* 2.创建一个静态代码块(只执行一次,提高效率)
* 使用ComboPooledDataSource中的setXXX方法,设置数据库的4大基本信息
* 注册驱动,url,用户名,密码
* 3.创建一个静态方法,方法中使用ComboPooledDataSource对象重写的getConnection获取数据库连接对象Connection并返回
* 4.创建一个静态方法,用于释放资源
或者:
* C3P0连接池工具类的创建步骤:
* 1.在成员位置创建一个ComboPooledDataSource对象
* 2.创建一个xml文件,名字必须叫c3p0-config.xml,放在src下边,里边的根元素和其它元素必须按照要求编写
* C3PO连接池,会自动解析c3p0-config文件,给ComboPooledDataSource赋4大基本信息的值
* 如果即使用了xml文件,有使用了静态代码块赋值,优先使用静态代码块
* 3.创建一个静态方法,方法中使用ComboPooledDataSource对象重写的getConnection获取数据库连接对象Connection并返回
* 4.创建一个静态方法,用于释放资源
1.1创建DBCPUtils工具类(C3P0Utils);
package cn.itcast.demo01.DBCPUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3P0Utils { //1.在成员位置创建一个ComboPooledDataSource对象 private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); //2.创建一个静态代码块(只执行一次,提高效率)(如果使用了xml文件,这步可以省略) static{ try { //使用ComboPooledDataSource中的setXXX方法,设置数据库的4大基本信息 //注册驱动,url,用户名,密码 dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/day05"); dataSource.setUser("root"); dataSource.setPassword("root"); } catch (Exception e) { System.out.println(e); } } //3.创建一个静态方法,方法中使用ComboPooledDataSource对象重写的getConnection获取数据库连接对象Connection并返回 public static Connection getConnection(){ try { //从连接池中获取数据库连接对象并返回 return dataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("数据库连接失败!"); } } //4.创建一个静态方法,用于释放资源 public static void close(ResultSet rs,Statement stat,Connection conn){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(stat!=null){ try { stat.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null){ try { conn.close();//注意close方法不是把连接关闭,而是把连接归还给连接池 } catch (SQLException e) { e.printStackTrace(); } } } }
1.2测试C3P0连接池工具类
package cn.itcast.demo02.test; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import cn.itcast.demo01.Utils.C3P0Utils; import cn.itcast.demo01.Utils.C3P0UtilsXML; /* * 测试C3P0连接池工具类 */ public class TestC3P0Utils { public static void main(String[] args) { test02(); } private static void test02() { Connection conn = null; Statement stat = null; ResultSet rs = null; try { //使用C3P0连接池工具类C3P0UtilsXML获取数据库连接对象 conn = C3P0UtilsXML.getConnection(); //System.out.println(conn); //获取执行者对象 stat = conn.createStatement(); //执行sql语句 String sql = "SELECT * FROM category"; rs = stat.executeQuery(sql); //处理结果集 while(rs.next()){ System.out.println(rs.getInt("cid")+"\t"+rs.getString("cname")); } } catch (Exception e) { System.out.println(e); }finally { //释放资源 使用DBCP连接池工具类C3P0UtilsXML中的方法 C3P0Utils.close(rs, stat, conn); } } private static void test01() { Connection conn = null; Statement stat = null; ResultSet rs = null; try { //使用C3P0连接池工具类C3P0Utils获取数据库连接对象 conn = C3P0Utils.getConnection(); //System.out.println(conn); //获取执行者对象 stat = conn.createStatement(); //执行sql语句 String sql = "SELECT * FROM category"; rs = stat.executeQuery(sql); //处理结果集 while(rs.next()){ System.out.println(rs.getInt("cid")+"\t"+rs.getString("cname")); } } catch (Exception e) { System.out.println(e); }finally { //释放资源 使用DBCP连接池工具类DBCPUtils中的方法 C3P0Utils.close(rs, stat, conn); } } }
2.DBCP连接池
* 创建DBCP连接池的工具类:我们可以使用工具类获取数据库连接对象conn
* 连接池的规范接口:javax.sql.DataSource 接口
* 接口中的获取连接的方法:Connection getConnection() 尝试建立与此 DataSource 对象所表示的数据源的连接。
*
* DBCP连接池实现了连接池的规范接口DataSource,重写了接口中获取连接的方法 getConnection
* org.apache.commons.dbcp.BasicDataSource
*
* DBCP连接池工具类的创建步骤:
* 1.在成员位置创建一个BasicDataSource对象
* 2.创建一个静态代码块(只执行一次,提高效率)
* 使用BasicDataSource中的setXXX方法,设置数据库的4大基本信息
* 注册驱动,url,用户名,密码
* 3.创建一个静态方法,方法中使用BasicDataSource对象重写的getConnection获取数据库连接对象Connection并返回
* 4.创建一个静态方法,用于释放资源
或者:
* DBCP连接池提供了一个工厂类
* org.apache.commons.dbcp.BasicDataSourceFactory
* 工厂类中提供了一个方法,用于创建BasicDataSource对象
* public static DataSource createDataSource(Properties properties)
*
* 实现步骤:
* 1.创建一个properties配置文件,使用键值对存储数据库的4大基本信息
* 2.在成员位置创建一个DataSource变量
* 3.创建一个静态代码块
* a.使用Properties集合+IO流读取配置文件,把配置文件的键值对保存到集合中
* b.使用连接池的工厂类BasicDataSourceFactory中的方法createDataSource,创建BasicDataSource连接池对象
* createDataSource方法会自动的从Properties集合中读取键值对,给BasicDataSource对象赋值
* 4.创建一个静态方法,用于返回数据库连接对象Connection
* 5.创建一个静态方法,用于释放资源
2.1创建DBCPUtils工具类(C3P0Utils);
package cn.itcast.demo01.DBCPUtils; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.apache.commons.dbcp.BasicDataSource; public class DBCPUtils { //1.在成员位置创建一个BasicDataSource对象 private static BasicDataSource dataSource = new BasicDataSource(); //2.创建一个静态代码块(只执行一次,提高效率)(如果使用了properties配置文件,这步可以省略) static{ //使用BasicDataSource中的setXXX方法,设置数据库的4大基本信息 //注册驱动,url,用户名,密码,必须设置 dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/day05"); dataSource.setUsername("root"); dataSource.setPassword("root"); //可选设置信息 dataSource.setInitialSize(10);//初始化连接数量 dataSource.setMaxActive(50);//最大连接数量 } //3.创建一个静态方法,方法中使用BasicDataSource对象重写的getConnection获取数据库连接对象Connection并返回 public static Connection getConnection(){ try { return dataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); /* * 数据库连接对象,如果获取失败了,那么程序就没有必须继续执行 * 把编译异常,转换为运行时异常 */ throw new RuntimeException("数据库连接失败!"); } } //4.创建一个静态方法,用于释放资源 public static void close(ResultSet rs,Statement stat,Connection conn){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(stat!=null){ try { stat.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null){ try { conn.close();//注意close方法不是把连接关闭,而是把连接归还给连接池 } catch (SQLException e) { e.printStackTrace(); } } } }
2.2 测试DBCP连接池工具类
package cn.itcast.demo02.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import cn.itcast.demo01.Utils.DBCPUtils; import cn.itcast.demo01.Utils.DBCPUtilsConfig; public class TestDBCPUtils { public static void main(String[] args) { test02(); } /* * 测试DBCPUtilsConfig */ private static void test02() { Connection conn = null; PreparedStatement pst = null; ResultSet rs = null; try { //使用DBCP连接池工具类DBCPUtilsConfig获取数据库连接对象 conn = DBCPUtilsConfig.getConnection(); //System.out.println(conn); //获取预编译的执行者对象 String sql = "SELECT * FROM category WHERE cid IN (?,?,?)"; pst = conn.prepareStatement(sql); //设置?占位符的实际参数 pst.setObject(1, 1); pst.setObject(2, 2); pst.setObject(3, 5); //执行sql语句,获取结果集 rs = pst.executeQuery(); //处理结果集 while(rs.next()){ System.out.println(rs.getInt("cid")+"\t"+rs.getString("cname")); } } catch (Exception e) { System.out.println(e); }finally { //释放资源 DBCPUtilsConfig.close(rs, pst, conn); } } /* * 测试DBCPUtils */ private static void test01() { Connection conn = null; Statement stat = null; ResultSet rs = null; try { //使用DBCP连接池工具类DBCPUtils获取数据库连接对象 conn = DBCPUtils.getConnection(); //System.out.println(conn); //获取执行者对象 stat = conn.createStatement(); //执行sql语句 String sql = "SELECT * FROM category"; rs = stat.executeQuery(sql); //处理结果集 while(rs.next()){ System.out.println(rs.getInt("cid")+"\t"+rs.getString("cname")); } } catch (Exception e) { System.out.println(e); }finally { //释放资源 使用DBCP连接池工具类DBCPUtils中的方法 DBCPUtils.close(rs, stat, conn); } } }
3.创建Javabean
package cn.itcast.demo03.domain; import java.io.Serializable; /* * 创建数据库表category的javabean类 * category表-->Category类 * 表中的字段(cid,cname)-->类中的成员变量 * 表中的行-->Category对象 * * javabean包含: * 1.私有的成员变量 * 2.公共的get/set方法 * 3.空参数构造方法 * 4.toString方法 * 5.实现序列化接口 */ public class Category implements Serializable { /** * 添加序列哈,防止序列化冲突异常 */ private static final long serialVersionUID = 1L; private int cid; private String cname; public Category() { super(); } public Category(int cid, String cname) { super(); this.cid = cid; this.cname = cname; } @Override public String toString() { return "Category [cid=" + cid + ", cname=" + cname + "]"; } public int getCid() { return cid; } public void setCid(int cid) { this.cid = cid; } public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } }