Java使用JDBC操作MySQL数据库
2020-03-14 08:51:01
## 1. 下载Java语言操作MySQL的驱动jar包
选择版本 `mysql-connector-java-5.1.48.jar`
https://mvnrepository.com/artifact/mysql/mysql-connector-java
## 2. 准备数据表
```SQL
CREATE TABLE `book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '图书名称',
`quantity` int(11) NOT NULL DEFAULT '0' COMMENT '库存数量',
`price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '单价',
`isbn` varchar(20) DEFAULT NULL COMMENT '国际编号',
PRIMARY KEY (`id`),
UNIQUE KEY `isbn` (`isbn`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
## 3. 将下载的MySQL驱动jar包移动到lib目录,编写`BookDao.java`类,目录结构如下
```
- BookDao.java
- lib/
- mysql-connector-java-5.1.48.jar
```
## 4. 插入数据
```java
import java.sql.*;
public class BookDao {
public static void main(String arg[]) {
// 操作数据库需要用到 java.sql 包中的三个类
Connection conn = null; // 连接对象
PreparedStatement stmt = null; // 预处理对象
ResultSet rs = null; // 结果集对象
try {
// JDBC 4.0 支持自动加载驱动器类,下面代码不需要了
// 加载驱动类 (mysql-connector-java-5.x)
// Class.forName("com.mysql.jdbc.Driver");
// 如果mysql-connector-java-8.x 则使用下面的驱动类,最低要求Java8+
// Class.forName("com.mysql.cj.jdbc.Driver");
// 连接到本机(127.0.0.1)的test数据库,使用Unicode字符集UTF-8编码,不使用SSL,时区为东8区
String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
conn = DriverManager.getConnection(url, "root", "your password");
// 准备SQL语句
String sql = "INSERT INTO book (name, quantity) VALUES (?, ?)";
stmt = conn.prepareStatement(sql);
// 绑定占位符的值
stmt.setString(1, "book1"); // 新版本驱动直接支持MySQL中的utf8mb4字符集
stmt.setInt(2, 100);
// 执行SQL
stmt.execute();
// 获取MySQL自增id
rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");
int id;
if (rs.next()) {
id = rs.getInt(1);
System.out.println("ID:" + id);
}
// 释放资源,关闭连接
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
## 5. 编译运行
```shell
# Linux系统编译运行
$ javac BookDao.java
$ java -cp lib/mysql-connector-java-5.1.48.jar:. BookDao
# Windows系统编译运行
$ javac -encoding UTF-8 BookDao.java
$ java -cp lib/mysql-connector-java-5.1.48.jar;. BookDao
```
## 6. 查询数据
```java
// 准备SQL语句
String sql = "SELECT * FROM book WHERE quantity > ? and name = ?";
stmt = conn.prepareStatement(sql);
// 绑定占位符的值
stmt.setInt(1, 10);
stmt.setString(2, "book1");
// 执行查询类型的SQL
rs = stmt.executeQuery();
System.out.println("id\tname\tquantity");
// 循环输出结果集,next是移动到下一条记录,如果后面没有记录则返回false
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("quantity");
System.out.println(id + "\t" + name + "\t" + email);
}
// 释放资源,关闭连接
```
## 7. 更新数据
```java
// 准备SQL语句
String sql = "UPDATE book SET name = ? WHERE id = ?";
stmt = conn.prepareStatement(sql);
// 绑定占位符的值
stmt.setString(1, "new book");
stmt.setInt(2, 1);
// 执行SQL,返回受影响行数
int rows = stmt.executeUpdate();
System.out.println("更新了" + rows + "条记录");
// 释放资源,关闭连接
```
## 8. 删除数据
```java
// 准备SQL语句
String sql = "DELETE FROM book WHERE id = ?";
stmt = conn.prepareStatement(sql);
// 绑定占位符的值
stmt.setInt(1, 3);
// 执行SQL,返回受影响行数
int rows = stmt.executeUpdate();
System.out.println("删除了" + rows + "条记录");
// 释放资源,关闭连接
```
## 9. 思考 `execute` 、`executeQuery` 和 `executeUpdate` 的区别