溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MyBatis怎么簡(jiǎn)化的JDBC

發(fā)布時(shí)間:2023-03-21 14:18:43 來(lái)源:億速云 閱讀:117 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹了MyBatis怎么簡(jiǎn)化的JDBC的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇MyBatis怎么簡(jiǎn)化的JDBC文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

    MyBatis 作用

    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);

    簡(jiǎn)化JDBC開(kāi)發(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)以及獲取連接部分,有很多將字符串信息寫(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);
    }

    MyBatis 簡(jiǎn)化思路

    配置文件

    針對(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>

    自動(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 中,開(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();

    SQL 語(yǔ)句的編寫(xiě)和處理

    在 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);

    結(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ò)展性,使得開(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è)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(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)容。

    AI