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