目录

1. 数据库连接池

2. 德鲁伊连接池使用

3.ThreadLocal

4. 封装连接池工具类

5. DBUtils使用


1. 数据库连接池

1、什么是数据库连接池

java配置德鲁伊sql监控 jdbc德鲁伊_bc

 

2、使用连接池,可以自己创建连接池,实现DataSource接口就可以了,但是实际操作中,一般不去自己实现,使用开源连接池进行使用


3、常用开源连接池:DBCP、C3P0、Druid(德鲁伊)


4、使用德鲁伊连接,引入jar包

java配置德鲁伊sql监控 jdbc德鲁伊_database_02

 

2. 德鲁伊连接池使用

1、导入德鲁伊连接池jar包

java配置德鲁伊sql监控 jdbc德鲁伊_bc_03

 

2、编写德鲁伊连接池代码

(1)创建properties类型配置文件,设置数据库连接池信息

java配置德鲁伊sql监控 jdbc德鲁伊_database_04

/**
 * 德鲁伊连接池
 */
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包

java配置德鲁伊sql监控 jdbc德鲁伊_bc_05

 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();
}