以下内容参考自b站黑马程序
部分技术已过时ಥ_ಥ经典白学系列
连接池
- 定义:连接池是创建和管理一个连 接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
装有连接的容器,使用连接的话,可以从连接池中进行获取,使用完成之后将连接归还给连接池- 作用:连接对象创建和销毁是需要耗费时间的,在服务器初始化的时候就初始化一些连接。把这些连接放入到内存中,使用的时候可以从内存中获取,使用完成之后将连接放入连接池中。从内存中获职和归还的效率要远远高于创建和销毁的效率。
- 自定义连接池
- 编写一个类实现DataSource接口
- 重写getConnection方法
- 初始化多个连接在内存中
- 编写归还连接的方法
实现DataSource的接口
代码实现
package project2;
import java.io.PrintWriter;
/*
* 自定义的连接池
*/
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.sql.DataSource;
public class MyDataSource implements DataSource {
//将一些连接存入内存中,可以定义一个集合,用于存储连接对象。
private List<Connection> connList = new ArrayList<Connection>();
//在初始化的时候,提供一些连接,构造方法
public MyDataSource(){
//初始化连接
for(int i = 1;i<=3;i++) {
//向集合中存入连接
try {
connList.add(getConnection());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//从连接池中获取连接的方法。
@Override
public Connection getConnection() throws SQLException {
// 不能拿到同一个连接,即使用的连接就移除
Connection conn = connList.remove(0);
return conn;
}
//编写归还连接的方法
public void addBack(Connection connection) {
connList.add(connection);
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
// TODO Auto-generated method stub
return null;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
// TODO Auto-generated method stub
return false;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public PrintWriter getLogWriter() throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
// TODO Auto-generated method stub
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
// TODO Auto-generated method stub
}
@Override
public int getLoginTimeout() throws SQLException {
// TODO Auto-generated method stub
return 0;
}
}
测试连接
package project2;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DataSourceTest {
MyDataSource dataSource = null;
public void demo1() {
// 测试自定义连接池
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 获取连接,从连接池中获取连接
//conn = JdbcUtils.getConnection();
dataSource = new MyDataSource();
conn = dataSource.getConnection();
// 编写sql
String sqlString = "select * from account";
// 预编译sql
pstmt = conn.prepareStatement(sqlString);
rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt("id" + " " + rs.getString("name") + " " + rs.getDouble("money")));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//JdbcUtils.release(rs, pstmt, conn);
//归还连接
dataSource.addBack(conn);
}
}
}
开源连接池的使用
- Druid
- 定义:Druid阿里旗下开源连接池产品,使用非常简单,可以与Spring框架进行快速整合。
- 相关jar包:
- 手动设置的方式:
- 使用配置的方式
改进工具类
DbUtils
- 定义:Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。对JDBC的简单封装,而且没有影响性能
- 作用:JDBC手写比较麻烦,而且有比较多的代码是类似的,比如获取连接,预编译SQL,释放资源等,那么可以将这些代码抽取出来放到工具类中,将类似的代码进行抽取。
- DBUtils的 API的概述
- QueryRunner对象:核心运行类
- 构造方法:无参构造和有参构造
- 方法:
- 执行批处理
- Class DbUtils
- 方法:事务相关操作
DBUtils增删改操作
- 添加
- 修改
- 删除
- 查找
- 查询一条对象:创建一个对象Account,用于存储从数据库中查到的数据。
- 查询多条记录
ResultSetHandler的实现类
- ArrayHandler和ArrayListHandler
- ArrayHandler:将一条记录封装到一个数组当中,这个数组应该是Object[]。
- ArrayListHandler:将多条记录封装到一个装有Object[]的List集合中。
- BeanHandler和BeanListHandler
- BeanHandler:将一条记录封装到一个JavaBean(Java对象)中
- BeanHandler:将多条记录封装到一个JavaBean的List集合中
- MapHandler和MapListHandler
- MapHandler:将一条记录封装到一个Map中,Map的key是列名,values就是表中列的记录值
- MapListHandler:将多条记录封装到一个装有Map的List集合中
- ColumnListHandler、ScalarHandler. KeyedHandler
- ColumnListHandler:将数据中的某列封装到list集合中
- ScalarHandler:将单个值封装
mysql中count是long类型,能不能用Integer来接受- KeyedHandler(了解):将一条记录封装到一个Map集合中。将多条记录封装到一个装有Map集合的Map集合中。而且外面的Map的key是可以指定的。