MyBatis学习笔记第二天

动态SQL语句标签

在 MyBatis 中,动态 SQL 是一种强大的特性,允许根据不同的条件动态地生成 SQL 语句。这在实际开发中非常有用,可以根据不同的查询条件或业务逻辑生成不同的 SQL 片段,从而减少重复的 SQL 代码并提升代码的可维护性和灵活性。

if标签

如果传入的参数 username 不为 null,则会动态添加 AND username = #{username} 到 SQL 语句中。

<!--<if> 元素
<if> 元素用于根据条件包含或排除 SQL 片段-->

<select id="getUserById" parameterType="int" resultType="User">
    SELECT * FROM users
    WHERE user_id = #{userId}
    <if test="username != null">
        AND username = #{username}
    </if>
</select>

where标签

<!--resultType查询出的结果中的每一行都要映射成该类型的对象-->
    <select id="getStaff" resultType="org.example.bean.Staff">
        select * from staff
        <!--根据参数不同组合出不同的SQL语句  动态SQL语句  标签-->
        <where>
            <!--编写条件语句 如果where标签中有内容 会自动添加where关键字-->
            <if test="checktext !=null and checktext !=''">
                <!--重新定义参数内容-->
                <bind name="liketext" value="'%'+checktext+'%'"></bind>
                name like #{liketext}
            </if>
        </where>
    </select>

choose,when,otherwise标签

这里根据传入的参数 Map 中的条件动态选择不同的 SQL 分支。

<!-- <choose>、<when> 和 <otherwise> 元素
<choose> 元素类似于 Java 中的 switch 语句,用于根据条件选择一个分支
<when> 元素用于定义每个分支,<otherwise> 用于定义默认的分支-->

<select id="getStaffBySalary" resultType="org.example.bean.Staff">
        select * from staff
        <where>
            <!--参数名 salarytext -->
            <choose>
            <!-- 比较字符,单引号在外,双引号在内,双等号判断-->
                <when test='salarytext=="低"'>
                    salary &lt;=5000
                </when>
                <when test='salarytext=="中"'>
                    salary>5000 and salary &lt;=8000
                </when>
                <otherwise>
                    salary>8000
                </otherwise>
            </choose>
        </where>
    </select>

foreach标签

这里 userIds 是一个 List 参数,foreach 元素会根据 List 中的元素生成类似 IN (val1, val2, …) 的 SQL 子句。

<!--<foreach> 元素
<foreach> 元素用于处理集合参数,并迭代生成 SQL 片段-->

<select id="getUsersByIdList" parameterType="List" resultType="User">
    SELECT * FROM users
    WHERE user_id IN
    <foreach item="userId" collection="userIds" open="(" separator="," close=")">
        #{userId}
    </foreach>
</select>

set标签

在 Mybatis 中,update 语句可以使用 set 标签动态更新列。set 标签可以为 SQL 语句动态的添加 set 关键字,剔除追加到条件末尾多余的逗号。
MyBatis 还支持更复杂的动态 SQL 组合和条件判断,例如使用 set 元素动态生成更新语句的 SET 部分,或者使用 trim 元素处理动态的 SQL 片段的前缀和后缀空白等。

<update id="updateUser" parameterType="User">
    UPDATE users
    <set>
        <if test="username != null">
            username = #{username},
        </if>
        <if test="email != null">
            email = #{email},
        </if>
    </set>
    WHERE id = #{id}
</update>

MyBatis中的一对一和一对多查询

在 MyBatis(或类似的持久层框架)中,resultMap 和 resultType 都是用来映射查询结果到 Java 对象的重要配置项。

resultType

resultType 是用于指定查询返回结果的类型,通常用在 select 标签中。它指定了单个简单类型(如基本数据类型或字符串)或一个 Java 对象的全限定类名。当查询结果只有一列或者只需要映射到一个简单类型时,可以使用 resultType。

在这个例子中,查询返回的结果是一个整数,因此使用 resultType=“int” 来指定结果类型为整数。

<select id="getUserCount" resultType="int">
    SELECT COUNT(*) FROM users
</select>

resultMap

resultMap则是更为灵活和复杂的映射配置方式,用于处理查询结果到复杂的 Java 对象的映射。它允许你定义如何将查询结果的列映射到 Java 对象的属性。resultMap中可以定义多个 result 标签,每个 result标签用于指定如何映射一个列到一个对象的属性。

在这个示例中,定义了一个 userResultMap,它将查询结果的 user_id 列映射到 User 对象的 id 属性,username 列映射到 username 属性,email 列映射到 email 属性。

<resultMap id="userResultMap" type="User">
    <id property="id" column="user_id"/>
    <result property="username" column="username"/>
    <result property="email" column="email"/>
</resultMap>

然后,在 select或其他映射查询语句中可以引用这个 resultMap,例如:

<select id="getUserById" resultMap="userResultMap">
    SELECT user_id, username, email FROM users WHERE user_id = #{userId}
</select>

这样就会根据 userResultMap 的配置将查询结果映射到 User 对象中。
区别:
MyBatis 的每一个查询映射的返回类型都是 resultMap,只是当我们提供的返回类型是 resultType 时,MyBatis 会自动把对应的值赋给 resultType 所指定对象的属性,而当我们提供的返回类型是 resultMap 时,MyBatis 会将数据库中的列数据复制到对象的相应属性上,可用于复制查询。

一对一查询

通过 resultMap元素的子元素 association 处理一对一级联关系
association 元素中通常使用以下属性。
property:指定映射到实体类的对象属性。
column:指定表中对应的字段(即查询返回的列名)。
javaType:指定映射到实体对象属性的类型。
select:指定引入嵌套查询的子 SQL 语句,该属性用于关联映射中的嵌套查询。

<!-- 一对一或一对多查询需要制定映射方式  resultMap-->
    <resultMap id="staffAndDep" type="org.example.bean.Staff">
        <association column="dep_id" select="getStaffDep" property="dep"></association>
    </resultMap>

    <select id="getStaffDep" resultType="org.example.bean.Department">
        select * from department where id=#{dep_id}
    </select>

    <select id="getStaffAndDep" resultMap="staffAndDep" >
        select * from staff
    </select>

一对多查询

通过 resultMap 元素的子元素 collection 处理一对多级联关系,collection 可以将关联查询的多条记录映射到一个 list 集合属性中。
collection 元素中通常使用以下属性。
property:指定映射到实体类的对象属性。
column:指定表中对应的字段(即查询返回的列名)。
javaType:指定映射到实体对象属性的类型。
select:指定引入嵌套查询的子 SQL 语句,该属性用于关联映射中的嵌套查询。

<resultMap id="departmentAndStaff" type="org.example.bean.Department">
        <!--<id column="id" property="depid"></id>-->
        <!--<result column="name" property="depname"></result>-->
        <result column="id" property="id"></result>
        <collection  column="id" select="getDepStaff" property="staffList"></collection>
    </resultMap>

    <select id="getDepStaff" resultType="org.example.bean.Staff">
        select * from staff where dep_id=#{id}
    </select>

    <select id="getDep" resultMap="departmentAndStaff">
        select * from department
    </select>

MyBatis缓存

MyBatis 提供了一级缓存和二级缓存的支持。默认情况下,MyBatis 只开启一级缓存

一级缓存

一级缓存是基于 PerpetualCache(MyBatis自带)的 HashMap 本地缓存,作用范围为 SQLession 域内。当 session flush(刷新)或者 close(关闭)之后,该 session 中所有的 cache(缓存)就会被清空。
在参数和 SQL 完全一样的情况下,我们使用同一个 SqlSession 对象调用同一个 mapper 的方法,往往只执行一次 SQL。因为使用 SqlSession 第一次查询后,MyBatis 会将其放在缓存中,再次查询时,如果没有刷新,并且缓存没有超时的情况下,SqlSession 会取出当前缓存的数据,而不会再次发送 SQL 到数据库。
由于 SqlSession 是相互隔离的,所以如果你使用不同的 SqlSession 对象,即使调用相同的 Mapper、参数和方法,MyBatis 还是会再次发送 SQL 到数据库执行,返回结果。

二级缓存

二级缓存是全局缓存,作用域超出 SQLsession 范围之外,可以被所有 SqlSession 共享。手动开启

    <!-- 二级缓存-->
    <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值