iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0

MyBatis由來

MyBatis是由iBatis 3.x更名而來,iBatis原先屬於apache software foundation,於2010年轉移到了google code,因此ibatis3.x正式改名為Mybatis

ORM框架

有些人說MyBatis是ORM框架中的一種,而有些人則說不是,那ORM是什麼?ORM全名為Object Relational Mapping,實際上只是一種概念,也就是將Java物件的型別與關聯式資料庫(RDBMS)的型別做映射,這種映射關係的概念,就是所謂的ORM。

MyBatis與ORM框架的差異

那為什麼MyBatis會有人認為他是ORM框架,有人認為不是呢?主要原因在於ORM的概念是透過建立物件與資料表之間映射關係,使開發人員在開發程式時,不需撰寫SQL,以此減少對資料庫基本操作的程式開發,並避免SQL上的惡意注入攻擊。而MyBatis最特別的部分就是在這裡了,我們可以建立Java物件與資料庫的映射關係,也可以自行撰寫SQL。

MyBatis使用方式

相信所有寫程式的人都知道介面的用途,而MyBatis就是將Dao(Data Access Object)相關方法定義為介面Mapper,再透過XML來實作,實際做法如下:

  1. XML中設置namespace,定義此XML是實作哪一個Mapper interface
<mapper namespace="com.twm.opbiz.dao.CountyVOMapper"></mapper>
  1. XML中使用<select><insert><update><delete>id來對應實作介面Mapper中的哪個方法
public interface CountyVOMapper {
  int deleteByPrimaryKey(String countyId);
  int insert(CountyVO record);
  int insertSelective(CountyVO record);
  CountyVO selectByPrimaryKey(String countyId);
  List<CountyVO> selectAll();
  int updateByPrimaryKeySelective(CountyVO record);
  int updateByPrimaryKey(CountyVO record);
}
<delete id="deleteByPrimaryKey" parameterType="java.lang.String"></delete>
<insert id="insert" parameterType="com.twm.opbiz.vo.CountyVO"></insert>
<insert id="insertSelective" parameterType="com.twm.opbiz.vo.CountyVO"></insert>
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap"></select>
<select id="selectAll" resultMap="BaseResultMap"></select>
<update id="updateByPrimaryKeySelective" parameterType="com.twm.opbiz.vo.CountyVO"></update>
<update id="updateByPrimaryKey" parameterType="com.twm.opbiz.vo.CountyVO"></update>
  1. 與ORM框架雷同,可以使用<resultMap>自行建立物件與資料表之間映射關係
<resultMap id="BaseResultMap" type="com.twm.opbiz.vo.CountyVO">
  <id column="county_id" jdbcType="VARCHAR" property="countyId" />
  <result column="county_name" jdbcType="VARCHAR" property="countyName" />
  <result column="county_code" jdbcType="VARCHAR" property="countyCode" />
  <result column="cr_date" jdbcType="TIMESTAMP" property="crDate" />
  <result column="cr_user" jdbcType="VARCHAR" property="crUser" />
  <result column="datestamp" jdbcType="TIMESTAMP" property="datestamp" />
  <result column="userstamp" jdbcType="VARCHAR" property="userstamp" />
</resultMap>
  1. SQL指令需帶入參數查詢時,可以使用 parameterType 設定參數型態,也可將重複性高的SQL以<sql>獨立設置,供後續SQL直接引用,減少相同程式碼的撰寫
<sql id="Base_Column_List">
  county_id, county_name, county_code, cr_date, cr_user, datestamp, userstamp
</sql>
<select id="selectAll" resultMap="BaseResultMap">
  select 
  <include refid="Base_Column_List" />
  from opbiz.tb_county
  order by county_code, county_id
</select>
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
  select 
  <include refid="Base_Column_List" />
  from opbiz.tb_county
  where county_id = #{countyId,jdbcType=VARCHAR}
</select>

MyBatis的高度彈性是我們選擇它的原因

綜上所述,我們可以知道MyBatis在應用上有較多的彈性,傳統ORM的框架在處理多個表格JOIN、或是較為複雜的查詢時,比起直接下SQL語句,在處理上是較為麻煩及繁瑣的。因此我們專案選擇了MyBatis而非標準的ORM框架,使其在專案上的應用能更有彈性,只是需要特別注意的是,自行撰寫的SQL語法是否會受到惡意注入攻擊。


上一篇
[Day20]Maven簡介
下一篇
[Day22] Spring Cloud 與 GCS
系列文
Google商家大解密就靠網頁設計來加成30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言