目录
1. 数据库连接池
2. 德鲁伊连接池使用
3.ThreadLocal
4. 封装连接池工具类
5. DBUtils使用
1. 数据库连接池
1、什么是数据库连接池
2、使用连接池,可以自己创建连接池,实现DataSource接口就可以了,但是实际操作中,一般不去自己实现,使用开源连接池进行使用
3、常用开源连接池:DBCP、C3P0、Druid(德鲁伊)
4、使用德鲁伊连接,引入jar包
2. 德鲁伊连接池使用
1、导入德鲁伊连接池jar包
2、编写德鲁伊连接池代码
(1)创建properties类型配置文件,设置数据库连接池信息
/**
* 德鲁伊连接池
*/
public class PoolDemo1 {
public static void main(String[] args) throws Exception {
//读取properties内容
Properties properties = new Properties();
//properties.load(new FileInputStream("C:\\Users\\lenovo\\Desktop\\0621\\jdbc_database\\src\\db.properties"));
//通过类加载器读取类路径下内容
properties.load(PoolDemo1.class.getClassLoader().getResourceAsStream("db.properties"));
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
//通过返回数据源对象,获取数据库连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
}
3.ThreadLocal
JDK 1.2的版本中就提供java.lang.ThreadLocal,为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。
ThreadLocal用于保存某个线程共享变量,原因是在Java中,每一个线程对象中都有一个ThreadLocalMap<ThreadLocal, Object>,其key就是一个ThreadLocal,而Object即为该线程的共享变量。而这个map是通过ThreadLocal的set和get方法操作的。对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量。
1、ThreadLocal.get: 获取ThreadLocal中当前线程共享变量的值。
2、ThreadLocal.set: 设置ThreadLocal中当前线程共享变量的值。
3、ThreadLocal.remove: 移除ThreadLocal中当前线程共享变量的值。
4. 封装连接池工具类
/**
* 数据库连接池工具类
*/
public class JdbcUtils {
//定义成员变量
private static DataSource dataSource;
private static ThreadLocal<Connection> threadLocal;
//静态代码块
static {
try {
//加载连接池配置文件,创建DataSource
Properties properties = new Properties();
properties.load(JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties"));
dataSource = DruidDataSourceFactory.createDataSource(properties);
//初始化threadLocal对象
threadLocal = new ThreadLocal<>();
} catch (Exception e) {
e.printStackTrace();
}
}
//获取数据库连接池连接
public static Connection getConnection() {
//1 ThreadLocal可以把线程和连接绑定在一起
//从ThreadLocal获取连接
Connection connection = threadLocal.get();
//如果获取不到,dataSource取出来,放到ThreadLocal里面
if(connection == null) {
try {
connection = dataSource.getConnection();
threadLocal.set(connection);
} catch (SQLException e) {
e.printStackTrace();
}
}
//如果获取到,直接返回
return connection;
}
//释放资源
public void closeResource() {
Connection connection = threadLocal.get();
if(connection != null) {
try {
//close()
connection.close();
threadLocal.remove();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}使用封装工具类public class TestUtils {
public static void main(String[] args) {
PreparedStatement preparedStatement = null;
ResultSet rs = null;
try {
//获取数据库连接
Connection connection = JdbcUtils.getConnection();
String sql = "select * from dept";
preparedStatement = connection.prepareStatement(sql);
rs = preparedStatement.executeQuery();
while(rs.next()) {
System.out.println(rs.getString("dname"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
rs.close();
preparedStatement.close();
JdbcUtils.closeResource();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
5. DBUtils使用
1、Apache-DBUtils是针对jdbc封装的工具类,使用DBUtils简化jdbc开发代码,没有改变jdbc效率
2、导入DBUtils的jar包
3、增加、修改和删除
//删除操作
@Test
public void test03() throws Exception {
//创建QueryRunner对象
QueryRunner queryRunner = new QueryRunner();
// 编写sql语句
String sql = "delete from dept where did=?";
//调用方法执行sql
queryRunner.update(JdbcUtils.getConnection(),sql,200);
//释放资源
JdbcUtils.closeResource();
}
//修改操作
@Test
public void test02() throws Exception {
//创建QueryRunner对象
QueryRunner queryRunner = new QueryRunner();
// 编写sql语句
String sql = "update dept set dname=? where did=?";
//调用方法执行sql
queryRunner.update(JdbcUtils.getConnection(),sql,"研发测试部",200);
//释放资源
JdbcUtils.closeResource();
}
//添加操作
@Test
public void test01() throws Exception {
//创建QueryRunner对象
QueryRunner queryRunner = new QueryRunner();
// 编写sql语句
String sql = "insert into dept values(?,?)";
//调用方法执行sql
queryRunner.update(JdbcUtils.getConnection(),sql,200,"测试部");
//释放资源
JdbcUtils.closeResource();
}
4、查询操作
//查询操作-返回一条记录
@Test
public void test01() throws Exception {
//创建QueryRunner对象
QueryRunner runner = new QueryRunner();
//编写sql
String sql = "select * from dept where did=?";
//调用方法执行sql语句
Dept dept =
runner.query(JdbcUtils.getConnection(),sql,new BeanHandler<Dept>(Dept.class),1);
System.out.println(dept);
//释放资源
JdbcUtils.closeResource();
}
//查询操作-返回多条记录
@Test
public void test02() throws Exception {
QueryRunner runner = new QueryRunner();
String sql = "select * from dept";
List<Dept> list =
runner.query(JdbcUtils.getConnection(), sql, new BeanListHandler<Dept>(Dept.class));
System.out.println(list);
JdbcUtils.closeResource();
}