C3P0 : 数据库连接池技术
1.导入jar包 c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
2.定义配置文件:
*名称:c3p0.properties 或者 c3p0-config.xml
#路径:直接吧文件放在SRC目录下即可,该数据库连接池不用自己加装配置文件
3.创建核心对象 数据库连接池对象: ComboPooledDataSource
4.获取连接:getConnection
下面是配置文件:
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/student?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=false</property>
<property name="user">root</property>
<property name="password">9672005</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">10</property>
<!-- 超时时间-->
<property name="checkoutTimeout">3000</property>
</default-config>
<named-config name="otherc3p0">
<!-- 连接参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/student?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=false</property>
<property name="user">root</property>
<property name="password">9672005</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">10</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>
下面是获取连接的类:
public class C3P0 {
private static Connection Connection;
public static void main(String[] args) throws SQLException {
//创建数据库连接池对象
DataSource dataSource = new ComboPooledDataSource("otherc3p0");
//获取连接对象
Connection = dataSource.getConnection();
//打印
System.out.println(Connection);
}
}
注意:数据库连接池中colse方法是把连接对象connection归还给连接池,连接池的最大连接数和默认连接数都可以通过配置文件配置,我们比较推荐使用配置文件配置连接池.
下面是不使用配置文件的c3p0的使用
Druid:数据库连接池,阿里巴巴提供
1.导入jar包 Druid-1.0.9.jar
2.定义配置文件并加载配置文件:
*properties形式
*可以是任意名称,可以放在任意的目录下
3.获取数据库连接池对象:通过工厂来获取 DruidDataSourceFactory
4.获取连接
配置文件内容:
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/student?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=false
username=root
password=9672005
initialSize=5
maxActive=10
maxWait=3000
得到数据库连接池
public class Druid {
public static void main(String[] args) throws Exception {
//加载配置文件
Properties properties = new Properties();
ClassLoader classLoader = Druid.class.getClassLoader();
//配置文件在SRC中的路径
InputStream inputStream = classLoader.getResourceAsStream("cn/itcast/jdbc/druid.properties");
properties.load(inputStream);
//传递配置文件
DataSource ds = DruidDataSourceFactory.createDataSource(properties);
Connection connection = ds.getConnection();
System.out.println(connection);
}
}
上面这两种连接池方式,推荐使用第二种,连接池技术有很多种,步骤基本一样,已经学过的还有一个DBCP数据源技术,
其实在使用这些技术的时候,我们要把它们封装成一个工具类,对外提供获得connection,DataSource,和归还connection的方法.
Druid连接池的工具类
public class DataUtils {
//创建数据源
private static DataSource ds = null;
static {
//加载配置文件
Properties properties = new Properties();
try {
properties.load(DataUtils.class.getClassLoader().getResourceAsStream("cn/itcast/jdbc/druid.properties"));
ds = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
//得到连接对象
public static Connection getConnection(){
Connection connection = null;
try {
connection = ds.getConnection();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return connection;
}
//归还连接对象到连接池中
public static void close(Statement statement , Connection connection){
if(statement!=null) {
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(connection!=null) {
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
public static void close(ResultSet resultSet , Statement statement,Connection connection){
if(resultSet!=null) {
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
close(statement,connection);
}
//得到连接池对象
public static DataSource getDs(){
return ds;
}
}
工具类的一个简单使用(我没有关闭连接类)
public class DruidJDBC {
private static PreparedStatement pstmt;
public static void main(String[] args) throws SQLException {
Connection connection = DataUtils.getConnection();
System.out.println(connection);
String sql = "insert into user values(null,?,?,?)";
pstmt = connection.prepareStatement(sql);
pstmt.setString(1,"并");
pstmt.setInt(2,88);
pstmt.setString(3,"女");
int count = pstmt.executeUpdate();
System.out.println(count);
}
}
当我们准备到这一步的时候,其实我们已经可以很方便的获取数据库的连接对象connection了,
通过该连接对象我们可以很方便的操作数据库了,但是我们任然要写很多的代码去操作,接下来,我们就可以使用Spring JDBC 来进一步简化数据库的连接操作
Spring JDBC
*.Spring 框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发
1.导入jar包(5个)
*commons-logging-1.jar
*spring-beans-5.0.0.RELEASE.jar
*spring-core-5.0.0.RELEASE.jar
*spring-jdbc-5.0.0.RELEASE.jar
*.spring-tx-5.0.0.RELEASE.jar
2.创建JDBCTemplate对象,依赖于数据源DataSource
*JDBCTemplate template = new JdbcTemplate(ds);
3.调用JDBCTemplate 的方法来完成CURD的操作
*update():执行DML语句.增删改语句
*queryForMap:查询结果吧结果集封装为map集合
*注意:这个方法查询的结果集长度为1,只能查到一个结果
*queryForList():查询结果把结果集封装成list集合
*注意:这个方法把每一条记录封装成Map集合,再把map集合封装到list集合中
*query():查询结果,把结果封装为JavaBean对象
*query()参数:RowMapper
*一般我们使用BeanPropertyRowMapper实现类.可以完成数据到JavaBean的 自动封装
*new BeanPropertyRowMapper<bean类型>(bean类.class)
*queryForObject:查询结果,把结果封装为对象
*一般用于聚合函数的查询
public class jdbcTemplateDemo02 {
//1.导入jar包
//创建JDBCtemplate对象
//3.调用方法
//Junit单元测试,可以让方法独立执行
private JdbcTemplate template = new JdbcTemplate(DataUtils.getDs());
@Test
public void test1(){
String sql = "insert user values(?,?,?,?)";
int count = template.update(sql,8,"rong",22,"男");
System.out.println(count);
}
//查询一条记录,封装成map
@Test
public void test4(){
String sql = "select * from user where id = ?";
Map<String,Object> map = template.queryForMap(sql,1);
System.out.println(map);
}
//查询所有的记录,并封装成list
@Test
public void test5(){
String sql = "select * from user ";
List<Map<String ,Object>> list = template.queryForList(sql);
for (Map<String ,Object> StringObjectMap: list
) {
System.out.println(StringObjectMap);
}
}
//最常用的方法
//查询所有的记录,并把它们封装成bean对象到list集合
@Test
public void test6(){
String sql = "select * from user";
List<UserBean> list = template.query(sql, new RowMapper<UserBean>() {
@Override
public UserBean mapRow(ResultSet resultSet, int i) throws SQLException {
UserBean userBean = new UserBean();
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
String sex = resultSet.getString("sex");
userBean.setAge(age);
userBean.setId(id);
userBean.setName(name);
userBean.setSgx(sex);
return userBean;
}
});
for (UserBean userBean : list) {
System.out.println(userBean);
}
}
//查询所有,精简版
@Test
public void test7(){
String sql = "select * from user";
List<UserBean> list = template.query(sql,new BeanPropertyRowMapper<UserBean>(UserBean.class));
for (UserBean userBean : list) {
System.out.println(userBean);
}
}
//T查询总记录数
@Test
public void test8(){
String sql = "select count(id) from user";
//返回定义的long类型数据
Long total = template.queryForObject(sql,Long.class);
System.out.println(total);
}
}
下面看怎么封装Javabean类
public class jdbcTemplateDemo02 {
//1.导入jar包
//创建JDBCtemplate对象
//3.调用方法
//Junit单元测试,可以让方法独立执行
private JdbcTemplate template = new JdbcTemplate(DataUtils.getDs());
//查询所有,精简版
@Test
public void test7(){
String sql = "select * from user";
List<UserBean> list = template.query(sql,new BeanPropertyRowMapper<UserBean>(UserBean.class));
for (UserBean userBean : list) {
System.out.println(userBean);
}
}
}