一. 下载与安装 MySQL Connector/J
MySOL 驱动 MySQL Connector/J 下载网站 https://dev.mysql.com/downloads/connector/j/5.1.html
Source and Binaries(zip) 用于 Windows 操作系统,Source and Binaries(tar,gz) 用于 Linux 操作系统。
二. Java 连接 MySQL 数据库
在 java.sql 包中存在 DriverManager 类、Connection 接口、Statement 接口和 ResultSet 接口。这些类和接口的含义和作用如下:
- DriverManager 类:负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)
- Connection 接口:数据库连接,负责进行数据库间通讯,SQL 执行以及事务处理都在某个特定 Connection 环境中进行。主要用于管理建立好的数据库连接。
- Statement 接口:主要用以执行 SQL 语句。
- ResultSet 接口:主要用于存储数据库返回的记录。
1. 指定 MySQL 驱动程序
使用 java.lang.Class 类中的 forName() 方法指定 JDBC 驱动的类型,语句如下:
Class.froName("com.mysql.jdbc.Driver");
2. 使用 getConnection () 方法连接数据库
指定 MySQL 驱动程序以后,就可以使用 DriverManager 类和 Connection 接口来连接数据库了。这里使用DriverManager 类中的 getConnection ()方法。 getConnection() 方法返回一个 JDBC Connection 对象,应该把它存储在程序中,以便以后引用。
调用 getConnection () 方法的语法如下:
DriverManager.getConnection( URL, username, password);
其中,URL 是程序要连接的数据库和要使用的 JDBC 驱动程序; usename 是程序连接时所用的数据库用户名; password 是该用户名的密码。
【例】连接本地计算机 MySQL 数据库,MySQL 使用默认端口号 3306, 连接的数据库为 test_db,使用用户 root 连接,密码为 zth1530738736 。连接 MySQL 的语句如下:
Connection myConnection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test",
"root",
"zth1530738736"
);
也可为:
String url="jdbc:mysql://localhost:3306/test_db"; //获取协议、 IP 和端口等信息
String user="root"; //获取数据库用户名
String password="zth1530738736"; //取数据库用户密码
Connection myConnection = DriverManager.getConnection ( url , user , password);
//创建 Connection 对象
三. Java 操作 MySQL 数据库
Statement 接口主要用来执行 SQL 语句,执行后返回的结果由 ResultSet 接口管理。
1. 创建 Statement 对象
Connection 对象调用 createStatement() 方法来创建 Statement 对象,该方法的语法格式如下:
Statement mystatement = connection.createStatement();
其中,mystatement 是 Statement 对象;connection 是 Connection 对象;createStatement() 方法返回 Statement对象。Statement 对象创建成功后,可以调用其中的方法来执行 SQL 语句。
2. 使用 SELECT 语句查询数据
Statement 对象创建完成后,可以调用 executeQuery() 方法执行 SELECT 语句,查询结果会返回给 ResultSet 对象。
调用 executeQuery () 方法的语法格式如下:
ResultSet rs = statement.executeQuery ("SELECT 语句");
通过该语句可以将查询结果存储到 rs 中。如果查询包含多条记录,可以使用循环语句来读取所有的记录,其代码如下:
while ( rs.next ( ) ){
String ss = rs.getString("字段名");
System.out.print (ss );
}
其中“字段名”参数表示查询出来的记录的字段名称。使用 getString 函数可以将指定字段的值取出来。
【例】从fruits表中查询水果的名称和价格。
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mysql.jdbc.Connection;
public class test {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/test_db";
String user = "root";
String password = "zth1530738736";
java.sql.Connection myConnection = DriverManager.getConnection(url,user,password);
Statement mystatement = myConnection.createStatement();
ResultSet rs = mystatement.executeQuery(" SELECT f_name,f_price FROM test_db.fruits");
while(rs.next()) {
String fn = rs.getString("f_name");
String fp = rs.getString("f_price");
System.out.println(fn+" "+fp);
}
if(mystatement != null) {
mystatement.close();
mystatement=null;
}
if(myConnection !=null) {
myConnection.close();
myConnection=null;
}
}
}
执行结果:
警告信息:
Fri Jun 08 15:07:11 CST 2018 WARN: Establishing SSL connection without server's
identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+
and 5.7.6+ requirements SSL connection must be established by default if explicit
option isn't set. For compliance with existing applications not using SSL the
verifyServerCertificate property is set to 'false'. You need either to explicitly
disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for
server certificate verification.
谷歌翻译:
警告:建议不建立服务器身份验证的SSL连接。 根据MySQL 5.5.45+,5.6.26+和5.7.6+
的要求,如果未设置显式选项,则必须默认建立SSL连接。 为了符合不使用SSL的现有应
用程序,verifyServerCertificate属性设置为'false'。 您需要通过设置useSSL = false显
式禁用SSL,或者设置useSSL = true并为服务器证书验证提供信任库。
解决办法:
在URL加入useSSL=true或者false即可,如下所示:
//原先报错程序
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_db,"root", "123456");
//更改后正确程序
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_db?useSSL=false", "root", "123456");
//也可以使用如下
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf-8&useSSL=false", "root", "123456");
3. 插入、更新和删除数据
如果需要插入、更新和删除数据,需要用 Statement 对象调用 executeUpdate() 方法来实现,该方法执行后,返回影响表的行数。
使用 executeUpdate() 方法的语法格式如下:
int result = statement.executeUpdate(sql);
其中,sql 参数可以是 INSERT 语句,也可以是 UPDATE 语句或者 DELECT 语句。该语句的结果为数字。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【例】向 fruits 表中插入一条新记录。部分代码如下:
Statement mystatement= myConnection.createStatement(); //创建Statement对象
String sql=" INSERT INTO fruits VALUES ('h1',166 ,'biueberry',20.2)";
int result = mystatement.executeUpdate(sql); //执行INSERT语句,返回插入的记录数
System.out.println( result ); //输出插入的记录数
控制台返回结果:
数据库查询结果:
mysql> SELECt * FROM fruits WHERE f_id='h1';
+------+------+-----------+---------+
| f_id | s_id | f_name | f_price |
+------+------+-----------+---------+
| h1 | 166 | biueberry | 20.20 |
+------+------+-----------+---------+
1 row in set (0.00 sec)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【例】更新 fruits 表中 f_id 为‘h1’的记录,将该记录的 f_price 改为 33.5。部分代码如下:
Statement mystatement= myConnection.createStatement(); //创建Statement对象
String sql=" UPDATE fruits SET f_price = 33.5 WHERE f_id = 'h1'";
int result = mystatement.executeUpdate(sql); //执行 UPDATE 语句,返回更新的记录数
System.out.println( result ); //输出更新的记录数
控制台返回结果:
数据库查询结果:
mysql> SELECt * FROM fruits WHERE f_id='h1';
+------+------+-----------+---------+
| f_id | s_id | f_name | f_price |
+------+------+-----------+---------+
| h1 | 166 | biueberry | 33.50 |
+------+------+-----------+---------+
1 row in set (0.00 sec)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【例】删除 fruits 表中 f_id 为‘h1’的记录。部分代码如下:
Statement mystatement=myConnection.createStatement(); //创建Statement对象
String sql=" DELETE FROM fruits WHERE f_id='h1'"; //获取DELECT语句
int result = mystatement.executeUpdate(sql); //执行DELECT语句,返回删除的记录数
System.out.print(result); //输出删除的记录数
控制台返回结果:
数据库查询结果:
mysql> SELECt * FROM fruits WHERE f_id='h1';
Empty set (0.00 sec)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4. 执行任意 SQL 语句
如果无法确定 SQL 语句是查询还是更新时,可以使用 execute() 函数。 该函数的返回结果是 boolean 类型的值,返回值为 true 表示执行查询语句,返回 false 表示执行更新语句。
调用 execute() 方法的代码:
boolean result = statement.execute(sql) ;
如果要获取 SELECT 语句的查询结果,需要调用 getResultSet() 方法。要获取 INSERT 语句、UPDATE 语句或者DELETE语句影响表的行数,需要调用 getUpdateCount() 方法。
ResultSet result1 = statement. getResultSet();
int result2 = mystatement.getUpdateCount();
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【例】使用 execute() 函数执行 SQL 语句。部分代码如下:
Statement mystatement=myConnection.createStatement(); //创建Statement对象
String sql=("SELECT f_name,f_price FROM fruits"); //定义sql变量,获取SELECT语句
boolean rst = mystatement.execute(sql); //执行SELECT语句
//如果执行SELECT语句,则execute()方法返回TRUE
if(rst==true) {
ResultSet result = mystatement. getResultSet(); //将查询结果传递给result
while(result.next()){ //判断是否还有记录
String fn = result.getString("f_name"); //获取f_name字段的值
String fp=result.getString("f_price"); //获取f_name字段的值
System.out.println(fn+" "+ fp); //输出字段的值
}
}
//如果执行UPDATE语句、INSERT语句或者DELECT语句,则execute()方法返回FALSE
else {
int ss=mystatement.getUpdateCount(); //获取发生变化的记录数
System.out.println(ss); //输出记录数
}
控制台返回结果:
5. 关闭创建的对象
当所有的语句执行完毕后,需要关闭创建的对象,包括 Connection 对象、Statement 对象和 ResultSet 对象。关闭对象的顺序是先关闭 ResultSet 对象, 然后关闭 Statement 对象, 最后关闭 Connection 对象,这个和创建对象的顺序正好相反。关闭对象使用的是 close() 方法,将对象的值设为空。
关闭对象的部分代码如下:
if( result != null) { //判断 ResultSet 对象是否为空
result.close(); //调用 close() 方法关闭 ResultSet 对象
result=null;
}
if( statement != null) { //判断 Statement 对象是否为空
statement.close(); //调用 close() 方法关闭 Statement 对象
statement=null;
}
if( Connection !=null ) { //判断 Connection 对象是否为空
Connection.close(); //调用 close() 方法关闭 Connection 对象
Connection=null;
}
四. Java 备份和还原 MySQL 数据库
1. 备份 MySQL 数据库
Java 语言中的 Runtime 类的 exec() 方法可以运行外部的命令。调用 exec() 方法的代码如下:
Runtime rr = Runtime.getRuntime();
rr.exec("外部命令语句");
【例】在 Windows 操作系统下用 Java 备份 MySQL 数据库。部分代码如下:
String str = "mysqldump -u root -pzth1530738736 -pot booksDB > G:/booksDB.sql ";
//将 mysqldump 命令的语句赋值给str
Runtime rr = Runtime.getRuntime(); //创建 Runtime 对象
rr.exec("cmd /c"+str); //调用 exec() 函数
上面的例子将 booksdb 数据库备份到 G: 目录下的 booksDB.sql 文件中。使用 -pot 选项可以提高备份的速度; cmd 表示要使用 cmd 命令来打开 DOS 窗口;/C 表示执行完毕后关闭 DOS 窗口。
2. 还原 MySQL 数据库
【例】在 windows 操作系统下 Java 还原 MySQL 数据库。部分代码如下:
String str = "mysql -u root -pzth1530738736 booksDB < G:\\booksDB.sql";
//将 mysql 命令的语句赋值给str
Runtime rr = Runtime.getRuntime(); //创建R untime 对象
rr.exec("cmd /c" + str); //调用exec()函数
将 G:\目录下的 booksDB.sql 文件还原到数据库 booksDB 中。
【注】参考于清华大学出版社《MySQL数据库应用案例课堂》2016年1月第1版