理解JDBC、Connection、Session、连接池

1,JDBC分析 《理解JDBC、Connection、Session、连接池》 image.png

1)概念

  • Java Database Connectivity:java数据库连接。是Java中,规范client如何来访问数据库API接口,(类比于Servlet规范)。
    在jdk的rt.jar库文件中,定义了Connection接口,DriverManager类,PreparedStatement接口等。

    《理解JDBC、Connection、Session、连接池》 image.png

  • 数据库驱动程序:不同数据库厂商对于JDBC接口实现,即对Connection等接口的实现类的jar文件。
    eg:mysql-connector-java-5.1.38.jar,使用jdbc连接不同的数据库需要加载不同的驱动(Driver)。
    《理解JDBC、Connection、Session、连接池》 image.png

2)使用jdbc

  • 加载JDBC驱动程序 → 建立数据库连接Connection → 创建执行SQL的语句Statement → 处理执行结果ResultSet → 释放资源
  • java任何class都要加载到JVM中才能运行。加载类会执行该类的静态代码段,DriverManager在决定使用哪个Driver时,通过遍历所有已注册的驱动来尝试获取连接,(第一个)成功就返回。
//当com.mysql.jdbc.Driver被加载时,会注册驱动到DriverManager,执行以下代码。
static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }
String url="jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF8"; 
String url="jdbc:oracle:thin:@localhost:1521:mydb";
String url="jdbc:sqlserver://localhost:1433;DatabaseName=mydb";
Class.forName("com.mysql.jdbc.Driver") ;  
Class.forName("oracle.jdbc.driver.OracleDriver"); 
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
Connection conn = DriverManager.getConnection(url,name,password); 
stmt = conn.createStatement();
String sql = "select id, username from account where id = " + id;//sql注入,id = "1 or 1=1"就会返回所有数据。
//`select * from user_admin where id = 1 or 1 = 1;`
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){ 
          int id = rs.getLong("id");
          String username = rs.getString("username"); 
          System.out.print("ID: " + id); 
          System.out.println("username: " + username); 
} 
rs.close(); 
stmt.close(); 
conn.close();

//防止sql注入。
String sql = "select id, username from account where id = ?";
PreparedStatement ps = conn.preparedStatement(sql); 
ps.setLong("1", 1L);

2,Connection 和 Session

  • 连接(connection)是一个物理的概念,它指的是一个通过网络建立的客户端和mysql服务器的一个网络连接。
  • 会话(Session)是不同的用户,与mysql实例(进程)建立的。
  • 一个连接可以拥有多个会话也可以没有会话,同一个连接上的不同会话之间不会相互影响。
  • 一个会话可以创建多个事务。(使用客端登录到数据库)
  • 一个事务只能由一个会话产生。

3,数据库连接池。(druid, c3p0, dbcp等)

  • 数据库连接池负责分配、管理和释放数据库连接,允许应用程序重复使用一个现有的数据库连接。
  • 连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。

3,几个对比

1)jdbc,jdbctemplate,dbutils
jdbc是java数据库连接。
jdbctemplate是springframework-jdbc中对jdbc的封装。
dbutils是对jdbc的轻量级封装。
2)jpa,hibernate jpa,spring-data-jpa
jpa是Java Persistence API 是java持久化api。
hibernate jpa实现类jpa规范。
spring-data-jpa实现了jpa规范。

    原文作者:沐兮_d64c
    原文地址: https://www.jianshu.com/p/a96bf3cc313f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞