成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

速覽 MyBatis:關(guān)鍵功能與實(shí)踐技巧

開發(fā) 開發(fā)工具
MyBatis支持多種關(guān)系型數(shù)據(jù)庫(kù),如?MySQL、Oracle、SQL Server等。開發(fā)人員可以使用相同的API來操作不同的數(shù)據(jù)庫(kù),只需要更換相應(yīng)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)和配置即可,具有很高的數(shù)據(jù)庫(kù)兼容性和可移植性。

前言

MyBatis是一款功能強(qiáng)大的ORM框架,幫助開發(fā)者在Java程序中高效地與數(shù)據(jù)庫(kù)進(jìn)行交互。

功能特點(diǎn)

  • SQL映射靈活:MyBatis允許開發(fā)人員通過XML或注解的方式來配置SQL語(yǔ)句,將SQL語(yǔ)句與Java代碼分離,使得SQL的維護(hù)更加方便。同時(shí),它提供了強(qiáng)大的動(dòng)態(tài)SQL功能,能夠根據(jù)不同的條件動(dòng)態(tài)生成SQL語(yǔ)句,滿足各種復(fù)雜的查詢需求。
  • 支持多種數(shù)據(jù)庫(kù):MyBatis支持多種關(guān)系型數(shù)據(jù)庫(kù),如 MySQL、Oracle、SQL Server等。開發(fā)人員可以使用相同的API來操作不同的數(shù)據(jù)庫(kù),只需要更換相應(yīng)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)和配置即可,具有很高的數(shù)據(jù)庫(kù)兼容性和可移植性。
  • 對(duì)象關(guān)系映射(ORM):MyBatis實(shí)現(xiàn)了對(duì)象關(guān)系映射,能夠?qū)?shù)據(jù)庫(kù)中的表記錄映射為Java對(duì)象,方便在Java程序中進(jìn)行操作。它提供了靈活的映射配置方式,可以自定義對(duì)象與表之間的映射關(guān)系,包括字段的映射、關(guān)聯(lián)關(guān)系的處理等。
  • 性能優(yōu)化:MyBatis具有良好的性能表現(xiàn),它對(duì)SQL執(zhí)行進(jìn)行了優(yōu)化,例如緩存機(jī)制。MyBatis提供了一級(jí)緩存和二級(jí)緩存,一級(jí)緩存基于SqlSession級(jí)別,二級(jí)緩存可以在多個(gè)SqlSession之間共享,能夠有效減少數(shù)據(jù)庫(kù)的查詢次數(shù),提高系統(tǒng)性能。

使用方式

基本使用

動(dòng)態(tài)SQL允許根據(jù)傳入的參數(shù)生成不同的SQL語(yǔ)句,避免了復(fù)雜條件下的SQL拼接問題。

<select id="selectUsersByCondition" resultType="User"> 
    SELECT * FROM users WHERE 1=1 
    <if test="username != null">AND username = #{username}</if>
    <if test="age != null">AND age = #{age}</if>
</select>

使用 foreach 實(shí)現(xiàn)批量操作

<foreach>循環(huán)容器:用于在SQL中循環(huán)處理集合或數(shù)組數(shù)據(jù),常用于IN條件。主要屬性包括:

  • item:集合元素迭代別名。
  • index:元素迭代索引。
  • collection:指定集合或數(shù)組,單參數(shù)List時(shí)為list,單參數(shù)數(shù)組時(shí)為array,多參數(shù)或單參數(shù)封裝為Map時(shí),是對(duì)應(yīng)List或數(shù)組在Map中的鍵。
  • open、separator、close:定義循環(huán)內(nèi)容的起始、分隔和結(jié)束符號(hào)。
<select id="selectUsersByIds" resultType="User">
    select * FROM users
    where id in
    <foreach collection="ids" item="userid" index="index" open="(" separator="," close=")">
        #{userid}
    </foreach>
</select>

<insert id="insertUsersBatch" parameterType="java.util.List">
    INSERT INTO users (username, age, email)
    VALUES
    <foreach collection="userList" item="user" index="index" open="(" separator="),(" close=")">
        #{user.username}, #{user.age}, #{user.email}
    </foreach>
</insert>

?

實(shí)際使用中,避免集合超過1000,否則會(huì)提示java.sql.SQLSyntaxErrorException: ORA-01795: maximum number of expressions in a list is 1000

<select id="selectUsersByIds" resultType="User">
    select * FROM users
    where id in (
       <foreach collection="ids" item="userid" index="index">
        <!-- 解決 list中數(shù)據(jù)大于1K條的問題  -->
        <iftest="index != 0">
            <choose>
                <when test="index % 1000 == 999">
                    ) or id in (
                </when>
                <otherwise>,</otherwise>
            </choose>
        </if>
        #{userid}
    </foreach>
    )
</select>

choose、when、otherwise條件判斷

類似Javaswitch語(yǔ)句,按順序判斷<when>標(biāo)簽的test條件,滿足則執(zhí)行對(duì)應(yīng)SQL,都不滿足則執(zhí)行<otherwise>中的SQL

<select id="getUserList_choose" resultType="User" parameterType="User">
    SELECT *
    FROM users u
    <where>
        <choose>
            <when test="username!=null and username!= ''">
                u.username LIKE CONCAT(CONCAT('%', #{username, jdbcType=VARCHAR}),'%')
            </when>
            <when test="age!= null">
                AND u.age = #{age, jdbcType=INTEGER}
            </when>
            <when test="email!= null and email!= ''">
                AND u.email = #{email, jdbcType=VARCHAR}
            </when>
            <otherwise>
            </otherwise>
        </choose>
    </where>
</select>

concat模糊查詢

通過concat函數(shù)實(shí)現(xiàn)模糊查詢,并結(jié)合<if>標(biāo)簽動(dòng)態(tài)拼接SQL條件

<select id="queryById" resultType="User" parameterType="User">
    SELECT * from users
    <where>
        <if test="username!=null">
            username like concat('%',concat(#{username},'%'))
        </if>
    </where>
</select>

if標(biāo)簽

根據(jù)條件動(dòng)態(tài)拼接SQL語(yǔ)句,常用于查詢

<select id="selectUsersByCondition" resultType="User" parameterType="User">
    SELECT * FROM users
    WHERE 1=1
    <iftest="username != null and username != ''">
        AND username = #{username}
    </if>
    <iftest="age != null">
        AND age = #{age}
    </if>
    <iftest="email != null and email != ''">
        AND email = #{email}
    </if>
</select>

但多個(gè)<if>WHERE中可能導(dǎo)致關(guān)鍵字多余錯(cuò)誤。

if + where條件判斷

<where>標(biāo)簽可解決多個(gè)<if>WHERE中導(dǎo)致的關(guān)鍵字多余問題,自動(dòng)添加或剔除WHERE及多余的AND、OR,避免手動(dòng)添加 WHERE 1=1

<select id="selectUsersByCondition" resultType="User" parameterType="User">
    SELECT * FROM users
    <where>
        <iftest="username != null and username != ''">
            username = #{username}
        </if>
        <iftest="age != null">
            AND age = #{age}
        </if>
        <iftest="email != null and email != ''">
            AND email = #{email}
        </if>
    </where>
</select>

if + set條件更新

UPDATE語(yǔ)句中,<set>標(biāo)簽可動(dòng)態(tài)配置SET關(guān)鍵字,剔除末尾多余逗號(hào),避免因參數(shù)null導(dǎo)致的錯(cuò)誤。

<update id="updateUserById">
    UPDATE users
    <set>
        <iftest="username != null and username != ''">
            username = #{username},
        </if>
        <iftest="age != null">
            age = #{age},
        </if>
        <iftest="email != null and email != ''">
            email = #{email},
        </if>
        <iftest="updateTime != null">
            update_time = #{updateTime},
        </if>
        <!-- 可根據(jù)需要添加更多字段 -->
    </set>
    WHERE userid = #{userid}
</update>

CASE WHEN

<select id="selectUserList" resultType="User">
    SELECT
        userid,
        username,
        age,
        status,
        CASE status
            WHEN 'ACTIVE' THEN '活躍'
            WHEN 'INACTIVE' THEN '非活躍'
            WHEN 'BLOCKED' THEN '已封禁'
            ELSE '未知狀態(tài)'
        END AS status_text
    FROM users
</select>

使用 resultMap 映射復(fù)雜結(jié)果

當(dāng)查詢返回的列與實(shí)體類的字段名稱不一致時(shí),resultMap可以幫忙進(jìn)行映射。

<resultMap id="userResultMap" type="User">
    <id property="id" column="userid" />
    <result property="username" column="username" />
    <result property="age" column="age" />
</resultMap>


<select id="selectUsersByCondition" resultMap="userResultMap"> 
    SELECT * FROM users WHERE 1=1 
    <if test="username != null">AND username = #{username}</if>
    <if test="age != null">AND age = #{age}</if>
</select>

處理一對(duì)多關(guān)系

<resultMap id="userWithOrders" type="User">
    <id property="id" column="userid" />
    <result property="username" column="username" />
    <collection property="orders" ofType="Order">
        <id property="id" column="order_id" />
        <result property="amount" column="order_amount" />
    </collection>
</resultMap>

<select id="selectUserWithOrders" resultMap="userWithOrders"> 
    SELECT u.userid, u.username, o.order_id, o.order_amount FROM users 
    u LEFT JOIN orders o ON u.userid = o.user_id
</select>

使用 bind 處理復(fù)雜表達(dá)式

<bind name="pattern" value="'%' + keyword + '%'" />
<select id="selectUsersByKeyword" resultType="User"> 
    SELECT * FROM users WHERE username LIKE #{pattern}
</select>

復(fù)用 SQL 片段

<sql id="baseUserSql"> SELECT userid, username, age, email FROM users</sql>
<select id="selectUsers" resultType="User"> 
    <include refid="baseUserSql"/> 
</select>


責(zé)任編輯:武曉燕 來源: 一安未來
相關(guān)推薦

2018-04-09 14:26:06

Go語(yǔ)法實(shí)踐

2013-11-22 16:45:28

SASJMP11

2013-07-23 15:10:34

PowerShell

2025-02-10 07:40:00

Java集合工具類編程

2024-10-15 10:38:32

2017-09-27 11:00:50

LinuxBash使用技巧

2017-11-23 15:24:35

Python速覽實(shí)戰(zhàn)

2021-05-11 05:39:07

Edge微軟瀏覽器

2023-11-18 19:28:20

Android 14

2023-07-04 12:11:25

2011-03-25 11:39:13

Nagios 功能Nagios 結(jié)構(gòu)

2021-12-23 14:57:25

Nginx服務(wù)器虛擬主機(jī)

2020-06-02 10:00:33

GitHub 技術(shù)開發(fā)

2023-08-07 08:20:27

圖解算法工具

2010-07-30 09:22:54

DB2實(shí)現(xiàn)

2021-06-28 06:26:53

微軟Windows 11Windows

2017-03-24 10:23:37

Python語(yǔ)法機(jī)器學(xué)習(xí)環(huán)境搭建

2021-05-25 09:21:15

芯片 5G芯片服務(wù)器芯片

2021-04-29 05:29:49

芯片 5G芯片服務(wù)器芯片

2021-06-26 06:16:30

Windows 11操作系統(tǒng)微軟
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 97人人超碰 | 91精品国产综合久久久动漫日韩 | 99亚洲精品| 久久国产成人午夜av影院武则天 | 精品不卡 | 成人小视频在线免费观看 | 成人在线一区二区 | 成人欧美一区二区三区1314 | 日韩精品免费看 | 欧美狠狠操 | 欧美视频一级 | 青青草综合 | 四虎影视一区二区 | 免费亚洲网站 | 精品日韩一区二区 | 成人性生交大片免费看r链接 | av一区二区三区在线观看 | 国产乱码精品一区二区三区中文 | 先锋av资源网 | 99久久久久| 国产精品日韩欧美一区二区三区 | 欧美电影一区 | 在线观看午夜视频 | 最近日韩中文字幕 | 91热爆在线观看 | av在线一区二区三区 | 艹逼网 | 日韩国产免费观看 | 日韩美香港a一级毛片免费 国产综合av | 狠狠做深爱婷婷综合一区 | 国产一区二区三区四区五区加勒比 | 欧美激情一区 | 91久久国产精品 | 国产精品99免费视频 | 国产一区二区三区四区hd | 黄色免费在线观看网站 | 欧美福利一区 | 99久久婷婷国产综合精品电影 | 91激情视频 | 精品国产乱码久久久久久丨区2区 | 天堂色|