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

Mybatis實現(xiàn)SQL映射的兩種方法(xml文件形式和注解形式)

 更新時間:2023年07月13日 14:35:37   作者:寒山月初°C  
這篇文章主要介紹了Mybatis實現(xiàn)SQL映射的兩種方法(xml文件形式和注解形式),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Mybatis實現(xiàn)SQL映射的兩種方式

SQL映射是Mybatis中最重要,復(fù)雜的組件,它由一個接口和對應(yīng)的XML文件(或注解)組成。

它可以配置以下內(nèi)容:

  • 描述映射規(guī)則。
  • 提供 SQL 語句,并可以配置 SQL 參數(shù)類型、返回類型、緩存刷新等信息。
  • 配置緩存。
  • 提供動態(tài) SQL。

在介紹實現(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ā)只是一個接口,而不是一個實現(xiàn)類。

初學(xué)者可能會有很大的疑問,接口不是不能運(yùn)行嗎?

是的,接口確實不能直接運(yùn)行。Mybatis使用了動態(tài)代理技術(shù)使得接口能夠運(yùn)行起來,目前我們只需要知道Mybatis會為這個接口生成一個代理對象,代理對象會去處理相關(guān)的邏輯即可。

一,用XML實現(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。

二,注解實現(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ù)和修改。

這時候就會有老實人發(fā)問了,那么到底是使用注解還是XML呢?

實際上,注解方式和 XML 方式同時定義時,XML 方式將覆蓋掉注解方式,所以 MyBatis 官方推薦使用的是 XML 方式。

此外,XML 可以相互引入,而注解是不可以的,所以在一些比較復(fù)雜的場景下,使用 XML 方式會更加靈活和方便。

所以大部分的企業(yè)都是以 XML 為主,當(dāng)然,在一些簡單的表和應(yīng)用中使用注解方式也會比較簡單。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實現(xiàn)推箱子游戲

    Java實現(xiàn)推箱子游戲

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)推箱子游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • java堆棧類使用實例(java中stack的使用方法)

    java堆棧類使用實例(java中stack的使用方法)

    java中stack的使用方法,堆棧是一種"后進(jìn)先出"(LIFO) 的數(shù)據(jù)結(jié)構(gòu), 只能在一端進(jìn)行插入(稱為"壓棧") 或刪除 (稱為"出棧")數(shù)據(jù)的操作,下面看示例吧
    2013-12-12
  • Java優(yōu)先隊列(PriorityQueue)重寫compare操作

    Java優(yōu)先隊列(PriorityQueue)重寫compare操作

    這篇文章主要介紹了Java優(yōu)先隊列(PriorityQueue)重寫compare操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 四種Springboot常見全局時間格式化方式

    四種Springboot常見全局時間格式化方式

    這篇文章主要為大家詳細(xì)介紹了Springboot實現(xiàn)全局時間格式化的四種常見方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • Java向上轉(zhuǎn)型和向下轉(zhuǎn)型實例解析

    Java向上轉(zhuǎn)型和向下轉(zhuǎn)型實例解析

    這篇文章主要介紹了Java向上轉(zhuǎn)型和向下轉(zhuǎn)型實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Java實現(xiàn)AOP面向切面編程的實例教程

    Java實現(xiàn)AOP面向切面編程的實例教程

    這篇文章主要介紹了Java實現(xiàn)AOP面向切面編程的實例教程,通常Java中的AOP都是利用Spring框架中造好的輪子來開發(fā),而本文則關(guān)注于Java本身AOP的設(shè)計模式實現(xiàn),需要的朋友可以參考下
    2016-04-04
  • Spring MVC 學(xué)習(xí) 之 - URL參數(shù)傳遞詳解

    Spring MVC 學(xué)習(xí) 之 - URL參數(shù)傳遞詳解

    本篇文章主要介紹了SpringMVC-URL參數(shù)傳遞,在學(xué)習(xí) Spring Mvc 過程中,有必要來先了解幾個關(guān)鍵參數(shù),有興趣的可以了解一下。
    2017-01-01
  • Spring?boot2.0?實現(xiàn)日志集成的方法(3)

    Spring?boot2.0?實現(xiàn)日志集成的方法(3)

    這篇文章主要介紹了Spring?boot2.0?實現(xiàn)日志集成的方法,基于上一篇將日志信息根據(jù)類別輸出到不同的文件中,這篇文章將通過日志來監(jiān)控用戶的操作行為、請求的耗時情況,針對耗時久的請求進(jìn)行性能分析,提升系統(tǒng)性能,需要的小伙伴可以參考一下
    2022-04-04
  • maven模塊化開發(fā)部署實現(xiàn)方案

    maven模塊化開發(fā)部署實現(xiàn)方案

    有些用戶有定制化需求,需要添加新的模塊功能,因此需要平臺主體功能迭代的同時,非主體功能和定制化功能插件化,本文給大家介紹maven模塊化開發(fā)部署實現(xiàn)方案,感興趣的朋友一起看看吧
    2024-01-01
  • Spring Boot項目集成UidGenerato的方法步驟

    Spring Boot項目集成UidGenerato的方法步驟

    這篇文章主要介紹了Spring Boot項目集成UidGenerato的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評論

宁陵县| 丹棱县| 怀安县| 信宜市| 资兴市| 嘉定区| 镇坪县| 丰城市| 云龙县| 芜湖县| 九龙城区| 宝坻区| 民县| 漳平市| 河东区| 原阳县| 临澧县| 资中县| 岗巴县| 汪清县| 鹿邑县| 肥东县| 新野县| 京山县| 乐清市| 乌拉特前旗| 汉川市| 福清市| 怀仁县| 特克斯县| 克东县| 英超| 开封县| 桐城市| 岐山县| 明光市| 前郭尔| 望谟县| 平江县| 横山县| 城口县|