连接池
连接池:其实就是一个容器,在这个容器当中存放着多个连接对象。
当系统开始运行时,可以让系统提前创建多个连接对象,放到容器中(连接池),当客户端需要连接对象时,可以从连接池中申请一个连接,去访问数据库,当该连接使用完毕时,不再释放归还给系统,而是把这个连接对象归还给连接池。
好处:
实现操作
javax.sql 连接池
JNDI —> Java naming and Directory Interface Java命名和目录接口
使用JNDI 降低程序和数据库的耦合度,是你的程序更加方便配置,维护和部署
是JavaEE规范中的重要规范之一。是EJB的相关的知识
DataSource接口 它里面并不提供具体的实现,而是由驱动程序供应商(数据库厂商)实现。
c3p0:他是数据库连接池的一套技术
druid:也是一套数据库连接池的技术,由阿里巴巴提供的。
C3p0:数据库连接池技术
步骤
-
去网上下载两个jar包:c3p0-0.9.5.2.jar和mchange-commons-java-0.2.12.jar
-
植入到工程的classpath类路径下,不要忘了导入mysql驱动jar包:mysql-connector-java-5.1.37-bin.jar
-
定义配置文件
-
获取DataSource对象:数据库连接池对象 通过实例化ComboPooledDataSource来获取
-
从连接池中获取连接对象。getConnection()
Druid:德鲁伊连接池技术
步骤
- 去官网下载德鲁伊的jar包:druid-1.0.9.jar
- 植入工程路径下,同样导入mysq驱动jar包
- 定义配置文件:使用properties文件类型,名字随便起
- 手动加载配置文件:Properties集合
- 获取DataSource对象:通过工厂方式来实现的,DruidDataSoutceFactory
- 从连接池中获取连接对象:getCOnnection()
JDBC Template
Spring框架提供了对JDBC操作的简单封装,使用JDBCTemplate对象来简化JDBC开发流程。
步骤:
- 从官网下载对应的spring-jdbc相关的jar包,导入到工程的类路径下,放到lib文件夹下面即可
- 创建JDBCTemplate对象。依赖于DataSouce连接池(数据源)
- 使用JDBCTemplate对象中的api方法实现crud操作
- DML操作(增删改):
update()
方法
- DQL操作(查询):查询 不用select 使用query
-
query()
:将查询的结果集封装成JavaBean对象
-
queryForMap()
:将查询的结果集封装成Map集合,只能封装一条记录:键是字段名,值是字段值,结果集的记录数只能是1
-
queryForList()
:将结果集封装成List集合,在List集合中有多条记录,每一条记录都是一个Map集合:List<Map<Object,Object>> list
-
queryForObject()
:将结果集封装成一个对象,一般用于聚合函数,查询总记录数 int count()
DBUtils工具类
优化JDBC开发的流程,使开发者只注重业务需求,而不是关注繁琐的jdbc开发步骤
步骤:
-
先从官网下载DBUtils的jar包 放到cllasspath类路径下,也就是lib文件夹下面,依赖于数据源
-
还需要下载数据库连接池jar包 c3p0/druid,数据库的驱动jar包 和commts-logging.jar包
-
搭建数据源工具类 DruidDBUtil 可以获取数据源(使用的druid)
-
从数据源获取连接 -->DBUtils 来直接操作sql
-
aqi常用方法
-
update()
:执行DML语句 增删改操作 insert delete update
-
query()
: 执行DQL语句 查询 select
-
具体操作
-
构造QueryRunner类对象,依赖于数据源
-
根据操作的类型选择是update()
还是query()
-
update(sql,Object… parameters)
-
query(sql,ResultSetHandler接口实现类<对应的字节码对象类型>,Object… parameters)
-
对ResultSetHandle做了实现
-
BeanHandle
-->装配一个Bean对象(返回一条数据)
-
BeanListHandle
-->装配多个Bean对象(返回多条数据)
-
MapListHandle
-->装配多个Beam对象,每个对象被装配到Map集合中
-
ScalarHandler
-->返回值是long类型(查询表中的记录数)
-
代码
public class DBUtilsDemo01 {
//构建QueryRunner类对象 获取数据源
private static QueryRunner runner = new QueryRunner(DruidDBUtil.getDataSource());
public static void main(String[] args) throws SQLException {
//添加一条数据
//insertData();
//修改
//updateData();
//删除
//deleteData();
//查询一条
//System.out.println(queryOne());
//查询总信息值
//System.out.println(queryAll());
//查询总记录数
System.out.println(queryTotalNum());
}
//添加
public static void insertData(){
//往account表中添加一条数据
String sql = "insert into account values(null,?,?)";
try {
int count = runner.update(sql, "小花", 4000);
if (count > 0){
System.out.println("添加成功");
}else {
System.out.println("添加失败");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//修改
public static void updateData() throws SQLException {
int count = runner.update("update account set balance = ? where username = ?", 10000, "小花");
if (count > 0){
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
}
//删除
public static void deleteData() throws SQLException {
int count = runner.update("delete from account where username = ?", "小花");
if (count > 0){
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
}
//查询一条记录
public static Account queryOne() throws SQLException {
//BeanHandle 对ResultSetHandle做了实现
//查询id = 3的记录
return runner.query("select * from account where id = ?", new BeanHandler<Account>(Account.class), 3);//需要有Account类
}
//查询总信息值
public static List<Account> queryAll() throws SQLException {
//BeanListHandle
return runner.query("select * from account",new BeanListHandler<Account>(Account.class));
}
//查询总记录数
public static long queryTotalNum() throws SQLException {
//ScalarHandler
return runner.query("select count(id) from account where id > ?",new ScalarHandler<>(),2);
}
}