学习数据库连接池和spring jdbc可以简化jdbc原始代码
数据库连接池的概念
数据库连接池就是一个容器(集合),存放数据库连接对象的容器
当系统初始化之后(Tomcat服务器启动),容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,直接从容器中获取连接对象(无需再跟数据库创建连接),用户访问完之后,会将连接对象归还给容器
好处
- 节约资源
- 用户访问高效
实现
- 标准接口:DataSource
- 方法:
获取连接:getConnection()
归还连接:Connection.close()
。如果连接对象Connection是从连接池中获取的,那么Connection.close()
不再是关闭资源,而是归还连接至数据库连接池
- 方法:
- 一般我们不去实现它,由数据库厂商来实现
Druid:数据库连接池实现技术,由阿里巴巴提供
Druid数据库连接池
步骤:
- 导入jar包
- 定义配置文件
druid.properties
可以叫任意名称,可以放在任意目录下,需要手动加载
- 加载配置文件
- 获取数据库连接池对象:通过工厂类来获取
DruidDataSourceFactory.createDataSource()
- 获取连接:
getConnection
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/contest?serverTimezone=GMT%2B8&useSSL=false
username=username
password=password
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
public class Druid {
public static void main(String[] args) throws Exception {
//1.导入jar包
//2.定义配置文件
//3.加载配置文件
Properties pro = new Properties();
InputStream is = Druid.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5.获取连接
Connection coon = ds.getConnection();
System.out.println(coon);
}
}
Druid连接池的工具类
package utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import jdbc.Druid;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
* druid连接池的工具类
*/
public class JDBCUtils {
//定义数据库连接池
private static DataSource ds;
/**
* 当类被加载时,初始化数据库连接池
*/
static{
try {
//加载配置文件
Properties pro = new Properties();
InputStream is = Druid.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//获取连接池对象
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
/**
* 释放资源
*/
public static void close(Connection conn, Statement stmt,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
public static void close(Connection conn, Statement stmt){
close(conn,stmt,null);
}
/**
* 获取数据库连接池
*/
public static DataSource getDataSource(DataSource ds){
return ds;
}
}
Spring JDBC
spring框架对jdbc进行了简单封装。提供一个JDBCTemplate对象简化JDBC的开发 template:模板;即jdbc模板
jdbcTemplate内部对申请连接,释放资源等做了封装,我们不需要再去关心,只需要考虑如何定义SQL语句,如何执行及如何处理结果即可,大大简化jdbc的操作,很nice
步骤
- 导入jar包
-
创建JdbcTemplate对象。依赖于数据库连接池DataSource
JdbcTemplate template = new JdbcTemplate(ds);
- 调用JdbcTemplate的方法来完成crud操作
- update():执行DML语句。增删改语句
- queryForMap():查询结果并封装为map集合
注意:查询结果集长度只能为1(只能封装一行数据)
- queryForList():查询结果并封装为list集合
注意:将每一行数据封装为一个map集合,再将map集合装载到list集合中
- query():查询结果并封装为Javabean对象(封装为数据库表的实体类的对象)
注意:query的参数:RowMapper
一般我们使用BeanPropertyRowMapper
实现类。可以完成数据到javabean的自动封装new BeanPropertyRowMapper<类型>(类型.class)
- queryForObject():查询结果并封装为对象注意:
- update():执行DML语句。增删改语句
- 如果要实现使用
queryForObject
获得自定义的类的对象,需要使用和方法query()
相似的重载方法queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object... args)
- 如果要实现使用
template.queryForObject(sql, new BeanPropertyRowMapper<E>(E.class));
- 一般用于聚合函数的查询
- 一般用于聚合函数的查询
/**
* 操作数据库中user表的类
* dao:database access object 数据库访问对象
*/
public class UserDao {
//声明jdbcTemplate对象共用
private JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
/**
* 登录方法
* @param loginUser 只有用户名和密码
* @return user 用户全部数据,没有返回null
*/
public User login(User loginUser){
try {
//1.定义SQL
String sql="select * from user where username=? and password=?";
//2.调用query方法
User user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class),loginUser.getUsername(),loginUser.getPassword());
return user;
} catch (DataAccessException e) {
return null;
}
}
}