1.数据库连接池
数据库连接池,简称dbcp database connection pool。在程序初始化时创建一定数量的数据库连接对象并将其保存在一块内存区中,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个,释放空闲时间超过最大空闲时间的数据库连接以避免因为没有释放数据库连接而引起的数据库连接遗漏。连接池用于创建和管理数据库连接的缓冲池技术,缓冲池中的连接可以被任何需要他们的线程使用。当一个线程需要用JDBC对一个数据库操作时,将从池中请求一个连接。当这个连接使用完毕后,将返回到连接池中,等待为其他的线程服务。
1.在eclipse中创建一个chapter10的Web项目,通过 BaisicDataSource类直接创建数据源对象,在项目中导入相应的JAR包
2.再创建一个example01的类,该类采用手动方式获取数据库的连接信息和数据源的初始化信息。
package cn.itcast.chapter10.example;
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 bds = new BasicDataSource();
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jdbc:mysql://localhost:3306/jdbc");
bds.setUsername("root");
bds.setPassword("123456");
bds.setInitialSize(5);
bds.setMaxActive(10);
ds=bds;
}
public static void main(String[] args) throws SQLException {
Connection conn = ds.getConnection();
DatabaseMetaData metadata = conn.getMetaData();
System.out.println(metadata.getURL());
System.out.println(metadata.getUserName());
System.out.println(metadata.getDriverName());
}
}
3.通过读取配置文件创建数据源对象,在src目录下创建dbcpcon.properties文件,该文件应用于设置数据库的连接信息和数据源的初始化信息。并且再包中创建example02类,该类采用了从配置文件中获取数据库的连接信息和数据源的初始化信息的方式。
package cn.itcast.chapter10.example;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class example02 {
public static DataSource ds = null;
static {
Properties prop = new Properties();
try {
InputStream in = new example02().getClass().getClassLoader().getResourceAsStream("dbcp.properties");
prop.load(in);
ds=BasicDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws SQLException {
Connection conn = ds.getConnection();
DatabaseMetaData metadata = conn.getMetaData();
System.out.println(metadata.getURL());
System.out.println(metadata.getUserName());
System.out.println(metadata.getDriverName());
}
}
2.C3P0数据源
1.通过 ComboPooledDataSource()构造方法创建数据源对象,在包中编写一个example03类,该类采用C3P0数据源手动代码的方式或缺Connection对象。
package cn.itcast.chapter10.example;
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 cpds = new ComboPooledDataSource();
try {
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc");
cpds.setUser("root");
cpds.setPassword("123456");
cpds.setInitialPoolSize(5);
cpds.setMaxPoolSize(10);
ds=cpds;
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws SQLException {
Connection con = ds.getConnection();
DatabaseMetaData metadata = con.getMetaData();
System.out.println(metadata.getURL());
System.out.println(metadata.getUserName());
System.out.println(metadata.getDriverName());
}
}
2.通过读取配置文件创建数据源对象,在src下创建一个c3p0=config.xml,用于设置数据库的连接信息和数据源的初始化信息。在包中编写一个example04类,该类中使用C3P0数据源从配置文件中获取Connection对象。
package cn.itcast.chapter10.example;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class example04 {
public static DataSource ds = null;
static {
ComboPooledDataSource cpds = new ComboPooledDataSource("dashuju");
ds=cpds;
}
public static void main(String[] args) throws SQLException {
Connection con = ds.getConnection();
DatabaseMetaData metadata = con.getMetaData();
System.out.println(metadata.getURL());
System.out.println(metadata.getUserName());
System.out.println(metadata.getDriverName());
}
}
3.DBUtils工具
1.先在数据库中建立好数据,User类和JDBCUtils类可以到之前做的chapter09的项目中复制于chapter10中使用。
2. 创建一个BaseDao的类,该类中编写了一个通用的查询方式
package cn.itcast.chapter10.example;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class BaseDao {
public static Object query(String sql,ResultSetHandler<?> rsh,Object... params) {
Connection con = null;
PreparedStatement pstatement = null;
ResultSet rs = null;
try {
con=JDBCUtils.getConnection();
pstatement=con.prepareStatement(sql);
for (int i = 0; params!=null && i < params.length; i++) {
pstatement.setObject(i+1, params[i]);
}
rs=pstatement.executeQuery();
Object object=rsh.handle(rs);
return object;
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(rs,pstatement,con);
}
return rs;
}
}
3.创建ResultSetTest1类,该类用于演示BeanHanndler类对结果集的处理
package cn.itcast.chapter10.example;
import org.apache.commons.dbutils.handlers.BeanListHandler;
public class ResultSetTest1 {
public static void main(String[] args) throws SQLException{
testBeanHandler();
}
private static void testBeanHandler() throws SQLException{
BaseDao basedao=new BaseDao();
String sql = "select * from user where id=?";
Object object = basedao.query(sql, new BeanHandler(User.class), 1);
if(object!=null&&object instanceof User) {
User user = (User)object;
System.out.println("id为1的User对象的name值为:"+user.getName());
}else {
System.out.println("查询结果为空:"+object);
}
}
}
4.创建ResultSetTest2类,该类用于演示BeanHListanndler类对结果集的处理
package cn.itcast.chapter10.example;
import java.util.ArrayList;
import java.sql.SQLException;
import org.apache.commons.dbutils.handlers.BeanListHandler;
public class ResultSetTest2 {
public static void main(String[] args) throws SQLException{
testBeanHandler();
}
private static void testBeanHandler() throws SQLException{
BaseDao basedao=new BaseDao();
String sql = "select * from user";
ArrayList<User> list = (ArrayList<User>)basedao.query(sql, new BeanHandler(User.class));
for (int i=0;i<list.size();i++) {
System.out.println("第"+(i+i)+"条数据的username值为:"+list.get(i).getName());
}
}
}
5. 创建resultSetTest3类,该类用于演示ScalarHandler类的使用方法
package cn.itcast.chapter10.example;
import java.sql.SQLException;
import org.apache.commons.dbutils.handlers.ScalarHandler;
public class ResultSetTest2 {
public static void main(String[] args) throws SQLException{
testBeanHandler();
}
private static void testBeanHandler() throws SQLException{
BaseDao basedao=new BaseDao();
String sql = "select * from user where id=?";
Object object = basedao.query(sql, new ScalarHandler("name"), 1);
System.out,println(object);
}
}