Java使用jdbc连接数据库

 

Java使用JDBC操作MySQL数据库

1. 下载Java语言操作MySQL的驱动jar包

选择版本 mysql-connector-java-5.1.48.jar

https://mvnrepository.com/artifact/mysql/mysql-connector-java

2. 准备数据表

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. 插入数据

import java.sql.*;

public class BookDao {
    public static void main(String arg[]) {

        // 操作数据库需要用到 java.sql 包中的三个类
        Connection conn = null;         // 连接对象
        PreparedStatement stmt = null;  // 预处理对象
        ResultSet rs = null;            // 结果集对象

        try {
            // 加载驱动类 (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. 编译运行

# 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. 查询数据

// 准备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. 更新数据

// 准备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. 删除数据

// 准备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. 思考 executeexecuteQueryexecuteUpdate 的区别

execute:可用于执行任何SQL语句,返回一个boolean值,表明执行该SQL语句是否返回了ResultSet。
如果执行后第一个结果是ResultSet,则返回true,否则返回false
executeQuery:用于产生单个结果集(ResultSet)的语句,常用于select语句
exrcuteUpdate:用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,返回的时受影响的行数