Java 数据库连接池使用

1,使用数据库连接池工具基础

在同一包下建立utils文件,文件中定义JDBC_druid_pool 类

package utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBC_druid_pool {
    public static DataSource ds;
    static {
        Properties pro = new Properties();
        InputStream is = JDBC_druid_pool.class.getClassLoader().getResourceAsStream("druid.properties");
        try {
            pro.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //获取连接池的方法
    public static DataSource get_dataSource(){
        return ds;
    }

    public static Connection get_connection() throws Exception {
        return ds.getConnection();
    }

    //关闭连接池以及 Statement
    public static void close(Statement stmt, Connection conn){
        close(null,stmt,conn);  //简写,会掉用下面的close方法
    }
    //
    public static void close(ResultSet res,Statement stmt,Connection conn){
        if(res != null){
            try {
                res.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

  

2,在主程序中使用连接池

package cn.itcast.jdbcDemo;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import utils.JDBC_druid_pool;

import javax.sql.DataSource;
import javax.swing.*;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

/**
 * druid 连接池使用,这样也不太好,还是要使用工具类的方式来使用
 */
public class JDBC_pool {
    public static void main(String[] args) {
        //1,导入jar包
        //2,定义配置文件
        //3,加载配置文件
//        Properties pro = new Properties();
//        InputStream is = JDBC_pool.class.getClassLoader().getResourceAsStream("druid.properties");
//        pro.load(is);
//        DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//
//        for (int i=0;i<11;i++){
//            Connection conn = ds.getConnection();
//            System.out.println(conn);
//            if (i==5){
//                conn.close();
//            }
//        }

        // 工具类数据库连接池使用
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet res = null;
        try {
            // 获取连接
            conn = JDBC_druid_pool.get_connection();
            // 定义sql
            String sql = "select * from student where sno < ?";
            pstmt = conn.prepareStatement(sql);
            // 给sql赋值, 有setString,setDouble等
            pstmt.setInt(1, 5);
            res = pstmt.executeQuery();     //执行查询
//            res = pstmt.executeUpdate(sql)  // 执行DML语句 (增,删,改)

            if (res.next()) {  //游标要到数据区
                System.out.println(res.getInt("sclass"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBC_druid_pool.close(res, pstmt, conn);
        }
    }
}

 

2,使用连接池返回封装自定义数据类型

  

 

 

  2.1  定义数据库对应类 ,一般就和表名称对应就可以,放在src同级下自己随便建的一个包中就可以

package cn.itcast.domain;

public class EmpObj {
    // 注意点,这里使用包装类,使用基本数据类型字段为空时会报错
    public Integer empid;
    public String name;
    public String deptno;
    public String duty;
    public Integer sal;

    public Integer getEmpid() {
        return empid;
    }

    public void setEmpid(Integer empid) {
        this.empid = empid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDeptno() {
        return deptno;
    }

    public void setDeptno(String deptno) {
        this.deptno = deptno;
    }

    public String getDuty() {
        return duty;
    }

    public void setDuty(String duty) {
        this.duty = duty;
    }

    public Integer getSal() {
        return sal;
    }

    public void setSal(Integer sal) {
        this.sal = sal;
    }

    @Override
    public String toString() {
        return "EmpObj{" +
                "empid=" + empid +
                ", name='" + name + '\'' +
                ", deptno='" + deptno + '\'' +
                ", duty='" + duty + '\'' +
                ", sal=" + sal +
                '}';
    }
}

  2.2  也是要导入Spring Template 的jar包, 文件中定义JDBC_druid_pool 类

   具体代码在最上面

  2.3 使用:

// 1,修改emp表id为1的sal为2200
// 1,添加一条记录
// 2,删除刚添加的记录
// 2,查询id为1的数据封装为Map
// 3,查询所有记录,封装为list
// 4,查询所有记录,封装为Emp对象的list集合
// 5,查询总的记录数

  我是使用单元测试来做的,这样就不用一个个的写到主程序中, 重点看t5  t7, t8  经常要用。

package cn.itcast.jdbcDemo;

import cn.itcast.domain.EmpObj;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import utils.JDBC_druid_pool;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

public class domain_jdbcDemo {
    private JdbcTemplate template = new JdbcTemplate(JDBC_druid_pool.get_dataSource());
    // Junit 单元测试  用单元测试就不用主方法就可以运行了
//    @Test
    public void test1(){
        System.out.println("测试执行");
        int a = 3/0;
    }
    @Test
    public void test2(){
        System.out.println("测试执行");
    }

    // 1,修改emp表id为1的sal为2200
    @Test
    public void t1(){
        String sql = "update emp set sal = ? where empid =1";
        int count = template.update(sql,2500);
        System.out.println(count);
    }

    // 1,添加一条记录
//    @Test
    public void t2(){
        String sql = "insert into emp(empid,name,deptno) values(11,'wangjun',01)";
        int count = template.update(sql);
        System.out.println(count);
    }
    // 2,删除刚添加的记录
    @Test
    public void t3(){
        String sql = "delete from emp where empid=?";
        int count = template.update(sql,9);
        System.out.println(count);
    }
    // 2,查询id为1的数据封装为Map
    @Test
    public void t4(){
        String sql = "select * from emp where empid=?";
        Map<String, Object> map = template.queryForMap(sql, 1);  // 结果只能是一条
        System.out.println(map);
        System.out.println(map.get("duty"));
        System.out.println(map.get("sal"));
    }
    // 3,查询所有记录,封装为list
    @Test
    public void t5(){
        String sql = "select * from emp";
        List<Map<String, Object>> maps = template.queryForList(sql);
        System.out.println(maps);
        for (Map i:maps){
            System.out.println(i);
            System.out.println(i.get("duty"));
        }
    }
    // 4,查询所有记录,封装为Emp对象的list集合
    // 这个方法是自己写最原始的方法
    @Test
    public void t6(){
        String sql = "select * from emp";
        List<EmpObj> lis = template.query(sql, new RowMapper<EmpObj>() {
            @Override
            public EmpObj mapRow(ResultSet res, int i) throws SQLException {
                EmpObj emp = new EmpObj();
                int empid = res.getInt("empid");
                String name = res.getString("name");
                String deptno = res.getString("deptno");
                String duty = res.getString("duty");
                int sal = res.getInt("sal");

                emp.setEmpid(empid);
                emp.setName(name);
                emp.setDeptno(deptno);
                emp.setDuty(duty);
                emp.setSal(sal);
                return emp;
            }
        });
        System.out.println(lis);
    }

    //4,查询所有记录,封装为Emp对象的list集合
    // 用Sprint JDBC Template 封装好的模板做, 简化代码BeanPropertyRowMapper
    @Test
    public void t7(){
        String sql = "select * from emp";
        List<EmpObj> lis = template.query(sql,new BeanPropertyRowMapper<>(EmpObj.class));
        for (EmpObj i:lis){
            System.out.println(i);
        }
    }

    // 5,查询总的记录数
    // queryForObject 一般是使用查询聚合函数的,
    // Long.class 返回的数据类型
    @Test
    public void t8(){
        String sql = "select count(empid) from emp";
        Long totle = template.queryForObject(sql, Long.class);
        System.out.println(totle);
    }
}

  

  

 

posted @ 2021-04-27 11:16  王军的个人博客  阅读(364)  评论(0编辑  收藏  举报