Driud数据库连接池和JDBCTemplate封装数据
数据库连接池
概念:其实就是一个容器,存放数据库连接的容器,当系统初始化好以后,容器被创建,容器中会申请一些连接对象,当数据来访问数据库的时候,从容器中获取连接,而不需要再次加载连接之类的了,用户用完后,会将连接对象归还,实现资源的高效,不用每次使用都去加载驱动,获取连接之类的。
Druid:数据库连接池
Druid连接池是阿里巴巴平台上的一个数据连接池实现的,它综合了C3P0,DBCP,等DB连接的优点,同时加入了日志监控,可以很好的监控DB池的连接和SQL的执行情况,可以说是针对监控而生的连接池,据说是最好的连接池,多的不是,阿里巴巴是国内很成功的上市公司,旗下600多款应用都使用了自己封装的Druid数据库连接池,你说以后在国内做JAVA开发不就一步小心就与阿里扯到一起了哟
使用步骤:
1.建立web项目,并添加响应的jar包
2.定义配置文件,是以properties形式的,可以放在任意目录下
3.加载配置文件,properties形式的
4.获取数据库连接对象,通过工厂来获取DriudDateSoureFactory
5.获取连接对象
分布讲解:
1.建立项目,并添加相对应的jar包
2.书写核心的配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/day_17
username=root
password=123
initialSize=5
maxActive=10
maxWait=3000
3.定义工具类JDBCUtils
3.1定义一个类JDBCUtils
3.2提供了静态代码块加载配置资源,初始化连接对象
3.3提供方法:获取连接对象的方法,释放资源,获取连接对象
package cn.ujiuye.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* JDBCUtils工具类
*/
public class JDBCUtils {
//1.定义成员变量
private static DataSource ds;
static {
try {
//2.加载配置文件
//2.1创建集合对象
Properties prop = new Properties();
//2.2用类加载器加载资源即获取路径
prop.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
//3.获取Datesource
ds = DruidDataSourceFactory.createDataSource(prop);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//获取返回连接池的方法
public static DataSource getDataSource(){
return ds;
}
/**
* 释放资源,归还连接
*/
public static void close(Statement stat,Connection con){
//两个变量的直接调用3个参数的,简化书写
close(null,stat,con);
}
/**
* 释放资源,归还连接
*/
public static void close(ResultSet rs,Statement stat, Connection con){
if (rs != null){ //释放资源
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stat != null){ //释放资源
try {
stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null){ //归还对象
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
4.写一个demo大家可以看下效果
package cn.ujiuye.datasource.druid;
import cn.ujiuye.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* 使用工具类来完成增加功能
*/
public class DruidDemo2 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstat = null;
try {
//1.获取连接
conn = JDBCUtils.getConnection();
//2.定义sql
String sql = "insert into bank values(null,?,?)";
//3.获取连接对象
pstat = conn.prepareStatement(sql);
//4.给sql相关的值赋值
pstat.setString(1,"刘刚");
pstat.setDouble(2,3000);
//5.执行sql
int count = pstat.executeUpdate();
System.out.println("返回的结果是:"+count+"插入成功了数据");
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.close(pstat,conn);
}
}
}
SpringJDBC
Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
-
导入jar包
2. 创建JdbcTemplate对象。依赖于数据源DataSource
* JdbcTemplate template = new JdbcTemplate(ds);3. 调用JdbcTemplate的方法来完成CRUD的操作 * update():执行DML语句。增、删、改语句 * queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合 * 注意:这个方法查询的结果集长度只能是1 * queryForList():查询结果将结果集封装为list集合 * 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中 * query():查询结果,将结果封装为JavaBean对象 * query的参数:RowMapper * 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装 * new BeanPropertyRowMapper<类型>(类型.class) * queryForObject:查询结果,将结果封装为对象 * 一般用于聚合函数的查询
相关的代码操作
package cn.ujiuye.Jdbctemplate;
import cn.ujiuye.domin.Usr;
import cn.ujiuye.utils.JDBCUtils;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
import java.util.Map;
/**
* 利用JdbcTemple实现数据的DML操作
*/
public class JdbcTemplateDemo02 {
//1.获取jdbcTemplate连接
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
/**
* 修改数据 ,利用Junit测试
* junit测试要注意的是只能是public定义和返回值为空
*/
@Test
public void updateUser(){
//2.定义sql
String sql = "update user set password ='888888' where id = ?";
//3.执行sql
int account = template.update(sql, 1);
//4.处理sql
System.out.println("该程序运行的结果是1则代表成功,如果是0则代表失败:"+account);
}
/**
* 增加记录
*/
@Test
public void addUser(){
//2.定义sql
String sql = "insert into user values(?,?,?)";
//3.执行sql
int account = template.update(sql, null, "赵六", "123456");
//4.处理sql
System.out.println(account);
}
/**
* 增加记录
*/
@Test
public void deleteUser(){
//2.定义sql
String sql = "delete from user where id = ?";
//3.执行sql
int account = template.update(sql, 1);
//4.处理sql
System.out.println(account);
}
/**
* 查询语句,将其封装到map集合中
* 将其对象以字段为key 值为value的形式写出来了
* 显然只能够使用一条记录而不能使用两条记录
*/
@Test
public void selectByIdMap(){
//2.定义sql
String sql = "select * from user where id = ?";
//3.执行sql
Map<String, Object> map = template.queryForMap(sql, 2);
//4.处理sql
System.out.println(map);
}
/**
* 将结果全部封装到list集合中循环读出来
*/
@Test
public void selectByIdList(){
//2.定义sql
String sql = "select * from user";
//3.执行sql
List<Map<String, Object>> list = template.queryForList(sql);
for (Map<String, Object> map : list) {
System.out.println(map);
}
}
/**
* 查询所有,封装数据为对象的需求
*/
@Test
public void selectByIdQuery(){
//2.定义sql
String sql = "select * from user";
//3.执行sql
List<Usr> list = template.query(sql, new BeanPropertyRowMapper<Usr>(Usr.class));
//4.处理sql
for (Usr user :list){
System.out.println(user);
}
}
/**
* 查询数据的总数是多少
*/
@Test
public void selectCount(){
//2.定义sql
String sql = "select count(*) from user";
//3.执行sql
Long total = template.queryForObject(sql, long.class);
//4.处理sql
System.out.println(total);
}
}