理解JDBC、Connection、Session、连接池
2017-09-13 本文已影响0人
沐兮_d64c
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规范。