您好,登錄后才能下訂單哦!
這篇文章主要介紹了MyBatis怎么簡(jiǎn)化的JDBC的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇MyBatis怎么簡(jiǎn)化的JDBC文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。
MyBatis 是一個(gè) 持久層 框架,用于 簡(jiǎn)化JDBC開(kāi)發(fā);
持久層:即負(fù)責(zé)將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)的那一層代碼;
框架:半成品軟件,可重用、通用的、軟件基礎(chǔ)代碼模型;
簡(jiǎn)化JDBC開(kāi)發(fā):JDBC存在 硬編碼 與 操作繁瑣 的缺點(diǎn);
JDBC存在 硬編碼 與 操作繁瑣 的缺點(diǎn);
// 注冊(cè)驅(qū)動(dòng) 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對(duì)象 PreparedStatement pstmt = conn.prepareStatement(sql); //設(shè)置?的值 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)建對(duì)象,設(shè)置屬性值 user = new User(); user.setId(id); user.setUsername(username); user.setPassword(password); user.setGender(gender); //裝入集合 users.add(user); }
上述代碼中,注冊(cè)驅(qū)動(dòng)以及獲取連接部分,有很多將字符串信息寫(xiě)到代碼中去,即為 硬編碼;
// 注冊(cè)驅(qū)動(dòng) Class.forName("com.mysql.jdbc.Driver"); // 獲取Connection連接 String url = "jdbc:mysql:///db1?useSSL=false"; String uname = "root"; String pwd="1234";
而若我們對(duì)字符串信息發(fā)生變動(dòng),比如更改密碼等,我們就需要改動(dòng)編碼,然后重新編譯,重新打包,重新運(yùn)行;如此來(lái)看,代碼維護(hù)性相當(dāng)差。
包括下述 sql語(yǔ)句部分,我們會(huì)頻繁改動(dòng)sql語(yǔ)句:
// 接收輸入的查詢條件 String gender = "男"; // 定義sql String sql = "select * from tb_user where gender = ?";
每一次的改動(dòng)都意味著大量的任務(wù)量。
而在后續(xù)的 手動(dòng)設(shè)置參數(shù) 與 手動(dòng)封裝結(jié)果集 部分,JDBC的操作也是相當(dāng)?shù)姆爆崱?/p>
手動(dòng)設(shè)置參數(shù):
// 獲取pstmt對(duì)象 PreparedStatement pstmt = conn.prepareStatement(sql); //設(shè)置?的值 pstmt.setString(1,gender);
手動(dòng)封裝結(jié)果集:
// 遍歷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)建對(duì)象,設(shè)置屬性值 user = new User(); user.setId(id); user.setUsername(username); user.setPassword(password); user.setGender(gender); //裝入集合 users.add(user); }
針對(duì)JDBC中 硬編碼 問(wèn)題,MyBatis 通過(guò)將字符串寫(xiě)到 配置文件 中;
針對(duì) 注冊(cè)驅(qū)動(dòng)以及獲取連接部分 配置信息案例:
<!-- 連接池 --> <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>
針對(duì) sql語(yǔ)句部分 配置信息案例:
<select id="selectByGender" parameterType="string" resultType="com.xuhongduo.pojo.User"> select * from tb_user where gender = #{gender}; </select>
針對(duì)JDBC中 操作繁瑣 問(wèn)題,MyBatis 嘗試 自動(dòng)完成;
List<User> users = sqlSession.selectList("test.selectByGender", "男")
一行代碼搞定 手動(dòng)設(shè)置參數(shù) 與 手動(dòng)封裝結(jié)果集 部分;
MyBatis 主要是通過(guò)將 JDBC 的一些重復(fù)性、繁瑣性的代碼進(jìn)行封裝和抽象化,從而簡(jiǎn)化了原來(lái) JDBC 代碼的一些部分,具體來(lái)說(shuō),它主要簡(jiǎn)化了以下幾個(gè)方面的代碼:
在 JDBC 中,每次進(jìn)行數(shù)據(jù)庫(kù)操作都需要手動(dòng)獲取連接、創(chuàng)建 Statement 或者 PreparedStatement、執(zhí)行 SQL 語(yǔ)句、處理結(jié)果集,并且需要手動(dòng)關(guān)閉連接和釋放資源。而在 MyBatis 中,這些步驟都被封裝在 SqlSession 中,開(kāi)發(fā)者只需要通過(guò) SqlSession 獲取 Mapper 接口對(duì)象,然后調(diào)用方法即可。
// 原始 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();
在 JDBC 中,SQL 語(yǔ)句通常以字符串的形式直接寫(xiě)在代碼中,不利于維護(hù)和調(diào)試,并且容易受到 SQL 注入等安全問(wèn)題的影響。而在 MyBatis 中,SQL 語(yǔ)句通過(guò) XML 或注解的形式進(jìn)行編寫(xiě)和處理,可以更加靈活和方便地管理 SQL 語(yǔ)句,并且可以使用動(dòng)態(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 中,將查詢結(jié)果集映射到 Java 對(duì)象通常需要手動(dòng)進(jìn)行一些處理,例如通過(guò) ResultSet.getXXX() 方法獲取每個(gè)字段的值,然后手動(dòng)設(shè)置到 Java 對(duì)象中。而在 MyBatis 中,可以通過(guò)配置 resultMap 或使用注解等方式將查詢結(jié)果集映射到 Java 對(duì)象中,大大簡(jiǎn)化了代碼。
// 原始 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);
通過(guò)以上三個(gè)方面的簡(jiǎn)化,MyBatis 提高了代碼的可讀性、可維護(hù)性和可擴(kuò)展性,使得開(kāi)發(fā)者可以更加專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),而不需要過(guò)多關(guān)注底層的數(shù)據(jù)庫(kù)訪問(wèn)細(xì)節(jié)。
關(guān)于“MyBatis怎么簡(jiǎn)化的JDBC”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“MyBatis怎么簡(jiǎn)化的JDBC”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。