Loading... ## JDBC基础 JDBC是一个Java中用于连接数据库的API,通过JDBC可以方便的以任何形式访问关系型数据库中的数据。 ### 基本流程 - 连接到MySQL - 将查询指令发送到数据库 - 处理数据库送回的信息 ### 创建JDBC Application - 导包 ```java import java.sql.*; ``` - 注册MySQL驱动 ```java Class.forName("com.mysql.cj.jdbc.Driver"); // mysql 5以上 Class.forName("com.mysql.jdbc.Driver"); // mysql 5及以下 ``` - 连接到数据库 ```java String DBname = "students"; // 数据库名 String user = "root"; // 用户名 String pw = "12345678"; // 用户密码 String uri = "jdbc:mysql://localhost:3306/" + DBName + "?useSSL=false&characterEncoding=utf-8"; Connection con = DriverManager.getConnection(uri, user, pw); ``` - 使用已经创建好的连接创建一个Statement用于处理SQL语句 ```java Statement stmt = con.createStatement(); ``` - 处理SQL语句 ```java String cmd = "SELECT * FROM class"; ResultSet rs = stmt.executeQuery(cmd); ``` - 从结果集中提取数据 ```java while (rs.next()) { int id = rs.getInt("student_id"); String name = rs.getString("stu_name"); Date date = rs.getDate("date"); System.out.printf("ID: %d, Name: %s, Date: %s\n", id, name, date); } ``` - 执行结果: ``` ID: 1, Name: YorkWu, Date: 2022-06-19 ID: 2, Name: a, Date: 2022-06-19 ID: 3, Name: b, Date: 2022-06-19 ID: 4, Name: c, Date: 2022-06-19 ID: 5, Name: d, Date: 2022-06-19 ID: 6, Name: e, Date: 2022-06-19 ID: 7, Name: f, Date: 2022-06-19 ``` - 关闭连接 ```java rs.close(); stmt.close(); con.close(); ``` ### 注意 - 注册数据库驱动程序,一般使用Class.forName()即可。 - 数据库url格式 - mysql: ```url jdbc:mysql://hostname/databaseName[?useSSL=false&characterEncoding=utf-8] ``` - 记得关闭连接 #### JDBC Statements - Statement用于对数据库进行通用访问,可以处理静态SQL语句(一般的SQL语句),实时编译SQL语句执行,由于需要拼接SQL语句,容易造成SQL注入。 - PreparedStatement,预编译SQL语句,在需要多次使用的语句中使用。创建时可以使用"?"占位,运行时替换。 ##### PreparedStatement示例 ```java String cmd = "SELECT * FROM class WHERE student_id >= ?"; PreparedStatement ps = con.prepareStatement(cmd); ps.setInt(1, 3); ResultSet rs = ps.executeQuery(); while (rs.next()) { // do something... } rs.close(); ps.close(); ``` - 可以使用setXXX(idx, val)函数设置占位符"?"的值,XXX表示要设置的类型,例如Int,String,其中idx表示第几个占位符表示的位置,val表示要更改的值,注意,idx从1开始而不是从0开始!!! #### JDBC ResultSet - 结果集中有一个光标指向当前在结果的第几行,通过rs.next()将光标移动到下一行,如果不存在下一行则返回false。 - ResultSet中的方法 - beforeFirst() 光标移动到第一行之前 - afterLast() 光标移动到最后一行之后 - first() 光标移动到第一行 - last() 光标移动到最后一行 - absolute(int row) 光标移动到第row行 - relative(int row) 光标偏移row行,row可为负数 - previous() 光标移动到上一行 - int getRow() 获取当前光标位置 - getXXX(String s) 获取当前行字段为s的值,XXX为int,String等。 ### JDBC 事务 - 使用下面这行语句停止connection的自动提交 ```java conn.setAutoCommit(false); ``` - 若要提交更改,使用 ```java conn.commit() ``` - 回滚更改使用 ```java conn.rollback() ``` - 示例 ```java try { conn.setAutoCommit(false); Statement stmt = conn.createStatement(); String SQL = "INSERT INTO students (stu_name, date)" + "VALUES ('a', NOW())"; stmt.executeUpdate(SQL); //Submit a malformed SQL statement that breaks SQL = "INSERT INTO students (stu_name, date)" + "VALUES ('b', NOW())"; stmt.executeUpdate(SQL); conn.commit(); } catch (SQLException e) { conn.rollback(); } ``` - 也可以使用保存点 ```java Savepoint savepoint1 = conn.setSavepoint("Savepoint1"); conn.rollback(savepoint1); ``` Last modification:June 19, 2022 © Allow specification reprint Like 1 如果觉得我的文章对你有用,请随意赞赏