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` 的区别