本栏博客目录
Serlvet笔记一(Servlet基础)Servlet笔记二(请求和响应)Servlet笔记三(会话及其会话技术)Servlet笔记四(JSP技术)Servlet笔记五(EL表达式和JSTL)Servlet笔记六(Servlet 高级) Servlet笔记七(JDBC)
Servlet笔记八(数据库连接池与DBUtils工具)Servlet笔记九(JSP 开发模型)Servlet笔记十(文件上传和下载)
文章目录
- 简介
- Driver 接口
- DriverManager 类
- Connection 接口
- Statement 接口
- PreparedStatenent 接口
- ResultSet 接口
- 使用
- JDBCTest
- PrepareStatement 使用
- JDBCUtils 封装
简介
JDBC 的全称是 Java 数据库连接(Java Database Connectivity),它是一套用于执行 SQL 语句的 Java API。应用程序可以通过这套 API 连接到关系型数据库,并使用 SQL 语句来完成对数据库中数据的查询、更新、新增和删除的操作。
JDBC 要求各个数据库厂商按照统一的规范来提供数据库驱动联系,所以用户就不必直接与底层的数据库交互,这使得代码的通用性更强。
JDBC 在应用程序与数据库之间起到了一个桥梁作用。当应用程序使用 JDBC 访问特定的数据库时,需要通过不同数据库驱动与不同得到数据库进行连接,连接后即可对数据库进行相应的操作。
Driver 接口
Driver 接口是所有 JDBC 驱动程序必须实现的接口,该接口专门提供给数据库厂商使用。需要注意的是,在编写 JDBC 程序时,必须要把所使用的数据库驱动程序或类库加载到项目的 classpath 中(这里指 MySQL 驱动 JAR 包)。
DriverManager 类
DriverManager类用于加载JDBC驱动并且创建与数据库的连接。在DriverManager类中,定义了两个比较重要的静态方法,如表所示。
Connection 接口
Connection接口代表Java程序和数据库的连接,只有获得该连接对象后才能访问数据库,并操作数据表。在Connection接口中,定义了一系列方法,其常用方法如表所示。
Statement 接口
Statement接口用于执行静态的SQL语句,并返回一个结果对象,该接口的对象通过
Connection实例的createStatement()方法获得。利用该对象把静态的SQL语句发送到数据库编译执行,然后返回数据库的处理结果。在Statement接口中,提供了3个常用的执行SQL语句的方法,具体如表9-3所示。
PreparedStatenent 接口
Statement 接口封装了 JDBC 执行 SQL 语句的方法,可以完成 Java 程序执行 SQL 语句的操作。然而,在实际开发过程中往往需要将程序中的变量作为SQL语句的查询条件,而使用 Statement 接口操作这些 SQL 语句会过于繁琐,并且存在安全方面的问题。针对这一问题,JDBC API 提供了扩展的 PreparedStatement 接口。PreparedStatement 是 Statement 的子接口,用于执行预编译的SQL语句。该接口扩展了带有参数SQL语句的执行操作,应用该接口中的SQL语句可以使用占位符 “?” 来代替其参数,然后通过setXxx() 方法为SQL语句的参数赋值。PreparedStatement接口中,提供了一些常用方法,具体如表所示。
ResultSet 接口
ResultSet 接口用于保存 JDBC 执行查询时返回的结果集,该结果集封装在一个逻辑表格中。在 ResultSet 接口内部有一个指向表格数据行的游标(或指针), ResultSet 对象初始化时,游标在表格的第 1 行之前,调用 next() 方 法可将游标移动到下一行。如果下一行没有数据,则返回 false。在应用程序中经常使用 next() 方法作为 while 循环的条件来迭代ResultSet 结果集。
ResultSet接口中的常用方法如表所示。
从表中可以看出,ResultSet 接口中定义了大量的 getXxx() 方法,而采用哪种 getXxx() 方法取决于字段的数据类型。程序既可以通过字段的名称来获取指定数据,也可以通过字段的索引来获取指定的数据,字段的索引是从 1 开始编号的。例如,数据表的第1列字段名为 id,字段类型为 int,那么既可以使用 getInt(1) 字段索引的方式获取该列的值,也可以使用getnt(“id”) 字段名称的方式获取该列的值。
使用
User 类
package com.xxx;
public class User {
private int id;
private String name;
private String username;
private String pass;
private String email;
public User() {
}
public User(int id, String name, String username, String pass, String email) {
this.id = id;
this.name = name;
this.username = username;
this.pass = pass;
this.email = email;
}
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", username='" + username + '\'' +
", pass='" + pass + '\'' +
", email='" + email + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
JDBCTest
package com.xxx;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class JDBCTest {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
List<User> users = new ArrayList<>();
try{
// 1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2. 通过 DriverManager 获取数据库连接
String url = "jdbc:mysql://localhost:3306/javatask";
String username = "root";
String password = "root";
conn = DriverManager.getConnection(url, username, password);
// 3. 通过 Connection 创建 Statement 对象
stmt = conn.createStatement();
// 4. 使用 Statement 对象执行 Sql 语句
rs = stmt.executeQuery("select * from user");
// 遍历 ResultSet 结果集
while(rs.next()){
User u = new User();
u.setId(rs.getInt("id"));
u.setName(rs.getString("name"));
u.setUsername(rs.getString("username"));
u.setPass(rs.getString("pass"));
u.setEmail(rs.getString("email"));
users.add(u);
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally {
// 6. 关闭资源
if(rs != null){
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
for(User u: users){
System.out.println(u);
}
}
}
PrepareStatement 使用
package com.xxx;
import java.sql.*;
import java.util.Scanner;
public class PrepareStatmentTest {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/javatask";
String username = "root";
String password = "root";
conn = DriverManager.getConnection(url, username, password);
// ? 是占位符
pstmt = conn.prepareStatement("select * from user where id=?");
System.out.println("请输入要查找的用户的id(整数)...");
Scanner scan = new Scanner(System.in);
int id = scan.nextInt();
pstmt.setInt(1, id);
// pstmt.setObject(1, id);
rs = pstmt.executeQuery();
while (rs.next()){
System.out.println("id="+rs.getInt(1)
+ ",name=" + rs.getString("name")
+ ",pass="+rs.getString("pass"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
// 6. 关闭资源
if(rs != null){
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(pstmt != null){
try {
pstmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
}
JDBCUtils 封装
package com.xxx;
import java.sql.*;
public class JDBCUtils {
public static Connection getConn() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/javatask";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
// 关闭资源
public static void release(Statement stmt, Connection conn){
if(stmt != null){
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
public static void release(ResultSet rs, Statement stmt, Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
release(stmt, conn);
}
}
MyJDBCTest
package com.xxx;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
public class MyJDBCTest {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
List<User> users = new ArrayList<>();
try {
conn = JDBCUtils.getConn();
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from user");
while (rs.next()){
User u = new User();
u.setId(rs.getInt("id"));
u.setName(rs.getString("name"));
u.setUsername(rs.getString("username"));
u.setPass(rs.getString("pass"));
u.setEmail(rs.getString("email"));
users.add(u);
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.release(rs, stmt, conn);
}
for(User u: users){
System.out.println(u);
}
}
}