MyBatis 如何簡化的 JDBC(思路詳解)
MyBatis 作用
MyBatis 是一個 持久層 框架,用于 簡化JDBC開發(fā);
持久層:即負責將數(shù)據(jù)保存到數(shù)據(jù)庫的那一層代碼;
框架:半成品軟件,可重用、通用的、軟件基礎代碼模型;
簡化JDBC開發(fā):JDBC存在 硬編碼 與 操作繁瑣 的缺點;
簡化JDBC開發(fā)
JDBC存在 硬編碼 與 操作繁瑣 的缺點;
完整JDBC代碼
// 注冊驅動 Class.forName("com.mysql.jdbc.Driver"); // 獲取Connection連接 String url = "jdbc:mysql:///db1?useSSL=false"; String uname = "root"; String pwd="1234"; // 接收輸入的查詢條件 String gender = "男"; // 定義sql String sql = "select * from tb_user where gender = ?"; // 獲取pstmt對象 PreparedStatement pstmt = conn.prepareStatement(sql); //設置?的值 pstmt.setString(1,gender); // 執(zhí)行sql ResultSet rs = pstmt.executeQuery(); // 遍歷Result,獲取數(shù)據(jù) User user = null; ArrayList<User> users = new ArrayList<>(); while (rs.next()){ // 獲取數(shù)據(jù) int id = rs.getInt("id"); String username = rs.getString("username"); String password = rs.getString("password"); // 創(chuàng)建對象,設置屬性值 user = new User(); user.setId(id); user.setUsername(username); user.setPassword(password); user.setGender(gender); //裝入集合 users.add(user); }
硬編碼
上述代碼中,注冊驅動以及獲取連接部分,有很多將字符串信息寫到代碼中去,即為 硬編碼;
// 注冊驅動 Class.forName("com.mysql.jdbc.Driver"); // 獲取Connection連接 String url = "jdbc:mysql:///db1?useSSL=false"; String uname = "root"; String pwd="1234";
而若我們對字符串信息發(fā)生變動,比如更改密碼等,我們就需要改動編碼,然后重新編譯,重新打包,重新運行;如此來看,代碼維護性相當差。
包括下述 sql語句部分,我們會頻繁改動sql語句:
// 接收輸入的查詢條件 String gender = "男"; // 定義sql String sql = "select * from tb_user where gender = ?";
每一次的改動都意味著大量的任務量。
操作繁瑣
而在后續(xù)的 手動設置參數(shù) 與 手動封裝結果集 部分,JDBC的操作也是相當?shù)姆爆崱?/p>
手動設置參數(shù):
// 獲取pstmt對象 PreparedStatement pstmt = conn.prepareStatement(sql); //設置?的值 pstmt.setString(1,gender);
手動封裝結果集:
// 遍歷Result,獲取數(shù)據(jù) User user = null; ArrayList<User> users = new ArrayList<>(); while (rs.next()){ // 獲取數(shù)據(jù) int id = rs.getInt("id"); String username = rs.getString("username"); String password = rs.getString("password"); // 創(chuàng)建對象,設置屬性值 user = new User(); user.setId(id); user.setUsername(username); user.setPassword(password); user.setGender(gender); //裝入集合 users.add(user); }
MyBatis 簡化思路
配置文件
針對JDBC中 硬編碼 問題,MyBatis 通過將字符串寫到 配置文件 中;
針對 注冊驅動以及獲取連接部分 配置信息案例:
<!-- 連接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///db1?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="1234"/> </dataSource> <!-- 連接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///db1?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="1234"/> </dataSource>
針對 sql語句部分 配置信息案例:
<select id="selectByGender" parameterType="string" resultType="com.xuhongduo.pojo.User"> select * from tb_user where gender = #{gender}; </select>
自動完成
針對JDBC中 操作繁瑣 問題,MyBatis 嘗試 自動完成;
List<User> users = sqlSession.selectList("test.selectByGender", "男")
一行代碼搞定 手動設置參數(shù) 與 手動封裝結果集 部分;
補充:Mybatis是如何簡化JDBC代碼的
MyBatis 主要是通過將 JDBC 的一些重復性、繁瑣性的代碼進行封裝和抽象化,從而簡化了原來 JDBC 代碼的一些部分,具體來說,它主要簡化了以下幾個方面的代碼:
數(shù)據(jù)庫連接和資源的管理
在 JDBC 中,每次進行數(shù)據(jù)庫操作都需要手動獲取連接、創(chuàng)建 Statement 或者 PreparedStatement、執(zhí)行 SQL 語句、處理結果集,并且需要手動關閉連接和釋放資源。而在 MyBatis 中,這些步驟都被封裝在 SqlSession 中,開發(fā)者只需要通過 SqlSession 獲取 Mapper 接口對象,然后調用方法即可。
// 原始 JDBC 代碼 Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE name = ?"); stmt.setString(1, "Tom"); ResultSet rs = stmt.executeQuery(); while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); int age = rs.getInt("age"); // ... } rs.close(); stmt.close(); conn.close(); // MyBatis 代碼 SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); List<User> users = userMapper.findUsersByName("Tom"); sqlSession.close();
SQL 語句的編寫和處理
在 JDBC 中,SQL 語句通常以字符串的形式直接寫在代碼中,不利于維護和調試,并且容易受到 SQL 注入等安全問題的影響。而在 MyBatis 中,SQL 語句通過 XML 或注解的形式進行編寫和處理,可以更加靈活和方便地管理 SQL 語句,并且可以使用動態(tài) SQL、命名參數(shù)等功能。
// 原始 JDBC 代碼 PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE name = ?"); stmt.setString(1, "Tom"); // MyBatis XML 代碼 <select id="findUsersByName" parameterType="String" resultType="User"> SELECT * FROM users WHERE name = #{name} </select> // MyBatis 注解代碼 @Select("SELECT * FROM users WHERE name = #{name}") List<User> findUsersByName(@Param("name") String name);
結果集的映射
在 JDBC 中,將查詢結果集映射到 Java 對象通常需要手動進行一些處理,例如通過 ResultSet.getXXX() 方法獲取每個字段的值,然后手動設置到 Java 對象中。而在 MyBatis 中,可以通過配置 resultMap 或使用注解等方式將查詢結果集映射到 Java 對象中,大大簡化了代碼。
// 原始 JDBC 代碼 ResultSet rs = stmt.executeQuery(); List<User> users = new ArrayList<>(); while (rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setAge(rs.getInt("age")); users.add(user); } // MyBatis XML 代碼 <resultMap id="userMap" type="User"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="age" column="age"/> </resultMap> // MyBatis 注解代碼 @Results({ @Result(property = "id", column = "id"), @Result(property = "name", column = "name"), @Result(property = "age", column = "age") }) List<User> findUsersByName(@Param("name") String name);
通過以上三個方面的簡化,MyBatis 提高了代碼的可讀性、可維護性和可擴展性,使得開發(fā)者可以更加專注于業(yè)務邏輯的實現(xiàn),而不需要過多關注底層的數(shù)據(jù)庫訪問細節(jié)。
到此這篇關于MyBatis 怎樣簡化的 JDBC的文章就介紹到這了,更多相關MyBatis 簡化 JDBC內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot使用hibernate validation對參數(shù)校驗的實現(xiàn)方法
這篇文章主要介紹了spring-boot 使用hibernate validation對參數(shù)進行優(yōu)雅的校驗,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12詳解Spring-Boot集成Spring session并存入redis
這篇文章主要介紹了詳解Spring-Boot集成Spring session并存入redis,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05Java?C++題解leetcode1441用棧操作構建數(shù)組示例
這篇文章主要為大家介紹了Java?C++題解leetcode1441用棧操作構建數(shù)組示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10Java synchronized關鍵_動力節(jié)點Java學院整理
在java中,每一個對象有且僅有一個同步鎖。這也意味著,同步鎖是依賴于對象而存在。下面通過本文給大家介紹synchronized原理 及基本規(guī)則,感興趣的朋友一起學習吧2017-05-05