本篇博客知识点
1.演示Dbcp、C3p0获得数据库连接对象的两种方式
2.演示Dbcp、C3p0常用功能和区别
3.用Dbcp、C3p0完成一个数据库连接池的工具类
4.学习使用DBUtil工具类
演示Dbcp、C3p0获得数据库连接对象的两种方式
dbcp和c3p0普通方式连接数据库学习
@Test
public void demo1() throws Exception{
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/ake?useUnicode=true&characterEncoding=utf8";
String username = "root";
String password = "1234";
// 底层方式连接数据库
Class.forName(driver);
Connection con =DriverManager.getConnection(url, username, password);
// 通过dbcp方式
//*当前的dbcpUils有一点地方要注意一下,一个连接关闭之后,同一线程再次获取到的连接是原来关闭过的连接。
//针对该问题,我们需要留意一下,采用某种解决办法,比如:在con.close()之后紧接收写一行清空线程管理池中的con对象如t.set(null)
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
Connection con_dbcp = ds.getConnection();
// 通过c3p0方式
ComboPooledDataSource cds = new ComboPooledDataSource();
cds.setDriverClass(driver);
cds.setJdbcUrl(url);
cds.setUser(username);
cds.setPassword(password);
Connection con_c3p0 = cds.getConnection();
System.out.println("原来方式拿到的con:"+con);
System.out.println("dbcp方式拿到的con:"+con_dbcp);
System.out.println("c3p0方式拿到的con:"+con_c3p0);
}
* dbcp和c3p0通过配置文件方式连接数据库学习*
@Test
public void dem02() throws Exception{
Properties p = new Properties();
// 方式一读取配时,置文件应该方法 bin(classpath路径)目录下面 (有 getClassLoader)
// p.load(DbcpPoolDemoLeran.class.getClassLoader().getResourceAsStream("jdbc.properties"));
// 方式二 读取时,配置文件应该刚到 该类生成的.class文件下 (有 getClassLoader)
p.load(DbcpPoolDemoLeran.class.getResourceAsStream("jdbc.properties"));
//底层方式方式
String driver = p.getProperty("driver");
String url = p.getProperty("url");
String username = p.getProperty("username");
String password = p.getProperty("password");
// 获得连接
Class.forName(driver);
Connection con =DriverManager.getConnection(url, username, password);
System.out.println("con:"+con);
// 通过dbcp方式: 这种方式也需要前面 的new Properties()和p.load(...);
DataSource ds = BasicDataSourceFactory.createDataSource(p);
Connection con_dpcp = ds.getConnection();
System.out.println("con_dpcp:"+con_dpcp);
// 通过c3p0的方式:配置文件c3p0-config.xml,必须方到Src下面
// c3p0默认的就是配置文件方式连接数据库的,只需要去把配置文件配好就行了
ComboPooledDataSource cds = new ComboPooledDataSource();
Connection con_c3p0 = cds.getConnection();
System.out.println("con_c3p0:"+con_c3p0);
}
演示Dbcp、C3p0常用功能和区别
演示dpcp常见功能:用过connection对象会重复用
public void demo1() throws Exception{
BasicDataSource ds = new BasicDataSource();//ds即是我们之前自己做的pool
ds.setUsername("root");
ds.setPassword("1234");
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://127.0.0.1:3306/abc?useUnicode=true&characterEncoding=utf8");
Connection con = ds.getConnection();
System.out.println("con:"+con);
System.out.println("-------以下展示dbcp的一些属性或它的性能,这些属性可以get也可以set--------");
System.out.println(ds.getDefaultAutoCommit()); //默认提交方式: true,不开启事务
System.out.println(ds.getDriverClassName());
System.out.println(ds.getMaxActive()); //同时可支持多少个活动连接
System.out.println(ds.getInitialSize());
System.out.println(ds.getMaxIdle());
System.out.println(ds.getMaxWait()); //-1, 没拿连接,就一直等待
System.out.println("------以下演示从ds池中获取一些连接--------");
ds.setMaxActive(9);
for(int i=0; i<25; i++){
Connection conn = ds.getConnection();
System.out.println(conn.hashCode());
if(i%2==1){
conn.close();
}
}
}
演示c3p0常见的功能:用过connection对象会不会重复用
public void demo1() throws Exception{
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setUser("root");
ds.setPassword("1234");
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/ake?useUnicode=true&characterEncoding=utf8");
Connection con = ds.getConnection();
System.out.println("con:"+con);
System.out.println("-------以下展示c3p0的一些属性或它的性能,这些属性可以get也可以set--------");
System.out.println(ds.getInitialPoolSize()); //初始池大小
System.out.println(ds.getMaxPoolSize());
System.out.println(ds.getLoginTimeout()); //-1, 没拿连接,就一直等待
System.out.println("------以下演示从ds池中获取一些连接--------");
for(int i=0; i<35; i++){
Connection conn = ds.getConnection();
System.out.println(conn.hashCode());
if(i%2==1){
conn.close(); //c3p0中,连接关闭之后不会被重新使用,每次从池中获取到的是新创建的连接
}
}
用Dbcp、C3p0完成一个数据库连接池的工具
Dbcp数据库连接池的工具 :记得设置好配置文件和导工具包
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class ConnUtils {
private static DataSource ds;// 单利的池
private static ThreadLocal<Connection> t = new ThreadLocal<Connection>();
static{
try {
Properties p = new Properties();
p.load(ConnUtils.class.getClassLoader().getResourceAsStream("dbcp.properties"));
ds = BasicDataSourceFactory.createDataSource(p);
BasicDataSource ds2 = (BasicDataSource) ds;
//设置最大连接数目
ds2.setMaxActive(10);
} catch (Exception e) {
throw new RuntimeException("数据库连接池创建失败!", e);
}
}
public static DataSource getDataSource(){
return ds;
}
public static Connection getCon() throws SQLException{
Connection con = t.get();
if(con==null){
con = ds.getConnection();
t.set(con);
}
return con;
}
public static void clearConFromThreadLocal(){
t.set(null);
}
}
C3p0数据库连接池的工具 :记得设置好配置文件和导工具包
package cn.hncu.c3p0;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/※※※以后我们开发可以做一个这样的池来使用
public class c3p0Pool {
private static DataSource ds; //单例的池
private static ThreadLocal<Connection> t = new ThreadLocal<Connection>();
static{
try {
ds = new ComboPooledDataSource();
} catch (Exception e) {
throw new RuntimeException("数据库连接池创建失败!", e);
}
}
//以后会用到这个功能
public static DataSource getDataSource(){
return ds;
}
public static Connection getConn() throws SQLException{
Connection con = t.get();
if(con==null){
con = ds.getConnection();
t.set(con);
}
return con;
}
public static void clearConFromThreadLocal(){
t.set(null);
}
}
学习使用DBUtil工具类
核心代码
QueryRunner run = new QueryRunner(C3POConnUtils.getDataSource());
run.query(sql, 把数据封装成不同心事的参数);
案例学习代码
package Studying.d18.Demo;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.junit.Test;
import Studying.d18.Utils.C3POConnUtils;
/*
掌握DBUtils工具的关键是学好两个类(接口):
1) QueryRunner类: 用于执行sql语句的
2) ResultSetHandler接口: 用于封装返回结果的 (具体使用是用它的实现类)
*/
public class DbUtilsDemo {
@Test //我们原来的查询功能实现代码,,要求封装成List<Stud>的形式返回
public void query0Demo() throws Exception{
Connection con = C3POConnUtils.getCon();
String sql = "select * from stud";
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
List<Stud> studs = new ArrayList<Stud>();
while(rs.next()){
Stud s = new Stud();
s.setId( rs.getString("id") );
s.setName( rs.getString("name"));
studs.add(s);
}
rs.close();
st.close();
con.close();
System.out.println(studs);
}
@Test //使用apache的DBUtils框架进行查询功能的实现代码,,要求封装成List<Stud>的形式返回
public void query0_DbUtilsHello_Demo() throws Exception{
String sql = "select * from stud";
QueryRunner run = new QueryRunner(C3POConnUtils.getDataSource());
List<Stud> studs = run.query(sql, new BeanListHandler<Stud>(Stud.class));
System.out.println(studs);
}
@Test
public void query0_DbUtilsHello2_Demo() throws Exception{
QueryRunner run = new QueryRunner(C3POConnUtils.getDataSource());
List<Map<String,Object>> studs = run.query("select * from stud", new MapListHandler());
System.out.println(studs);
}
}