Mybatis實(shí)現(xiàn)SQL映射的兩種方法(xml文件形式和注解形式)
Mybatis實(shí)現(xiàn)SQL映射的兩種方式
SQL映射是Mybatis中最重要,復(fù)雜的組件,它由一個接口和對應(yīng)的XML文件(或注解)組成。
它可以配置以下內(nèi)容:
- 描述映射規(guī)則。
- 提供 SQL 語句,并可以配置 SQL 參數(shù)類型、返回類型、緩存刷新等信息。
- 配置緩存。
- 提供動態(tài) SQL。
在介紹實(shí)現(xiàn)映射的方式之前,先用SQL在數(shù)據(jù)庫中創(chuàng)建一個role表。
CREATE TABLE `role` ( `id` BIGINT(20) NOT NULL, `role_name` VARCHAR(20) DEFAULT NULL, `note` VARCHAR(20) DEFAULT NULL, PRIMARY KEY (`id`) )
定義一個POJO,如下所示:
package com.ljt.mybatis; public class Role { private Long id; private String roleName; private String note; }
映射器的主要作用就是將SQL查詢到的結(jié)果映射為一個POJO,或者將POJO的數(shù)據(jù)插入到數(shù)據(jù)庫中,并定義一些關(guān)于緩存等的重要內(nèi)容。
注意,開發(fā)只是一個接口,而不是一個實(shí)現(xiàn)類。
初學(xué)者可能會有很大的疑問,接口不是不能運(yùn)行嗎?
是的,接口確實(shí)不能直接運(yùn)行。Mybatis使用了動態(tài)代理技術(shù)使得接口能夠運(yùn)行起來,目前我們只需要知道Mybatis會為這個接口生成一個代理對象,代理對象會去處理相關(guān)的邏輯即可。
一,用XML實(shí)現(xiàn)映射器
用 XML 定義映射器分為兩個部分:接口和 XML。
先定義一個映射器接口
package com.ljt.mybatis.mapper; import com.ljt.mybatis.bean.Role; public interface RoleMapper { public Role getRole(Long id); }
在XML基礎(chǔ)配置文件中寫入這樣一段代碼:
<mapper resource="com/ljt/mybatis/mapper/RoleMapper.xml" />
它的作用就是引入一個 XML 映射文件文件。
用 XML 方式創(chuàng)建映射器,如下所示:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mybatis.mapper.RoleMapper"> <select id="getRole" parameterType="long" resultType="role"> SELECT id,role_name as roleName,note FROM role WHERE id =#{id} </select> </mapper>
這就完成了一個映射器的定義。
mapper元素中的屬性 namespace 所對應(yīng)的是一個接口的全限定名,于是 MyBatis 上下文就可以通過它找到對應(yīng)的接口。
select 元素表明這是一條查詢語句,而屬性 id 標(biāo)識了這條 SQL所映射的方法名,屬性 parameterType=“long” 說明傳遞給 SQL 的是一個 long 型的參數(shù),而 resultType=“role” 表示返回的是一個 role 類型的返回值。而 role 是之前配置文件 mybatis-config.xml 配置的類的別名,指代的是 com.ljt.mybatis.bean.Role。
這條 SQL 中的 #{id} 表示傳遞進(jìn)去的參數(shù)。
這里采用的是一種被稱為自動映射的功能,MyBatis 在默認(rèn)情況下提供自動映射,只要 SQL 返回的列名能和 POJO 對應(yīng)起來即可。
這里 SQL 返回的列名 id 和 note 是可以和之前定義的 POJO 的屬性對應(yīng)起來的,而表里的列 role_name 通過 SQL 別名的改寫,使其成為 roleName,也是和 POJO 對應(yīng)起來的,所以此時 MyBatis 就可以把 SQL 查詢的結(jié)果通過自動映射的功能映射成為一個 POJO。
二,注解實(shí)現(xiàn)映射
除 XML 方式定義映射器外,還可以采用注解方式定義映射器,它只需要一個接口就可以通過 MyBatis 的注解來注入 SQL,如下所示。
package com.ljt.mybatis.mapper; import com.ljt.mybatis.bean.Role; import org.apache.ibatis.annotations.Select; public interface RoleMapper { @Select("select id,role_name as roleName,note from t_role where id=#{id}") public Role getRole(Long id); }
這完全等同于上面使用XML文件方式創(chuàng)建映射器。
目前好像是使用注解映射會比XML映射好用的多(畢竟代碼量少很多)。。。
真的是這樣嗎?
我們來看看以下這條SQL
SELECT .......... From dbo.PDA_TB_Produce a With(Nolock) Join dbo.DctOperationList b With(Nolock) On a.Operation_Code=b.Operation_Code Join dbo.DctOneStatusList c With(Nolock) On a.One_Status_Code=c.One_Status_Code Left join dbo.DctTwoStatusList d With(Nolock) On c.One_Status_Code=d.One_Status_Code and a.Two_Status_Code=d.Two_Status_Code left Join dbo.DctMachineList e With(Nolock) On a.Operation_Code=e.Operation_Code and a.Machine_Code=e.Machine_Code left Join dbo.DctOperationList f With(Nolock) On a.Next_Operation_Code=f.Operation_Code Join dbo.DctUserList g With(Nolock) On a.User_ID_Operating=g.User_ID Join dbo.DctUserList h With(Nolock) On a.User_ID=h.User_ID
emmm…
顯然這條 SQL 比較復(fù)雜,如果放入 @Select 中會明顯增加注解的內(nèi)容。如果把大量的 SQL 放入 代碼中,顯然代碼的可讀性也會下降。
如果同時還要考慮使用動態(tài) SQL, 還需要加入其他的邏輯,這樣就使得這個注解更加復(fù)雜了,不利于日后的維護(hù)和修改。
這時候就會有老實(shí)人發(fā)問了,那么到底是使用注解還是XML呢?
實(shí)際上,注解方式和 XML 方式同時定義時,XML 方式將覆蓋掉注解方式,所以 MyBatis 官方推薦使用的是 XML 方式。
此外,XML 可以相互引入,而注解是不可以的,所以在一些比較復(fù)雜的場景下,使用 XML 方式會更加靈活和方便。
所以大部分的企業(yè)都是以 XML 為主,當(dāng)然,在一些簡單的表和應(yīng)用中使用注解方式也會比較簡單。
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
- mybatis(mybatis-plus)映射文件(XML文件)中特殊字符轉(zhuǎn)義的實(shí)現(xiàn)
- Mybatis-config.xml中映射Mapper.xml文件遇到的錯誤及解決
- Java?Mybatis的初始化之Mapper.xml映射文件的詳解
- 解決Mybatis映射文件mapper.xml中的注釋問題
- mybatis整合spring實(shí)現(xiàn)開啟mapper.xml映射文件掃描
- mybatis映射文件mapper.xml的具體寫法
- MyBatis中XML 映射文件中常見的標(biāo)簽說明
- mybatis框架的xml映射文件常用查詢指南
- Java的MyBatis框架中XML映射緩存的使用教程
- MyBatis中XML映射器的實(shí)現(xiàn)
相關(guān)文章
Java從網(wǎng)絡(luò)讀取圖片并保存至本地實(shí)例
這篇文章主要為大家詳細(xì)介紹了Java從網(wǎng)絡(luò)讀取圖片并保存至本地的實(shí)例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04Java模擬rank/over函數(shù)實(shí)現(xiàn)獲取分組排名的方法詳解
這篇文章主要為大家詳細(xì)介紹了Java模擬rank()、over()函數(shù)獲取分組排名的方法設(shè)計及實(shí)現(xiàn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-04-04Java裝飾器設(shè)計模式_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java裝飾器設(shè)計模式的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-05-05java利用多線程和Socket實(shí)現(xiàn)猜拳游戲
這篇文章主要為大家詳細(xì)介紹了java利用多線程和Socket實(shí)現(xiàn)猜拳游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-08-08手把手帶你實(shí)現(xiàn)第一個Mybatis程序
這篇文章主要介紹了mybatis實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2021-07-07