DAY19.2 Java核心基礎
JDBC
JDBC:Java database Connectivity
JDBC是java程序連接各種數據庫的組件
Mybatis就是基于JDBC的封裝,是獨立于數據庫的管理系統,通用的SQL數據庫存取和操作的公共接口
定義了一套標準,為訪問 不同數據庫提供了統一的途徑
- 導入對應數據庫驅動jar
- 面向JDBC接口編程
JDBC接口包含兩部分
- 面向應用的API,給開發者調用
- 面向數據庫的API,供開發廠商開發數據庫驅動
JDBC API
供開發者調用的類,主要在java.sql和javax.sql包中
- DriverManager 類
- Connection 接口
- Statement 接口
- ResultSet 接口
DriverManager:管理不同的驅動
JDBC驅動:復制連接不同的數據庫
JDBC的原理:
加載數據庫驅動,java程序和Mysql的橋梁
獲取connection連接,一次連接
創建Statement,由Connection生成,執行sql語句
ResultSet保持Statement執行后產生的結果
建立一次連接:
public static void main(String[] args) throws SQLException {// 在URL中添加時區參數 serverTimezone=Asia/ShanghaiString url = "jdbc:mysql://localhost:3306/mytest1?serverTimezone=Asia/Shanghai&useSSL=false";String user = "root";String password = "root";Connection connection = DriverManager.getConnection(url, user, password);System.out.println(connection);
}
加載驅動就是將 JDBC 所需要的驅動類加載到 JVM 中才能運行,通過類加載器進行加載,通過反射機制將該類加載進來
Class.forName(類名) 反射機制,獲取運行時類,什么是運行時類?
Java 程序是由類組成的,運行時,會將 Java 所有的類添加到 JVM 內存中,并且每個類只有一份,保持在 JVM 內存中的類叫運行時類,JVM 根據運行時類創建不同的對象,Class.forName(類名) 用來加載運行時類的,將驅動程序添加到 JVM 內存中,程序才能訪問。
每個類的作用:
DriveManager:驅動管理類,創建Connection,通過用戶名,密碼,URL進行校驗,校驗成功創建一個Connection對象
Connection:表示java程序和Mysql之間的一次連接
Statement:表示sql的執行者,復制執行SQL語句
增刪改操作 excute():
public static void main(String[] args) throws SQLException {// 在URL中添加時區參數 serverTimezone=Asia/ShanghaiString url = "jdbc:mysql://localhost:3306/mytest1?serverTimezone=Asia/Shanghai&useSSL=false";String user = "root";String password = "root";Connection connection = DriverManager.getConnection(url, user, password);System.out.println(connection);System.out.println("連接成功");// 定義sql// 增加String insertSql="insert into users(name,gender,score) values('小明','男',90)";// 刪除String deleteSql="delete from users where name ='小明'";// 修改String updateSql="update users set name='述霧' where name = 'c'";// 執行sqlPreparedStatement preparedStatement = connection.prepareStatement(insertSql);boolean execute = preparedStatement.execute();System.out.println(execute);preparedStatement.close();preparedStatement = connection.prepareStatement(deleteSql);preparedStatement.execute();preparedStatement = connection.prepareStatement(updateSql);preparedStatement.execute();connection.close();preparedStatement.close();
}
excute():負責執行增 刪 改方法
返回的結果是return rs != null && rs.hasRows();,判斷是否為查詢語句,rs != null表示是否有該對象,rs.hasRows()表示是否有值
executeQuery:負責執行查詢方法,返回值 ResultSet,集合,查詢肯定要返回查到的數據
返回的結果是一個ResultSet
通過ResultSet的next方法可以取出每一行的值
ResultSet resultSet = preparedStatement.executeQuery();
System.out.println(resultSet.getMetaData().getColumnCount());
while (resultSet.next()){// 方法一
// String name = resultSet.getString("name");
// String gender = resultSet.getString("gender");
// double score = resultSet.getDouble("score");// 方法2String name = resultSet.getString(1);String gender = resultSet.getString(2);double score = resultSet.getDouble(3);System.out.println(name+" "+gender+" "+score);
}
這樣每次操作都需要創建Connection,然后創建Statement對象然后執行嗎?這樣不顯得太麻煩了嗎
我們可以創建一個工具類來獲取Connection連接,一個創建多次使用嘛,然后還可以封裝一些方法來更新數據庫的字段值
比如創建一個JDBCUtil工具類
在創建的時候初始化該類,初始化Connection對象,然后在insertUsers寫一個方法插入到users表中
public class JDBCUtil {public static final String URL = "jdbc:mysql://localhost:3306/mytest1?useSSL=true&serverTimezone=GMT%2B8";public static final String USER = "root";public static final String PASSWORD = "root";public static final String DRIVER = "com.mysql.cj.jdbc.Driver";private Connection connection = null;// 獲取連接public void initConnection(){try {Class.forName(DRIVER);connection = DriverManager.getConnection(URL, USER, PASSWORD);System.out.println("連接成功");} catch (ClassNotFoundException e) {throw new RuntimeException(e);} catch (SQLException e) {throw new RuntimeException(e);}}public JDBCUtil(){initConnection();}// 關閉連接public void closeConnection(){if (connection != null){try {connection.close();System.out.println("關閉連接");} catch (SQLException e) {throw new RuntimeException(e);}}}// 插入到users表字段public void insertUsers(String name,String gender,Integer score){String sql = "insert into users(name,gender,score) values('"+name+"','"+gender+"',"+score+")";System.out.println(sql);PreparedStatement preparedStatement = null;try {preparedStatement = connection.prepareStatement(sql);preparedStatement.execute();System.out.println("插入成功");} catch (SQLException e) {throw new RuntimeException(e);} finally {try {preparedStatement.close();} catch (SQLException e) {throw new RuntimeException(e);}}}}
測試函數
public class Test {public static void main(String[] args) throws SQLException {JDBCUtil jdbcUtil = new JDBCUtil();jdbcUtil.insertUsers("張三","男",100);}
}
成功插入
但是有個問題就是這樣寫sql賦值的時候顯得太麻煩了,我們可以用占位符來解決
String sql = "insert into users(name,gender,score) values('"+name+"','"+gender+"',"+score+")";
String sql = "insert into users(name,gender,score) values(?,?,?)";
System.out.println(sql);
PreparedStatement preparedStatement = null;
try {preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1,name);preparedStatement.setString(2,gender);preparedStatement.setInt(3,score);preparedStatement.execute();System.out.println("插入成功");
} catch (SQLException e) {throw new RuntimeException(e);
} finally {try {preparedStatement.close();} catch (SQLException e) {throw new RuntimeException(e);}
}
用preparedStatement.setString(占位符的位置,賦值的參數);
根據參數的類型可以選擇setString(),setInt,setDouble…來設置,這樣就好寫多了
下一篇我們來講解更加高級通用的方法