前言
我们知道,在进行后端开发的时候,既要精通PHP、Java(JSP)等语言,也要能熟练使用MySQL、SQL Server等数据库系统,那怎样能将两者结合起来呢?JDBC就是其中的一种方式。
简介
JDBC全称为Java Data Base Connectivity,是一种可用于执行SQL语句的Java API(Application Programming Interface,应用程序接口),是连接数据库和Java应用程序的纽带。方便起见,本文使用的数据库为MySQL的5.7版本。
基本操作
首先,我们登录MySQL,创建数据库t1和数据表student_info:
然后再向表中插入一些数据:
连接数据库:
要对数据表中的数据进行操作,应该首先建立与数据库的连接。访问数据库的时候,首先要加载数据库的驱动程序(只需要在第一次访问数据库时加载一次),然后每次访问的时候创建一个Connection
类对象,接着执行操作数据库的SQL语句,完成对数据库的操作后再销毁Connection
类对象,释放与数据库的连接。下面举个例子:
package test;
import java.sql.*;//导入包
public class Connect { // 创建类Connect
Connection con; // 声明Connection对象
public Connection getConnection() {// 定义返回值为Connection的方法
String driver = "com.mysql.jdbc.Driver"; //driver指向数据库的驱动程序
String url = "jdbc:mysql://127.0.0.1:3306/t1?framework?characterEncoding=utf8&useSSL=true";
// url指向要连接的数据库,这里我们访问数据库t1
String user = "root";// MySQL配置时的用户名
String password = "root"; // MySQL配置时的密码
try {// 加载数据库驱动类
Class.forName(driver);
System.out.println("数据库驱动加载成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {// 通过访问数据库的URL获取数据库连接对象
con = DriverManager.getConnection(url,user,password);
System.out.println("数据库连接成功");
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
public static void main(String[] args){
Connect c = new Conn(); // 创建本类对象
c.getConnection(); // 调用连接数据库方法
}
}
jdbc:mysql://127.0.0.1:3306/t2
这段代码中,127.0.0.1
是本机地址,也可以用localhost
代替;t1
是要访问的数据库名;而后面的framewor?characterEncoding=utf8&useSSL=true
则是新版本MySQL的特性,即需要指明字符的编码格式和是否进行SSL连接,如果不指明的话程序就会报错。root
和root
分别是我登录MySQL时的用户名和密码。
这里最关键的是两个方法:Class.forName(驱动程序)
和DriverManager.getConnection(数据库,用户名,密码)
作用就是加载数据库驱动类和获取数据库连接对象,我们知道Java是面向对象的语言,因此就把数据库的操作转化为了对类和对象的操作,
还有一点就是,这里把连接数据库这一操作定义Connect
类,并以Connection
对象作为直接调用Connect类的getConnection()
方法或者修改方法的代码(要连接的的数据库名)再调用方法就行了,提高效率。
至于是否已成功连接数据库t1呢?我们可以用接下来的几个操作进行检验。
向数据库发送SQL语句:
连接数据库之后,要向数据库发送SQL语句(即指令),才能对数据库中的数据进行一系列操作。要执行SQL语句首先要获得Statement
类对象,通过上面创建的Connect
类对象con
的createdStatement
方法可获得Statement
类对象:
try{
Statement sql = con.createStatement();
}catch(SQL Exception e){
e.printStackTrace();
}
处理查询结果集:
有了Statement
类对象后,可以调用相应的方法实现对数据库中数据库的查询和修改,并将查询的结果集存放在ResultSet
类对象中:
ResulySet result = sql.executeQuery(SELECT * FROM student_info);
SELECT * FROM student_info
这条指令的含义是查询数据表student_info中的所有数据。
ResultSet
类对象一次只能显示结果集中的一行数据(即数据表中的一条记录),使用该类的next()
方法可将查询位置移向下一行。next()
方法的返回值为boolean
类型的数据,当查询位置移动到最后一行之后再调用next()
方法会返回false
.
查询数据:
下面我们来查询数据表student_info中的数据:
package test;
import java.sql.*;
public class Query { // 创建类
static Connection con; // 声明Connection类对象
static Statement sql; // 声明Statement类对象
static ResultSet result; // 声明ResultSet类对象
public Connection getConnection() { // 连接数据库方法
/*****连接数据库的代码,此处省略*****/
return con; // 返回Connection类对象
}
public static void main(String[] args) {
Query q = new Query(); // 创建本类对象
con = q.getConnection(); // 连接数据库
try {
sql = con.createStatement(); // 实例化Statement类对象
result = sql.executeQuery("SELECT * FROM student_info");// 执行SQL语句,返回结果集
while (result.next()) {
String id = result.getString("id"); // 获取列名是"id"的字段值
String name = result.getString("name");// 获取列名是"name"的字段值
String sex = result.getString("sex");// 获取列名是"sex"的字段值
System.out.print("编号:" + id); // 将数据输出
System.out.print(" 姓名:" + name);
System.out.println(" 性别:" + sex);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
控制台显示的效果为:
可见,通过JDBC查询到的数据和直接登录MySQL查询到的数据是完全相同的。
这个例子是顺序查询数据,在SQL语句中,也可以用LIKE
操作符进行模糊查询,即使用%
来代替0个或多个字符,使用_
来代替一个字符。在使用模糊查询之前,先插入几条数据:
如果我们想要查询张姓同学的信息,就可以使用模糊查询,改动如下代码即可:
result = sql.executeQuery("SELECT * FROM student_info WHERE name LIKE '张%'");
控制台显示的效果为:
预处理语句:
向数据库发送一个SQL语句,数据库中的SQL解释器负责把SQL语句生成底层的内部命令然后执行,完成对数据的操作。如果不断地向数据库提交SQL语句,肯定会增加数据库SQL解释器的负担,影响执行的速度。
在JDBC中,可以通过Connection
类对象的prepareStatement()
方法对SQL语句进行预处理,生成数据库底层的内部命令,并将该命令封装在PreparedStatement
类对象中,通过调用该对象的相应方法执行底层数据库命令。这样能够减轻数据库的负担,提高访问数据库的速度。
对SQL进行预处理时可以使用通配符?
来代替任何的字段值:
sql = con.prepareStatement("SELECT * FROM student_info WHERE id = ?");
在执行预处理语句恰安,必须用相应方法来设置通配符所表示的值:
sql.setInt(1,2);
上面语句中的1
表示左数第一个通配符,2
表示设置的通配符的值。将通配符的值设置为2后,功能等同于:
sql = con.prepareStatement("SELECT * FROM student_info WHERE id = 2");
需要注意的是,通过setXXX()
方法为通配符设置值的时候,建议使用与通配符所代表参数匹配的方法,即上面的例子中字段id
的类型为int
,因此使用setInt()
方法。当然也可以使用setObject()
为各种类型的参数(通配符)赋值。
下面使用预处理语句查找id
为3的同学信息:
package test;
import java.sql.*;
public class Prepare { // 创建类
static Connection con; // 声明Connection类对象
static PrepareStatement ps; // 声明PrepareStatement类对象
static ResultSet result; // 声明ResultSet类对象
public Connection getConnection() { // 连接数据库方法
/*****连接数据库的代码,此处省略*****/
return con; // 返回Connection类对象
}
public static void main(String[] args) {
Prepare p = new Prepare(); // 创建本类对象
con = p.getConnection(); // 连接数据库
try {
ps = con.prepareStatement("SELECT * FROM student_info WHERE id = ?");
ps.setInt(1, 3); // 设置参数
result = ps.executeQuery(); // 执行预处理语句
while (result.next()) {
/*****查询和输出数据的代码,此处省略*****/
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
控制台显示的效果为:
尽管使用预处理语句看起来更加繁琐了,但却能使程序动态地改变SQL语句中关于字段值条件的设定。
添加、修改、删除数据:
通过SQL语句可以对数据执行添加、修改和删除操作,可通过PrepareStatement
类的指定参数动态地对数据表中的数据进行操作,并使用executeUpdate()
方法执行更新语句的操作。
下面对数据表student_info中的数据进行添加、修改和删除:
package test;
import java.sql.*;
public class Test { // 创建类
static Connection con; // 声明Connection类对象
static Statement sql; // 声明Statement类对象
static ResultSet result; // 声明ResultSet类对象
public Connection getConnection() { // 连接数据库方法
/*****连接数据库的代码,此处省略*****/
return con; // 返回Connection类对象
}
public static void main(String[] args) {
Test t = new Test(); // 创建本类对象
con = t.getConnection(); // 连接数据库
try {
ps = con.prepareStatement("INSERT student_info VALUES(?,?,?)");// 预处理添加数据
ps.setInt(1, 06);
ps.setString(2, "王红");
ps.setString(3, "女");
ps.executeUpdate();
ps = con.prepareStatement("UPDATE student_info SET name = ? WHERE id = 5");
// 预处理修改数据
ps.setString(1, "张小娜");
ps.executeUpdate();
ps = con.prepareStatement("DELETE FROM student_info WHERE sex = ?");// 预处理删除数据
ps.setString(1, "男");
ps.executeUpdate();
result = ps.executeQuery("SELECT * FROM student_info");
while (result.next()) {
/*****查询和输出数据的代码,此处省略*****/
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
控制台显示的效果为:
可见,所有对数据的操作都是正确无误的。
后记
关于JDBC的应用,举个很简单的例子,当我们用JSP做Web后台开发比如一个登录系统的时候,可以将已经注册过的用户信息(用户名,密码,手机号码等)保存到数据库中,也可以判断正在登录用户是否已注册或者用户名或密码是否正确。JSP是基于Java的语言,要在JSP中访问数据库,自然就要用到JDBC了。
可以看到,JDBC其实就是在Java程序中操作数据库,核心就在调用于类中的各种方法,这需要Java的基础,同时,在对数据的各种操作中也利用到了SQL语句,这就要求掌握一定的数据库知识。
总而言之,JDBC并不难,但要熟练使用各种Java方法和SQL语句却不是一件易事,这就需要我们查阅官方文档和平时的积累。
当然,除了JDBC还有其他的后端语言和数据库的连接方式,学习其他语言或者有兴趣的小伙伴可以自行学习。