实现了javax.sql.DataSource的才是标准的数据库连接池,按照字面意思,一般称之为数据源。
对于一个已知类的某个方法进行功能上的改变有以下三种方式:
1、定义子类,扩展父类的某个功能。(此处行不通)
2、利用包装设计模式改写原有的类的功能
a、编写一个类实现与被改写类(com.mysql.jdbc.Connection)相同的接口
b、定义一个引用,记住被改写类的实例
c、定义构造方法,传入被改写类的实例
d、对于要改写的方法,改写即可
e、对于不需要改写的方法,调用原有的对象的对应方法
*****包装设计模式
*****默认适配器设计模式
3、动态代理
*****基于接口的动态代理
java.lang.reflect.Proxy
static Object newProxyInstance(ClassLoader loader, Class [] interfaces, InvocationHandler h)
作用:返回代理类的实例
参数:loader:类加载器,一般与被代理对象使用同一个
interfaces:被代理对象所实现的接口
h:怎么代理
Object invoke(Object proxy, Method method, Object[] args) :调用原有类的任何方法,都会经过此方
自己实现比较麻烦,这里还是使用开源的DBCP如下:
一.DBCP官网 下载jar包如下,并创建 数据库配置文件dbcpconfig.properties
一个是dbpc包,一个是pool包。导入构建路径。
二.创建DBCPUtil代替以前的JDBCUtil: package cn.itcast.util; import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; public class DBCPUtil {
private static DataSource ds;
static{
try {
InputStream in = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
Properties props = new Properties();
props.load(in);
ds = BasicDataSourceFactory.createDataSource(props);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
try {
return ds.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public static void release(ResultSet rs,Statement stmt,Connection conn){
if(rs!=null){
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
三.插u那个键操作数据库的文件DaoDemo package cn.itcast.dao.impl; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import org.junit.Test; import cn.itcast.util.DBCPUtil; public class DaoDemo {
@Test
public void add(){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try{
conn = DBCPUtil.getConnection();
System.out.println(conn.getClass().getName());
stmt = conn.prepareStatement("select * from account");
rs = stmt.executeQuery();
while(rs.next()){
System.out.println("-------");
System.out.print(rs.getObject("id"));
System.out.print(rs.getObject("name"));
System.out.print(rs.getObject("money"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
DBCPUtil.release(null, stmt, conn);
}
}
}
}