理解JDBC、Connection、Session、连接池

1,JDBC分析
image.png

1)概念

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


    image.png
  • 数据库驱动程序:不同数据库厂商对于JDBC接口实现,即对Connection等接口的实现类的jar文件。
    eg:mysql-connector-java-5.1.38.jar,使用jdbc连接不同的数据库需要加载不同的驱动(Driver)。
    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规范。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,946评论 18 399
  • 本文包括传统JDBC的缺点连接池原理自定义连接池开源数据库连接池DBCP连接池C3P0连接池Tomcat内置连接池...
    廖少少阅读 16,837评论 0 37
  • JDBC概述 在Java中,数据库存取技术可分为如下几类:JDBC直接访问数据库、JDO技术、第三方O/R工具,如...
    usopp阅读 8,862评论 3 75
  • 我拥有寻找美好的眼睛。 我拥有追求自我的勇气。 我拥有被人关怀的场域。 我拥有上进努力的伙伴。
    洁丽1688阅读 858评论 0 0
  • 大三下学期和罗辰悦 张莉说好来一次大学最后的旅行 走吧 那就去明月山 张莉买好了去宜春的火车票 五一当天下午我们乘...
    琉青文阅读 3,280评论 0 1