1. 程式人生 > >Spring Jdbc Template 與 MyBatis 的比較

Spring Jdbc Template 與 MyBatis 的比較

Spring Jdbc -- 使用最少的程式碼和配置完成你的專案。

Spring Jdbc的介面比較豐富,其中大部分介面都由內部消化了,我們只需要關注少量介面即可。

JdbcOperations 和 NamedParameterJdbcOperations 對應的實現類: JdbcTemplate 和 NamedParameterJdbcTemplate     Spring Jdbc 的核心介面和實現,其他的介面幾乎都是給這兩個介面提供服務的。提供了非常方便的資料庫操作方法,包括CRUD、函式與存過呼叫、批量處理等。

RowMapper     實現該介面可以非常方便的對結果集進行處理,常用的實現為 BeanPropertyRowMapper。

SqlParameterSource     實現該介面可以非常方便地繫結引數值到SQL的命名引數上,常用的實現為 BeanPropertySqlParameterSource。

BeanPropertyRowMapper     根據類的屬性名把結果集轉換成業務物件,支援屬性名和下劃線風格的列名。

BeanPropertySqlParameterSource     根據物件例項屬性名轉換成SQL中的命名引數,自動繫結引數值為例項的屬性值。

BeanPropertyRowMapper 和 BeanPropertySqlParameterSource 類都使用了反射機制,在反射時都使用了快取機制,完全不需要擔心高併發和高頻率下的效能問題。Spring Jdbc 與 MyBatis 比較:

各新建一個完全相同的實體類 EmployeerSpring Jdbc 的CRUD實現: 編碼長度:1400字 涉及檔案:介面、實現 進化版:高封裝、CRUD的SQL根據反射生成、增刪欄位後無須修改

public class EmployeerDao {

/*省略JdbcOperations注入*/

    public Employeer findEmployeerById(String employeerId) {
        String sql = "select * from `employeer` where employeer_id = ?";
        return this.getJdbcOperations().update(sql, BeanPropertyRowMapper.newInstance(Employeer.class),employeerId);
    }

    public boolean addEmployeer(Employeer employeer) {
        String sql = "insert into `employeer`(employeer_id,employeer_name,employeer_age,employeer_department,employeer_worktype) " +
                " values(:employeerId,:employeerName,:employeerAge,:employeerDepartment,:employeerWorktype)";
        return this.getNamedParamOperations().update(sql, new BeanPropertySqlParameterSource(employeer)) > 0;
    }

    public boolean deleteEmployeer(String employeerId) {
        String sql = "delete from `employeer` where employeer_id = ?";
        return this.getJdbcOperations().update(sql, employeerId) > 0;
    }

    public boolean updateEmployeer(Employeer employeer) {
        String sql = "update employeer set employeer_name = :employeerName,employeer_age= :employeerAge,employeer_department = employeerDepartment  " +
                ",employeer_worktype= :employeerWorktype  where employeer_id = :employeerId";
        return this.getNamedParamOperations().update(sql, new BeanPropertySqlParameterSource(employeer)) > 0;
    }

}

MyBatis 的CRUD實現: 編碼長度:3000字 涉及檔案:介面、實現、配置檔案 進化版:介面註解(但不能使用功能豐富的標籤了),增刪欄位後須要修改

<mapper namespace="com.mucfc.model.EmployeerMapper">

     <!-- 查詢 -->
     <select id="findEmployeerByID" parameterType="int" resultType="Employeer">
     select* from `employeer` where employeer_id =#{employeer_id}
     </select>

      <!-- 插入 -->
    <insert id="addEmployeer" parameterType="Employeer">
        insert into `employeer`(employeer_id,employeer_name,employeer_age,employeer_department,employeer_worktype)
        values(#{employeer_id},#{employeer_name},#{employeer_age},#{employeer_department},#{employeer_worktype})
    </insert>

     <!-- 刪除  -->
    <delete id="deleteEmployeer" parameterType="int">
        delete from `employeer` where employeer_id = #{employeer_id}
    </delete>

    <!-- 修改 -->
    <update id="updateEmployeer" parameterType="Employeer">
        update employeer set employeer_name = #{employeer_name},employeer_age= #{employeer_age},employeer_department = #{employeer_department}
        ,employeer_worktype=#{employeer_worktype}  where employeer_id = #{employeer_id}
    </update>

 </mapper>
public class EmployeerDao {

/*省略sqlSessionFactory注入*/

    /**
     * 查詢
     */
    public Employeer findEmployeerById(int id) {
        SqlSession session = null;
        try {
            session = sqlSessionFactory.openSession();
            return (Employeer) session.selectOne(
                    "com.mucfc.model.EmployeerMapper.findEmployeerByID", 1);
        } finally {
            session.close();
        }
    }

    /**
     * 增加
     */
    public boolean addEmployeer(Employeer employeer){
        SqlSession session = null;
        try {
            session = sqlSessionFactory.openSession();
            boolean result = session.insert("com.mucfc.model.EmployeerMapper.addEmployeer", employeer ) > 0;
            session.commit() ;
return result;
        } finally {
            session.close();
        }
    }

    /**
     * 刪除
     *
     */
    public boolean deleteEmployeer(int id){
        SqlSession session = null;
        try {
            session = sqlSessionFactory.openSession();
             boolean result = session.delete("com.mucfc.model.EmployeerMapper.deleteEmployeer",id) > 0;
            session.commit() ;
return result;
        } finally {
            session.close();
        }
    }

    /**
     * 更改
     */
    public boolean updateEmployeer(Employeer employeer){
        SqlSession session = null;
        try {
            session = sqlSessionFactory.openSession();
            boolean result = session.update("com.mucfc.model.EmployeerMapper.updateEmployeer",employeer) > 0;
            session.commit() ;
return result;
        } finally {
            session.close();
        }
    }

}

經過比較,Spring Jdbc 的開發效率比 MyBatis 要高出不少,可配合 Spring Cache、Transacation、Bean使用。