【无标题】

数据库连接池与DBUtils工具

1、数据库连接池的概念

用池来管理Connection,这可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。
1

2.DataSource接口

JDBC提供了javax.sql.DataSource接口,它负责建立与数据库的连接,在应用程序中访问数据库时不必编写连接数据库的代码,可以直接从数据源获得数据库连接
1
(1)数据库和连接池

在DataSource中事先建立了多个数据库连接,这些数据库连接保存在连接池(ConnectPool)中。java程序访问数据库时,只需要从连接池中取出空闲状态的数据库连接,当程序访问数据库结束,再将数据库连接放回连接池,这样做可以调高访问数据库的效率。

如果Web应用每次接收到客户的请求,都和数控建立一个连接,数控操作结束就断开连接,这样会消费大量的时间和资源。因为数据库每次配置连接都要将Connection对象加载到内存中,再验证用户名和密码。

(2)数据源和JNDI资源

由于DataSource对象是由Tomcat提供的,因此不能够在程序中创建一个DataSource对象,而要采用JNDI技术来获得DataSource对象的引用。
可以简单的把JNDI理解为一种将对象和名字绑定的技术,对象工厂负责生产出对象,这些对象都和唯一的名字绑定,外部程序可以通过名字来获得某个对象的引用。在javax.naming包中提供了Context接口,该接口提供了将对象和名字绑定,以及通过名字检索对象的方法。

DBCP数据源

DBCP是Apache提供的一款开源免费的数据库连接池!Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。Hibernate3.0之后不再对DBCP提供支持!因为Hibernate声明DBCP有致命的缺欠!

需要应用程序应在系统中增加如下两个 jar 文件:

·Commons-dbcp.jar:连接池的实现
·Commons-pool.jar:连接池实现的依赖库
————————————————
版权声明:本文为CSDN博主「2020080605040」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_55689316/article/details/1223522741.通过BasicDataSource类直接创建数据源对象
在使用BasicDataSource类创建一个数据源对象时,需要手动给数据源对象设置属性值,然后获取数据库连接对象。
例:

package chapter10;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

public class example01 {

public static DataSource ds=null;
static {
BasicDataSource b=new BasicDataSource();
b.setDriverClassName(“com.mysql.jdbc.Driver”);
b.setUrl(“jdbc:mysql://localhost:3306/jdbc”);
b.setUsername(“root”);
b.setPassword(“123456”);

   b.setInitialSize(5);
   b.setMaxActive(10);
   
   ds=b;

}
public static void main(String[] args) throws SQLException {
Connection conn=ds.getConnection();
DatabaseMetaData m=conn.getMetaData();
System.out.println(m.getURL());
System.out.println(m.getUserName());
System.out.println(m.getDriverName());
}
}

运行结果:

2.通过ComboPooledDataSource()构造方法创建数据源对象
使用ComboPooledDataSource()构造方法创建数据源对象,需要手动给数据源对象设置属性值,然后获取数据库连接对象。
例:

package chapter10;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class example03 {
public static DataSource ds=null;
static {
ComboPooledDataSource c=new ComboPooledDataSource();

   try {
	   c.setDriverClass("com.mysql.jdbc.Driver");
	   c.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc");
       c.setUser("root");
       c.setPassword("123456");
       
       c.setInitialPoolSize(5);
       c.setMaxPoolSize(10);
       ds=c;
       
   }catch(PropertyVetoException e) {
	  e.printStackTrace(); 
   }

}
public static void main(String[] args) throws SQLException {
Connection conn=ds.getConnection();
DatabaseMetaData m=conn.getMetaData();

System.out.println(m.getURL());
System.out.println(m.getUserName());
System.out.println(m.getDriverName());

}
}

运行结果:

DBUtils工具
1.BeanultSetHandler实现类
先创建一个名为BaseDao的类该类中编写了一个通用查询方法

package chapter10;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.apache.commons.dbutils.ResultSetHandler;

public class BaseDao {
public static Object query(String sql,ResultSetHandler<?> rsh,Object… params) {
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
conn=JDBCUtils.getConnection();
ps=conn.prepareStatement(sql);
for(int i=0;params!=null && i<params.length;i++) {
ps.setObject(i+1, params[i]);
}
rs=ps.executeQuery();
Object obj=rsh.handle(rs);
return obj;
}catch(Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.realse(rs, ps, conn);
}
return rs;
}
}

在包下创建一个User类,用来封装User对象

package chapter10;

public class User {
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}

在包下创建一个名为ResultSetTest1的类,用于演示BeanHandler类对结果集的处理

package chapter10;

import org.apache.commons.dbutils.handlers.BeanHandler;

public class ResultSetTest1 {
public static void testBeanHandler() {
BaseDao baseDao=new BaseDao();
String sql=“select * from users where id=?”;
Object object=BaseDao.query(sql, new BeanHandler(User.class), 12);
if(object!=null && object instanceof User) {
User user=(User) object;
System.out.println(“id为12的User对象的name值为:”+user.getName());
}else {
System.out.println(“查询结果为空:”+object);
}
}
public static void main(String[] args) {
testBeanHandler();
}
}

运行结果:

可以看出BeanHandler已成功将id为12的数据存入到了实体user对象中。

在包下建一个名为ResultSetTest2的类用来演示BeanListHandler类对结果集的处理

package chapter10;

import java.util.ArrayList;

import org.apache.commons.dbutils.handlers.BeanListHandler;

public class ResultSetTest2 {
public static void testBeanHandler() {
BaseDao b=new BaseDao();
String sql=“select * from users”;
ArrayList list = (ArrayList) b.query(sql, new BeanListHandler(User.class));

for(int i=0;i<list.size();i++) {
	System.out.println("第"+(i+1)+"条数据的username值为:"+list.get(i).getName());
}

}
public static void main(String[] args) {
testBeanHandler();
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值