MyBatis 如何簡(jiǎn)化的 JDBC(思路詳解)
MyBatis 作用
MyBatis 是一個(gè) 持久層 框架,用于 簡(jiǎn)化JDBC開發(fā);
持久層:即負(fù)責(zé)將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)的那一層代碼;
框架:半成品軟件,可重用、通用的、軟件基礎(chǔ)代碼模型;
簡(jiǎn)化JDBC開發(fā):JDBC存在 硬編碼 與 操作繁瑣 的缺點(diǎn);
簡(jiǎn)化JDBC開發(fā)
JDBC存在 硬編碼 與 操作繁瑣 的缺點(diǎn);
完整JDBC代碼
// 注冊(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)以及獲取連接部分,有很多將字符串信息寫到代碼中去,即為 硬編碼;
// 注冊(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);
}MyBatis 簡(jiǎn)化思路
配置文件
針對(duì)JDBC中 硬編碼 問(wèn)題,MyBatis 通過(guò)將字符串寫到 配置文件 中;
針對(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>自動(dòng)完成
針對(duì)JDBC中 操作繁瑣 問(wèn)題,MyBatis 嘗試 自動(dòng)完成;
List<User> users = sqlSession.selectList("test.selectByGender", "男")一行代碼搞定 手動(dòng)設(shè)置參數(shù) 與 手動(dòng)封裝結(jié)果集 部分;
補(bǔ)充:Mybatis是如何簡(jiǎn)化JDBC代碼的
MyBatis 主要是通過(guò)將 JDBC 的一些重復(fù)性、繁瑣性的代碼進(jìn)行封裝和抽象化,從而簡(jiǎn)化了原來(lái) JDBC 代碼的一些部分,具體來(lái)說(shuō),它主要簡(jiǎn)化了以下幾個(gè)方面的代碼:
數(shù)據(jù)庫(kù)連接和資源的管理
在 JDBC 中,每次進(jìn)行數(shù)據(jù)庫(kù)操作都需要手動(dòng)獲取連接、創(chuàng)建 Statement 或者 PreparedStatement、執(zhí)行 SQL 語(yǔ)句、處理結(jié)果集,并且需要手動(dòng)關(guān)閉連接和釋放資源。而在 MyBatis 中,這些步驟都被封裝在 SqlSession 中,開發(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();SQL 語(yǔ)句的編寫和處理
在 JDBC 中,SQL 語(yǔ)句通常以字符串的形式直接寫在代碼中,不利于維護(hù)和調(diào)試,并且容易受到 SQL 注入等安全問(wèn)題的影響。而在 MyBatis 中,SQL 語(yǔ)句通過(guò) XML 或注解的形式進(jìn)行編寫和處理,可以更加靈活和方便地管理 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);結(jié)果集的映射
在 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ò)展性,使得開發(fā)者可以更加專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),而不需要過(guò)多關(guān)注底層的數(shù)據(jù)庫(kù)訪問(wèn)細(xì)節(jié)。
到此這篇關(guān)于MyBatis 怎樣簡(jiǎn)化的 JDBC的文章就介紹到這了,更多相關(guān)MyBatis 簡(jiǎn)化 JDBC內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
BlockingQueue隊(duì)列處理高并發(fā)下的日志
這篇文章主要介紹了BlockingQueue隊(duì)列處理高并發(fā)下的日志示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
如何使用會(huì)話Cookie和Java實(shí)現(xiàn)JWT身份驗(yàn)證
這篇文章主要介紹了如何使用會(huì)話Cookie和Java實(shí)現(xiàn)JWT身份驗(yàn)證,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2021-03-03
JAVA實(shí)現(xiàn)單例模式的四種方法和一些特點(diǎn)
JAVA實(shí)現(xiàn)單例模式的四種方法和一些特點(diǎn),需要的朋友可以參考一下2013-03-03
SpringMVC返回的ResponseEntity出現(xiàn)亂碼及解決
這篇文章主要介紹了SpringMVC返回的ResponseEntity出現(xiàn)亂碼及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
JDK8接口的默認(rèn)與靜態(tài)方法-接口與抽象類的區(qū)別詳解
這篇文章主要介紹了JDK8接口的默認(rèn)與靜態(tài)方法-接口與抽象類的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06
IDEA 創(chuàng)建一個(gè)Mybatis Maven項(xiàng)目的方法步驟(圖文)
這篇文章主要介紹了IDEA 創(chuàng)建一個(gè)Mybatis Maven項(xiàng)目的方法步驟(圖文),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
java 使用ConcurrentHashMap和計(jì)數(shù)器實(shí)現(xiàn)鎖
這篇文章主要介紹了java 使用ConcurrentHashMap和計(jì)數(shù)器實(shí)現(xiàn)鎖的相關(guān)資料,需要的朋友可以參考下2017-05-05

