JDBC原生连接与连接池介绍

1. 步骤


  1. Class.forName()加载数据库连接驱动。


    第一种:直接注册数据库驱动 DriverManager.registerDriver(new Driver());
    第二种:利用反射机制间接加载数据库驱动,Class.forName(“com.mysql.jdbc.Driver”);(常用)

  2. 负责管理JDBC驱动程序的类 DriverManager 会识别加载的驱动程序,DriverManager.getConnection()获取数据连接对象;

  3. 获取Connection对象的实例,有 2 种方式 Statement、PreparedStatement
  4. 返回的结果用 ResultSet 类来处理。
  5. 关闭结果集、关闭会话、关闭连接出现异常时,对事物进行回滚。

例子

public class Test {
    public static void main(String[] args) throws Exception {
        //注册驱动,反射方式加载
        Class.forName("com.mysql.jdbc.Driver");
        //设置url
        String url = "jdbc:mysql://127.0.0.1:3306/day08";//person是数据库名,连接是数据库须要开启
        //设置用户名
        String username = "root";
        //设置密码
        String password = "root";
        //获得连接对象
        Connection con = DriverManager.getConnection(url, username, password);
        //System.out.println(con);
        //获得执行者对象
        String sql = "select * from phones";
        PreparedStatement ps = con.prepareStatement(sql);
        //获得结果集
        ResultSet rs = ps.executeQuery();
        //结果集处理,
        while(rs.next()){
            System.out.println(rs.getString("id")+"  "+rs.getString("pinpai")+"  "+rs.getString("xinghao")+"  "+rs.getString("jiage"));
        }
        //释放资源
        rs.close();
        ps.close();
        con.close();
    }
}

2. CreateStatement(Statement) 和 PrepareStatement 的区别与优劣。

  • 使用CreateStatement方法创建了stmt对象,再通过他查询的一部分语句片段。
String sql = "select * from users where  username= '"+username+"' and userpwd='"+userpwd+"'";  
stmt = conn.createStatement();  
rs = stmt.executeQuery(sql);
  • 使用PrepareStatement方法创建了pstmt对象,再通过这个对象查询的一部分语句片段。
String sql = "select * from users where  username=? and userpwd=?";  
pstmt = conn.prepareStatement(sql);  
pstmt.setString(1, username);  
pstmt.setString(2, userpwd);  
rs = pstmt.executeQuery(); 
  • PrepareStatement跟Statement的主要区别就是把sql语句中的变量抽出来了。PrepareStatement可提高代码的可读性。
  • PreparedStatement 变量可以用占位符的方式去表示,可以防止sql注入
  • PreparedStatement 接口继承 Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象。
  • 作 为 Statement 的 子 类 , PreparedStatement 继 承 了 Statement 的 所 有 功 能 。 三 种 方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数

  • 在 JDBC 应用中,在任何时候都不要使用 Statement:

    1. 代码的可读性和可维护性.Statement 需要不断地拼接,而 PreparedStatement 不会。
    2. PreparedStatement 尽最大可能提高性能.DB 有缓存机制,相同的预编译语句再次被调用不会再次需要编译。
    3. 最重要的一点是极大地提高了安全性.Statement 容易被 SQL 注入,而 PreparedStatementc 传入的内容不会和 sql 语句发生任何匹配关系

3. 连接池

  • 关系数据库中连接池的机制是什么?—–为数据库连接建立一个缓冲池。
    1. 从连接池获取或创建可用连接
    2. 使用完毕之后,把连接返回给连接池
    3. 在系统关闭前,断开所有连接并释放连接占用的系统资源
    4. 能够处理无效连接,限制连接池中的连接总数不低于或者不超过某个限定值。

概念:
* 最小连接数是连接池一直保持的数据连接。如程序对数据库连接的使用量不大,将有大量的数据库连接资源被浪费。
* 最大连接数是连接池能申请的最大连接数。如数据连接请求超过此数,后面的数据连接请求将被加入到等待队列中,这会影响之后的数据库操作。
* 如果最小连接数与最大连接数相差太大,最先的连接请求将会获利,之后超过最小连接数量的连接请求等
价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接
池中等待重复使用或是空闲超时后被释放。
* 可这样理解:数据库池连接数量一直保持一个不少于最小连接数的数量,数量不够时,数据库会创建一些连接,直到一个最大连接数,之后连接数据库就会等待。

猜你喜欢

转载自blog.csdn.net/liyifan687/article/details/80076054