上一篇使用「命名空間 + 語句 ID」的方式調用映射語句,雖然可行但不夠直觀,且缺乏編譯期檢查。MyBatis 支援 Mapper 介面綁定,利用動態代理自動實現介面方法,讓開發更符合面向介面編程習慣。
<mapper namespace="com.cn.inter.IMessageOperation">
<select id="selectUserByID" parameterType="int" resultType="com.cn.imooc.entity.Message">
select * from `message` where id = #{id}
</select>
<select id="selectMessages" resultType="Message">
select id, command, description, comment from message;
</select>
</mapper>
關鍵點:namespace 必須與介面全限定名一致;id 必須與介面方法名一致;參數與返回類型需匹配。
package com.cn.inter;
import com.cn.imooc.entity.Message;
public interface IMessageOperation {
Message selectUserByID(Integer id);
// 可新增其他方法,如 selectMessages()
}
package com.cn.test;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.cn.imooc.entity.Message;
import com.cn.inter.IMessageOperation;
public class MyTest2 {
public static void main(String[] args) {
Reader reader = null;
SqlSession sqlSession = null;
try {
reader = Resources.getResourceAsReader("Configuration.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
sqlSession = sqlSessionFactory.openSession();
// 獲取 Mapper 介面代理物件
IMessageOperation mapper = sqlSession.getMapper(IMessageOperation.class);
// 直接呼叫介面方法
Message message = mapper.selectUserByID(3);
System.out.println(message);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sqlSession != null) sqlSession.close();
}
}
}
| 維度 | 字串調用 | Mapper 介面 |
|---|---|---|
| 調用方式 | selectOne("ns.id", param) | mapper.method(param) |
| 編譯檢查 | 無 | 有 |
| 重構友好 | 差 | 優 |
| 適用場景 | 動態 SQL、腳本 | 常規 CRUD、團隊協作 |
實務中推薦使用 Mapper 介面作為主流方式,僅在高度動態場景下考慮字串調用。