" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis實現(xiàn)SQL映射文件

 更新時間:2024年06月20日 10:17:03   作者:花落隨風(fēng)輕飄舞  
映射器是 MyBatis 中最復(fù)雜并且是最重要的組件,本文主要介紹了MyBatis實現(xiàn)SQL映射文件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1 SQL 映射文件介紹

映射器是 MyBatis 中最復(fù)雜并且是最重要的組件。它由一個接口和 SQL 映射文件(或者注解)組成。在映射器中我們可以配置各類 SQL、動態(tài) SQL、緩存、存儲過程、級聯(lián)等復(fù)雜的內(nèi)容。

以下是 SQL 映射文件的部分元素介紹

元素描述
cache該命名空間的緩存配置
cache-ref引用其它命名空間的緩存配置
resultMap描述如何從數(shù)據(jù)庫結(jié)果集中加載對象,它是最復(fù)雜也是最強大的元素
sql可被其它語句引用的可重用語句塊
select映射查詢語句
insert映射插入語句
update映射更新語句
delete映射刪除語句

2 select 元素

select 元素表示 SQL 的 select 語句,用于查詢,以下是 select 元素的部分屬性

屬性

描述
id在命名空間中唯一的標識符,可以被用來引用這條語句
parameterType將會傳入這條語句的參數(shù)類的全類名或別名。這個屬性是可選的,因為 MyBatis 可以通過類型處理器(TypeHandler) 推斷出具體傳入語句的參數(shù),默認值為未設(shè)置(unset)
resultType從這條語句中返回的期望類型的類的全類名或別名。 注意如果返回的是集合,那應(yīng)該設(shè)置為集合包含的類型,而不是集合本身。可以使用 resultType 或 resultMap,但不能同時使用
resultMap外部 resultMap 的命名引用。結(jié)果集的映射是 MyBatis 最強大的特性,如果你對其理解透徹,許多復(fù)雜映射的情形都能迎刃而解??梢允褂?resultMap 或 resultType,但不能同時使用
flushCache將其設(shè)置為 true 后,只要語句被調(diào)用,都會導(dǎo)致本地緩存和二級緩存被清空,默認值:false
useCache將其設(shè)置為 true 后,將會導(dǎo)致本條語句的結(jié)果被二級緩存緩存起來,默認值:對 select 元素為 true
timeout這個設(shè)置是在拋出異常之前,驅(qū)動程序等待數(shù)據(jù)庫返回請求結(jié)果的秒數(shù)。默認值為未設(shè)置(unset)(依賴驅(qū)動)
fetchSize這是一個給驅(qū)動的提示,嘗試讓驅(qū)動程序每次批量返回的結(jié)果行數(shù)和這個設(shè)置值相等。 默認值為未設(shè)置(unset)(依賴驅(qū)動)
statementTypeSTATEMENT,PREPARED 或 CALLABLE 中的一個。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED
resultSetTypeFORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等價于 unset) 中的一個,默認值為 unset (依賴驅(qū)動)
databaseId如果配置了數(shù)據(jù)庫廠商標識 (databaseIdProvider) 并且存在兩個相同的語句,一個帶 databaseId 而另一個不帶,MyBatis 會優(yōu)先加載帶有 databaseId 的語句。如果 databaseId 與當前數(shù)據(jù)庫匹配,則不帶 databaseId 的相同語句將被忽略。未設(shè)置 databaseId 使用通用 SQL 規(guī)則
resultOrderedresultOrdered:這個設(shè)置僅對嵌套結(jié)果 select 語句適用:如果為 true,就是假設(shè)包含了嵌套結(jié)果集或是分組,這樣的話當返回一個主結(jié)果行的時候,就不會發(fā)生有對前面結(jié)果集的引用的情況。 這就使得在獲取嵌套的結(jié)果集的時候不至于導(dǎo)致內(nèi)存不夠用。默認值:false
resultSets這個設(shè)置僅對多結(jié)果集的情況適用。它將列出語句執(zhí)行后返回的結(jié)果集并給每個結(jié)果集一個名稱,名稱是逗號分隔的

3 insert 元素

屬性

描述
id在命名空間中唯一的標識符,可以被用來引用這條語句
parameterType將會傳入這條語句的參數(shù)的類全限定名或別名。這個屬性是可選的,因為 MyBatis 可以通過類型處理器(TypeHandler)推斷出具體傳入語句的參數(shù),默認值為未設(shè)置(unset)
flushCache將其設(shè)置為 true 后,只要語句被調(diào)用,都會導(dǎo)致本地緩存和二級緩存被清空,默認值:(對 insert、update 和 delete 語句)true
timeout這個設(shè)置是在拋出異常之前,驅(qū)動程序等待數(shù)據(jù)庫返回請求結(jié)果的秒數(shù)。默認值為未設(shè)置(unset)(依賴數(shù)據(jù)庫驅(qū)動)
statementType可選 STATEMENT,PREPARED 或 CALLABLE。這會讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認值:PREPARED
useGeneratedKeys(僅適用于 insert 和 update)這會令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由數(shù)據(jù)庫內(nèi)部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)的自動遞增字段),默認值:false
keyProperty(僅適用于 insert 和 update)指定能夠唯一識別對象的屬性,MyBatis 會使用 getGeneratedKeys 的返回值或 insert 語句的 selectKey 子元素設(shè)置它的值,默認值:未設(shè)置(unset)。如果生成列不止一個,可以用逗號分隔多個屬性名稱。不能和keyColumn連用
keyColumn(僅適用于 insert 和 update)設(shè)置生成鍵值在表中的列名,在某些數(shù)據(jù)庫(像 PostgreSQL)中,當主鍵列不是表中的第一列的時候,是必須設(shè)置的。如果生成列不止一個,可以用逗號分隔多個屬性名稱。不能和keyProperty連用
databaseId同 select 元素

主鍵回填

在 MyBatis 中,若表中的主鍵設(shè)置為自增,插入數(shù)據(jù)時沒有插入主鍵,但是又想獲得數(shù)據(jù)庫中該條數(shù)據(jù)的主鍵,那么可以通過設(shè)置 useGeneratedKeys=”true”,然后再把 keyProperty 設(shè)置到目標屬性(如 User 類中的 id 屬性)上來獲得該值。

<insert id="insertUser" parameterType="com.entity.User" useGeneratedKeys="true" keyProperty="id">
        insert into person(name, age, sex)
        values (#{name}, #{age}, #{sex});
</insert>
//添加一個用戶數(shù)據(jù)
@Test
public void testInsertUser() {
    String statement = "com.mapper.UserMapper.insertUser";
    User user = new User();
    user.setName("孫尚香");
    user.setAge(24);
    user.setSex("女");
    int i = sqlSession.insert(statement, user);
    System.out.println( (i>0)? "添加成功!":"添加失敗!");
    //提交插入的數(shù)據(jù)
    sqlSession.commit();
    sqlSession.close();
    // 輸出返回的主鍵值
    System.out.println("返回的主鍵值=" + user.getId());
}

自定義主鍵并且可以在 Java 中通過屬性獲得該值

在 MyBatis 中可以通過 selectKey 元素自定義主鍵,以下是其屬性介紹

  • keyProperty:selectKey 需要設(shè)置的目標屬性
  • resultType:結(jié)果類型
  • order:可以設(shè)置為 BEFORE 或 AFTER ,表示先設(shè)置主鍵,后執(zhí)行插入語句或先執(zhí)行插入語句,后設(shè)置主鍵
<insert id="insertUser" parameterType="com.entity.User" >
    <selectKey keyProperty="id" resultType="int" order="BEFORE">
        select ROUND(RAND()*1000)
    </selectKey>
    insert into person(id, name, age, sex)
    values (#{id}, #{name}, #{age}, #{sex});
</insert>
@Test
public void testInsertUser() {
    String statement = "com.mapper.UserMapper.insertUser";
    User user = new User();
    user.setName("鄭旦");
    user.setAge(24);
    user.setSex("女");
    int i = sqlSession.insert(statement, user);
    System.out.println( (i>0)? "添加成功!":"添加失??!");
    //提交插入的數(shù)據(jù)
    sqlSession.commit();
    sqlSession.close();
    // 輸出返回的主鍵值
    System.out.println("返回的主鍵值=" + user.getId());
}

4 update 和 delete 元素

update 和 delete 元素在使用上比較簡單,所以這里把它們放在一起論述。它們和 insert 元素的屬性差不多,執(zhí)行完后也會返回一個整數(shù),用來表示該 SQL 語句影響了多少條數(shù)據(jù)庫記錄。

<!-- 根據(jù) id 更新用戶 -->
<update id="updateUser">
    update person set name = #{name},
                      age = #{age},sex = #{sex} where id = #{id}
</update>
<!-- 根據(jù) id 刪除用戶 -->
<delete id="deleteUser" parameterType="int">
    delete from person where id = #{id}
</delete>

5 sql 元素       

sql 元素是用來定義可重用的 sql 代碼片段,這樣在字段比較多的時候,以便在其它語句中使用。需要結(jié)合 include 元素一起使用,以下是代碼示例。

<!--定義sql代碼片段-->
<sql id="userCols">
    id,username,age,sex
</sql>
<!-- 查詢所有用戶 -->
<select id="selectAllUser" resultType="com.entity.User">
    select <include refid="userCols"/> from person
</select>

6 parameterType 元素

parameterType 元素可以輸入以下類型:

  • Java 基本數(shù)據(jù)類型
  • POJO 類型
  • Map 類型
<!-- 通過 普通數(shù)據(jù)類型 int 查詢一個用戶 -->
<select id="selectUserById" parameterType="int" resultType="com.entity.User">
    select * from person where id = #{id};
</select>

<!-- 通過 POJO 類型 User 添加用戶-->
<insert id="insertUser" parameterType="com.entity.User">
    insert into person(id,username,age,sex) values (#{id},#{username},#{age},#{sex});
</insert>
 
<!-- 通過 嵌套 POJO 類型 查詢一個用戶,QueryVo 類中定義了 User user 屬性 -->
<select id="selectUserByUserNameAndAge" parameterType="com.entity.QueryVo" resultType="com.entity.User">
    select * from person where name = #{user.name} and age = #{user.age};
</select>

<!-- 通過 Map 類型 查詢一個用戶, HashMap<String, Object> map = new HashMap<>(); 
map.put("name","趙飛燕"); map.put("age",24); 通過 key 獲得 map 中的 value-->
<select id="selectUserByMap" parameterType="hashmap" resultType="com.entity.User">
    select * from person where name = #{name} and age = #{age};
</select>

7 resultType 元素

resultType 元素和 parameterType 元素用法差不多,一個是輸出,一個是輸入。resultType 元素可以輸出以下類型:

  • Java 基本數(shù)據(jù)類型
  • POJO 對象
  • POJO 對象列表
  • Map 對象列表
<!-- 統(tǒng)計用戶總數(shù)量,輸出為一個整數(shù) int -->
<select id="countUsers" resultType="int">
    select count(1) from person
</select>

<!-- 通過 id 查詢一個用戶,輸出為一個 User -->
<select id="selectUserById" parameterType="int" resultType="com.entity.User">
    select * from personwhere id = #{id};
</select>

<!-- 查詢所有用戶,輸出為一個 List<User> 列表 -->
<select id="selectAllUser" resultType="com.entity.User">
    select * from person
</select>

<!-- 查詢所有用戶, 輸出為一個 List<HashMap<String, Object>> Map 列表-->
<select id="selectAllUser" resultType="hashmap">
    select * from person
</select>

8 resultMap 元素(重要)

我們在使用 resultType 的時候,需要保證數(shù)據(jù)庫表中的字段名和表對應(yīng)實體類的屬性名稱一致才行(包括駝峰命名規(guī)則)。那不一致怎么辦,查詢的時候可以給列名起個別名,但是一般不建議這樣做,而是通過 resultMap 元素進行一個轉(zhuǎn)換。

<!-- id:唯一標識,type:需要映射的 Java 類型-->
<resultMap id="userMap" type="com.entity.User">
    <!-- 與主鍵字段的對應(yīng),property對應(yīng)實體屬性,column對應(yīng)表字段 -->
    <id property="userId" column="id"/>
    <!-- 與非主鍵字段的對應(yīng),property對應(yīng)實體屬性,column對應(yīng)表字段 -->
    <result property="userName" column="username"/>
    <result property="userAge" column="age"/>
    <result property="userSex" column="sex"/>
</resultMap>

<!-- 查詢所有用戶,返回集為resultMap類型,resultMap的value上面配置的 id=userMap 要一致-->
<select id="selectAllUser" resultMap="userMap">
    select * from person
</select>

上述代碼是不是很眼熟,在 MyBatis 案例中使用了 @ResultMap 注解來實現(xiàn)上述代碼

resultMap 元素的組成

<!-- autoMapping:指定是否自動映射查詢結(jié)果的列到 Java 對象的屬性。
默認為開啟(true),如果設(shè)置為 false,則需要手動配置每個屬性的映射關(guān)系 -->
<resultMap id="標識" type="輸出類型" extends="繼承其他 <resultMap>" autoMapping="自動映射">
    <constructor><!--構(gòu)造器注入屬性值-->
        <!-- 構(gòu)造器標識,一般為主鍵 -->
        <!-- column對應(yīng)表字段,name對應(yīng)實體屬性 -->
        <idArg column="id" name="userId" javaType="int"/>
        <!-- 構(gòu)造器參數(shù) -->
        <arg column="username" name="userName" javaType="string"/> 
    </constructor>
        <!-- id 與主鍵字段的對應(yīng),property對應(yīng)實體屬性,column對應(yīng)表字段 -->
        <id property="userId" column="id"/>
        <!-- result 與非主鍵字段的對應(yīng),property對應(yīng)實體屬性,column對應(yīng)表字段 -->
        <result property="userName" column="username"/>
    <association/><!--高級映射,一對一映射-->
    <collection /><!--高級映射,一對多映射-->
    <discriminator>
        <case/>
    </discriminator><!--根據(jù)返回的字段的值封裝不同的類型-->
</resultMap>

9 參考文檔

SQL映射文件詳解(XxxMapper.xml)

到此這篇關(guān)于MyBatis實現(xiàn)SQL映射文件的文章就介紹到這了,更多相關(guān)MyBatis SQL映射文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java利用sort方法解決字符串排序

    Java利用sort方法解決字符串排序

    在日常的編程任務(wù)中,字符串排序是一個常見的需求,本文將介紹如何使用Java中的??List??接口和??Collections??工具類來實現(xiàn)字符串排序,需要的朋友可以參考下
    2026-03-03
  • PowerMockito的基本使用解析

    PowerMockito的基本使用解析

    這篇文章主要介紹了PowerMockito的基本使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • jmeter下載及安裝配置教程(win10平臺為例)

    jmeter下載及安裝配置教程(win10平臺為例)

    Apache?JMeter是Apache組織開發(fā)的基于Java的壓力測試工具,Apache?jmeter?可以用于對靜態(tài)的和動態(tài)的資源(文件,Servlet,Perl腳本,java?對象,數(shù)據(jù)庫和查詢,F(xiàn)TP服務(wù)器等等)的性能進行測試,本文給大家介紹jmeter下載及安裝配置過程,感興趣的朋友一起看看吧
    2021-12-12
  • Spring實戰(zhàn)之FileSystemResource加載資源文件示例

    Spring實戰(zhàn)之FileSystemResource加載資源文件示例

    這篇文章主要介紹了Spring實戰(zhàn)之FileSystemResource加載資源文件,結(jié)合實例形式分析了spring FileSystemResource加載xml資源文件的具體實現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • java多媒體文件編碼 處理工具類代碼實例

    java多媒體文件編碼 處理工具類代碼實例

    這篇文章主要介紹了java多媒體文件編碼 處理工具類使用解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • Java通過工廠、Map容器創(chuàng)建對象的方法

    Java通過工廠、Map容器創(chuàng)建對象的方法

    這篇文章主要介紹了Java通過工廠、Map容器創(chuàng)建對象的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • JVM內(nèi)存結(jié)構(gòu)相關(guān)知識解析

    JVM內(nèi)存結(jié)構(gòu)相關(guān)知識解析

    這篇文章主要介紹了JVM內(nèi)存結(jié)構(gòu)相關(guān)知識解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot實現(xiàn)接口返回數(shù)據(jù)脫敏的代碼示例

    SpringBoot實現(xiàn)接口返回數(shù)據(jù)脫敏的代碼示例

    在當今的信息化時代,數(shù)據(jù)安全尤為重要,接口返回數(shù)據(jù)脫敏是一種重要的數(shù)據(jù)保護手段,可以防止敏感信息通過接口返回給客戶端,本文旨在探討如何在SpringBoot應(yīng)用程序中實現(xiàn)接口返回數(shù)據(jù)脫敏,需要的朋友可以參考下
    2024-07-07
  • SpringBoot線上環(huán)境徹底關(guān)閉Swagger-UI的方式

    SpringBoot線上環(huán)境徹底關(guān)閉Swagger-UI的方式

    這篇文章主要給大家介紹了SpringBoot線上環(huán)境徹底關(guān)閉Swagger-UI的方式,文中給出了詳細的代碼示例供大家參考,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • Mybatis深度整合Mysql的Json字段問題

    Mybatis深度整合Mysql的Json字段問題

    這篇文章主要介紹了Mybatis深度整合Mysql的Json字段問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評論

广昌县| 松阳县| 集贤县| 若尔盖县| 邢台县| 鄱阳县| 尚志市| 肥城市| 庐江县| 和顺县| 永安市| 霍山县| 乌苏市| 安远县| 恭城| 苏尼特右旗| 辉县市| 尼木县| 凤山县| 道孚县| 科技| 绥德县| 沁源县| 万盛区| 荥阳市| 朔州市| 无为县| 鱼台县| 略阳县| 旅游| 津市市| 安泽县| 呼玛县| 商丘市| 阿拉尔市| 砀山县| 宿迁市| 乐都县| 亚东县| 志丹县| 剑川县|