MySQL创建数据库连接池.docx
《MySQL创建数据库连接池.docx》由会员分享,可在线阅读,更多相关《MySQL创建数据库连接池.docx(8页珍藏版)》请在冰豆网上搜索。
![MySQL创建数据库连接池.docx](https://file1.bdocx.com/fileroot1/2022-10/29/331a7b84-b970-49de-9ab4-bcc53eb6e17c/331a7b84-b970-49de-9ab4-bcc53eb6e17c1.gif)
MySQL创建数据库连接池
C3P0数据源
介绍
c3p0是一个开源的jdbc连接池,我们熟悉的Hibernate和Sprint框架使用的都是该数据源
创建连接池对象
方法1:
直接创建对象,设置参数
ComboPooledDataSourcecpds=newComboPooledDataSource();
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:
mysql:
//localhost:
3306/jdbc3");
cpds.setUser("root");
cpds.setPassword("root");
cpds.setInitialPoolSize(5);
cpds.setMaxPoolSize(15);
方法2:
读取配置文件
ComboPooledDataSourcecpds=newComboPooledDataSource("itcast");
配置文件为c3p0-config.xml该文件需要放在类路径下
—-默认配置–->
5
15
com.mysql.jdbc.Driver
jdbc:
mysql:
//localhost:
3306/jdbc3
root
root
5
15
com.mysql.jdbc.Driver
jdbc:
mysql:
//localhost:
3306/jdbc3
root
root
三、ResultSetMetaData对象
元数据,可以理解为描述数据的数据
jdbc中的元数据是指数据库、表、列的定义信息
ResultSetMetaData对象表示结果集ResultSet对象的元数据
获得该对象:
ResultSetMetaDatametaData=rs.getMetaData();
常用方法:
getColumnCount() 返回resultset对象的列数
getColumnName(int column) 获得指定列的名称
getColumnTypeName(int column)获得指定列的类型
四、jdbc优化
使用jdbc对数据库进行crud操作时,会有很多重复的代码,仔细分析不难发现其实变化的只是其中几行代码
对于cud(增删改)操作,代码几乎完全一样,唯一的区别就是sql语句不同,我们完全可以把相同的代码抽取出来定义在一个工具方法中,然后定义一个参数来接收sql语句
对于r(查询)操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet结果集的处理也有所不相同,因此可义一个query方法,除以参数形式接收变化的SQL语句外,可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中
优化后的工具类JdbcUtils
// 通用的增删改方法
public static int update(Stringsql,Object[]params) throws SQLException{
Connectionconn=null;
PreparedStatementpstmt= null;
ResultSetrs= null;
try {
// 获得连接
conn=getConnection();
// 预编译sql
pstmt=conn.prepareStatement(sql);
// 将参数设置进去
for(int i=0; params!
=null&&i pstmt.setObject(i+1,params[i]);
}
// 发送sql
int num=pstmt.executeUpdate();
return num;
} finally {
// 释放资源
release(conn,pstmt,rs);
}
}
// 优化查询
public static Objectquery(Stringsql,Object[]params,ResultSetHandlerrsh) throws SQLException{
Connectionconn=null;
PreparedStatementpstmt= null;
ResultSetrs= null;
try {
// 获得连接
conn=getConnection();
// 预编译sql
pstmt=conn.prepareStatement(sql);
// 将参数设置进去
for(int i=0;params!
=null&&i pstmt.setObject(i+1,params[i]);
}
// 发送sql
rs=pstmt.executeQuery();
// 不知道别人想如何处理结果集
// 干脆想别人所要一个结果集的处理器
// 为了让当前代码继续,定义一个结果集处理器接口
// 策略模式,规定算法,具体的算法留给将来的调用者实现
Objectobj=rsh.handle(rs);
return obj;
} finally {
// 释放资源
release(conn,pstmt,rs);
}
}
结果集处理器接口
publicinterfaceResultSetHandler{
//处理结果集的方法
publicObjecthandle(ResultSetrs);
}
实现类:
BeanListHandler
publicclassBeanListHandlerimplementsResultSetHandler{
privateClassclazz;
publicBeanListHandler(Classclazz){
this.clazz=clazz;
}
publicObjecthandle(ResultSetrs){
try{
//取出结果集所有的记录,封装到bean,存入list返回
Listlist=newArrayList();
while(rs.next()){
Objectbean=clazz.newInstance();
//获得元数据
ResultSetMetaDatametaData=rs.getMetaData();
//获得列的数量
intcount=metaData.getColumnCount();
//遍历列
for(inti=1;i<=count;i++){
//取列名
StringcolumnName=metaData.getColumnName(i);
//取这列的值
Objectvalue=rs.getObject(columnName);
//反射出属性
Fieldfield=clazz.getDeclaredField(columnName);
//设置属性
field.setAccessible(true);
field.set(bean,value);
}
//加入list
list.add(bean);
}
returnlist;
}catch(Exceptione){
thrownewRuntimeException(e);
}
}
}
BeanHandler
publicclassBeanHandlerimplementsResultSetHandler{
privateClassclazz;
publicBeanHandler(Classclazz){
this.clazz=clazz;
}
publicObjecthandle(ResultSetrs){
//不知道有几列数据,不知道列名,不知道封装到什么样的bean
//表的列明和javabean的字段名一致
try{
if(rs.next()){
//创建bean
Objectbean=clazz.newInstance();
//封装数据
//获得结果集的元数据
ResultSetMetaDatametaData=rs.