JDBC数据库连接池(Druid技术)

目录

1.初识数据库连接池和Druid

(1)简介

(2)实现

标准接口DataSource(javax.sql下):

(3)使用步骤

2.补充:数据库设计范式

3.补充:数据库的备份和恢复

4.补充:JUnit和Scanner

Scanner:学会看API

JUnit:

 Before和After

 5.补充:子查询回顾

 6.Druid工具类

工具类测试

7.JDBC Template(简单封装工具类)

(1)简介

(2)执行DML语句

//修改数据

//插入

//删除

(3)执行DQL语句

map

 list

 JavaBean

查询总记录数(巨额):


1.初识数据库连接池和Druid

(1)简介

(2)实现

标准接口DataSource(javax.sql下):

 一般是由厂商来实现的

(3)使用步骤

 jar包版本自己看呗

    public static void main(String[] args) throws Exception {
        //System.out.println(System.getProperty("user.dir"));
        //1.导入
        //2.定义配置文件
        //3.加载配置文件
        Properties pro = new Properties();
        pro.load(new FileInputStream("src/druid.properties"));
        //4.获取连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
        //5.获取数据库连接 connection
        Connection connection = dataSource.getConnection();

        System.out.println(connection);
    }

PS:

//System.out.println(System.getProperty("user.dir"));   load的地址要根据这一行的输出结果来填!!

2.补充:数据库设计范式

数据库设计三大范式_xiaoyangcv的博客-CSDN博客_数据库设计三大范式

3.补充:数据库的备份和恢复

navicat如何实现mysql备份与恢复-木庄网络博客

4.补充:JUnit和Scanner

Scanner:学会看API

 自己去看吧

这个写的也不错:   Scanner的各种用法_disgare的博客-CSDN博客_scanner用法

JUnit:

 例子:

 Before和After

 

 

 5.补充:子查询回顾

 PS:这些什么多行,单列指的是子查询的结果

 6.Druid工具类

public class JDBCUtils {
    //1.定义成员变量 DataSource
    private static DataSource ds;

    static {
        try {
            //1.加载配置文件
            Properties pro = new Properties();
            //.class是字节码文件;getClassLoader()返回类的类加载器ClassLoader;getResourceAsStream(String name),返回用于读取指定资源的输入流Inputr。
            //pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            pro.load(new FileInputStream("src/druid.properties"));
            //2.获取Datasource
            ds = DruidDataSourceFactory.createDataSource(pro);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    //3.获取连接
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    //4.释放资源
    public static void close(Statement stm, Connection con) throws SQLException {
       /* if (stm != null) {
            stm.close();
        }
        if (con != null) {
            con.close();
        }*/
        close(null, stm, con);
    }

    //重载
    public static void close(ResultSet rs, Statement stm, Connection con) throws SQLException {
        if (stm != null) {
            stm.close();
        }
        if (con != null) {
            con.close();
        }
        if (rs != null) {
            rs.close();
        }
    }

    //5.获取连接池
    public static DataSource getDataSource() {
        return ds;
    }


}

这就体现了数据封装和抽象的思想。

工具类测试

 public static void main(String[] args) throws SQLException {
        Connection conn = null;
        PreparedStatement pstm = null;

        //添加操作,给dept添加一条记录
        //获取连接:
        conn = JDBCUtils.getConnection();
        //定义sql
        String sql = "INSERT INTO dept(id,dname,loc) VALUES (?,?,?)";
        //获取pstm对象
        pstm = conn.prepareStatement(sql);
        //给?赋值
        pstm.setInt(1, 50);
        pstm.setString(2, "技术部");
        pstm.setString(3, "南京");
        //执行sql
        int i = pstm.executeUpdate();
        System.out.println(i);
        //释放资源
        JDBCUtils.close(pstm, conn);

    }

结果:

7.JDBC Template(简单封装工具类)

(1)简介

(2)执行DML语句

//修改数据

public static void main(String[] args) {
    //1.导入jar包
    //2.创建JDBCTemplate对象
    JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    //3.调用方法
    //这里不需要申请连接,不需要释放资源,他内部有处理,我们只要关注sql语句
    String sql="update emp set salary = 9000 where ename = ? ";
    int i = template.update(sql, "孙悟空");
    System.out.println(i);
}

//插入

String sql2 = "insert into emp(id,ename,salary) values(?,?,?)";
int i1 = template.update(sql2, 1015, "周星驰", 10011);//为什么这里就要是双引号,因为上面那个句子双引号外面已经有了,而双引号只能嵌套单引号
System.out.println(i1);

//删除

String sql3="delete from emp where ename = ?";
int i2 = template.update(sql3, "孙悟空");
System.out.println(i2);

(3)执行DQL语句

map

public void test2(){
    String sql="select * from emp where id = ?";
    Map<String, Object> t1 = template.queryForMap(sql, 1002);//这里只能返回一条记录
    System.out.println(t1);
    System.out.println(t1.values());
    System.out.println(t1.get("id"));
}

查询结果集的长度只能是1

结果:

{id=1002, ename=卢俊义, job_id=3, mgr=1006, joindate=2001-02-20, salary=16000.00, bonus=3000.00, dept_id=30}
[1002, 卢俊义, 3, 1006, 2001-02-20, 16000.00, 3000.00, 30]
1002

 list

 JavaBean

注意一下rowmapperBeanPropertyRowMapper的实现过程_Qiuyuguohou的博客-CSDN博客_beanpropertyrowmapper

法一:自己写匿名内部类

        String sql = "select * from emp";
        List<Emp> query = template.query(sql, new RowMapper<Emp>() {//这个emp我们必须先自己写好

            @Override
            public Emp mapRow(ResultSet resultSet, int i) throws SQLException {
                Emp emp = new Emp();
                int id = resultSet.getInt("id");
                String ename = resultSet.getString("ename");
                String date = resultSet.getString("joindate");
                double salary = resultSet.getDouble("salary");
                emp.setId(id);
                emp.setSalary(salary);
                emp.setJoindate(date);
                emp.setEname(ename);

                return emp;
            }
        });

        for (Emp emp : query) {
            System.out.println(emp.toString());
        }

缺点:没有简化我们的书写

法二:用它写好的几个接口:

@Test
public void test4() {
    String sql = "select * from emp";
    //这里只要传入泛型,然后指定字节码文件即可
    List<Emp> emps = template.query(sql, new BeanPropertyRowMapper<Emp>(Emp.class));
    for (Emp emp : emps) {
        System.out.println(emp);
    }
}

但是注意,这里面我们自己定义的Emp,里面如果有基本数据类型int、double,那么我们表里面要是有对应的null,就会报错,因为基本数据类型不接受Null,于是我们要改成引用更好,即封装类:Integer Double这些。

查询总记录数(巨额):

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值