0
点赞
收藏
分享

微信扫一扫

Servlet笔记七(JDBC)

本栏博客目录

​​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 访问特定的数据库时,需要通过不同数据库驱动与不同得到数据库进行连接,连接后即可对数据库进行相应的操作。

Servlet笔记七(JDBC)_数据库

Driver 接口

Driver 接口是所有 JDBC 驱动程序必须实现的接口,该接口专门提供给数据库厂商使用。需要注意的是,在编写 JDBC 程序时,必须要把所使用的数据库驱动程序或类库加载到项目的 classpath 中(这里指 MySQL 驱动 JAR 包)。

DriverManager 类

DriverManager类用于加载JDBC驱动并且创建与数据库的连接。在DriverManager类中,定义了两个比较重要的静态方法,如表所示。

Servlet笔记七(JDBC)_数据库_02

Connection 接口

Connection接口代表Java程序和数据库的连接,只有获得该连接对象后才能访问数据库,并操作数据表。在Connection接口中,定义了一系列方法,其常用方法如表所示。

Servlet笔记七(JDBC)_java_03

Statement 接口

Statement接口用于执行静态的SQL语句,并返回一个结果对象,该接口的对象通过
Connection实例的createStatement()方法获得。利用该对象把静态的SQL语句发送到数据库编译执行,然后返回数据库的处理结果。在Statement接口中,提供了3个常用的执行SQL语句的方法,具体如表9-3所示。

Servlet笔记七(JDBC)_sql_04

PreparedStatenent 接口

Statement 接口封装了 JDBC 执行 SQL 语句的方法,可以完成 Java 程序执行 SQL 语句的操作。然而,在实际开发过程中往往需要将程序中的变量作为SQL语句的查询条件,而使用 Statement 接口操作这些 SQL 语句会过于繁琐,并且存在安全方面的问题。针对这一问题,JDBC API 提供了扩展的 PreparedStatement 接口。PreparedStatement 是 Statement 的子接口,用于执行预编译的SQL语句。该接口扩展了带有参数SQL语句的执行操作,应用该接口中的SQL语句可以使用占位符 “?” 来代替其参数,然后通过setXxx() 方法为SQL语句的参数赋值。PreparedStatement接口中,提供了一些常用方法,具体如表所示。

Servlet笔记七(JDBC)_sql_05

ResultSet 接口

ResultSet 接口用于保存 JDBC 执行查询时返回的结果集,该结果集封装在一个逻辑表格中。在 ResultSet 接口内部有一个指向表格数据行的游标(或指针), ResultSet 对象初始化时,游标在表格的第 1 行之前,调用 next() 方 法可将游标移动到下一行。如果下一行没有数据,则返回 false。在应用程序中经常使用 next() 方法作为 while 循环的条件来迭代ResultSet 结果集。

ResultSet接口中的常用方法如表所示。

Servlet笔记七(JDBC)_database_06Servlet笔记七(JDBC)_数据库_07

从表中可以看出,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;
}

@Override
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);
}
}
}


举报

相关推荐

0 条评论