一、连接池概念就不讲了,百度一下。
二、java连接池规范:由于原始的链接数据库jar包接口写的不规范,之前各种数据库的jar包都是各数据库厂商自己写的,没有统一的规范。后来sun公司定义了连接池的规范接口( javax.sql.DataSource),只是定义了连接池对象(DataSource)、增删改查(prepareStatement)、连接(Connection)等接口。各数据库厂商来实现统一的接口。 这样我们以后引入jar包的的时候其实不可以不用关系各数据库厂商怎么实现接口的!目前主流的有dbcp和c3p0两种连接池,这里再另外说句,各数据库厂商的jar包只是写了怎么连接数据库、怎么对数据进行操作如mysql-connector-java-5.0.8-bin.jar。而dbcp和c3p0的两个jar包是用来构建连接池的,记住只是单纯的创建连接池。
三、各jar包再次说明:
(1)mysql-connector-java-5.0.8-bin.jar是mysql数据库厂商写的针对mysql数据库连接、操作的jar包。
(2)c3p0-0.9.1.2.jar 是用来创建各种数据库连接池的jar包。
(3)jdbcTemplate和DBUtilsjdbcTemplate类似,提供了一系列的增删改差的操作,属于spring封装好的工具包,我们如果细看DBUtis和JdbTemplet源码,可以看到在调用他们各自的增删改查方法的时候,源码实际上都是调用的java规范的接口PreparedStatement,而PreparedStatement
就是java定义的其中一个规范接口,mysql、oracle等各大数据库厂商,在各自的数据库驱动jar包中实现了规范接口。
总结:实际上我们利用数据库厂商提供的jar就能对数据库进行连接、增删改查。但是每次操作都要连接、关闭数据库太消耗内存,所以又诞生了连接池。又由于各数据库厂商提供的增删改查的接口用起来又比较麻烦,所以又诞生了jdbcTemplate和DBUtilsjdbcTemplate,通过引入这俩包,我们对数据库的操作又会简化很多。
四、连接池配置(只讲C3P0)
(1)创建c3p0-config.xml文件,怎么配置网上很多每个人都能学会,我这里讲的是整个流程,不是网上都能有找到的。
<!--配置连接池mysql-->
<named-config name="mysql">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/study</property>
<property name="user">root</property>
<property name="password">123456</property>
</named-config>
(2)创建连接池对象,为什么要创建连接池对象?上面我们配置的只是一些参数,c3p0-config.xml文件里面我们可以配置多个各种数据库的连接池,通过named-config name的value值区分。
public class C3P0Util {
static org.apache.log4j.Logger logger=org.apache.log4j.Logger.getLogger(C3P0Util.class.getName());
//通过标识名来创建相应连接池,new ComboPooledDataSource就是C3P0jar包里面的,通过这个new出来一个连接池ComboPooledDataSource对象,其实也可以写成 static DataSoource dataSource=new ComboPooledDataSource("mysql");为什么能这么写呢,因为ComboPooledDataSource是连接池,java定义了规范的连接池接口DataSource,C3P0的连接池(ComboPooledDataSource)实现了DataSource接口。
static ComboPooledDataSource dataSource=new ComboPooledDataSource("mysql");
//获取上面的连接池
public static DataSource getDataSource() {
return dataSource;
}
//从连接池中取用一个连接,java规范接口DataSource接口里面定义了getConnection方法,用来获取一个connection对象,这里我们就能看到 ,我们不用再关系C3P0怎么实现连接的了,直接用就可以。
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (Exception e) {
logger.error("Exception in C3p0Utils!", e);
throw new Error("数据库连接出错!", e);
}
}
//释放连接回连接池
public static void close(Connection conn,PreparedStatement pst,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
logger.error("Exception in C3p0Utils!", e);
throw new Error("数据库连接关闭出错!", e);
}
}
if(pst!=null){
try {
pst.close();
} catch (SQLException e) {
logger.error("Exception in C3p0Utils!", e);
throw new Error("数据库连接关闭出错!", e);
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
logger.error("Exception in C3p0Utils!", e);
throw new Error("数据库连接关闭出错!", e);
}
}
}
}
(3)如果我们只是单纯的用连接池jar,没有用到DBUtils或者JDBCTemplate的jar包,我们只能用java规范接口里面的prepareStatement和executeUpdate来对数据库进行操作。显然是很麻烦的,每次操作都要写一个方法。
public void testInsert(){
try {
conn = C3P0Util.getConnection();
ps = conn.prepareStatement("insert into users(username) values('ggg')");
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally{
C3P0Util.close(conn, ps, rs);
}
System.out.println(conn.getClass().getName());
}
五、DBUtils或者JDBCTemplate,用这俩个jar就不用向上面似的每次操作都要写个方法。
(1)(DBUtils)通过QueryRunner对象对数据库操作
第一步:得到连接池,其中C3P0Utils.getDataSource()就是上面代码New出来的一个DataSource
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
第二步:对数据库操作
queryRunner.update("Update users set username='test2' where id = ?",8);
(2)(JDBCTemplate)通过jdbcTemplate对象对数据库操作
第一步:得到连接池
JdbcTemplate jdbcTemplate= new JdbcTemplate(C3P0Utils.getDataSource());
第二步:操作数据库
jdbcTemplate.queryForList("select *from user;");