Mybatis常用操作

2023-11-20 14:38:07 浏览数 (1)

【定义sql语句】属性介绍:

代码语言:sql复制
        id :唯一的标识符.
        parameterType:传给此语句的参数的全路径名或别名 例:com.test.poso.User或user
        resultType :语句返回值类型或别名。注意,如果是集合,那么这里填写的是集合的泛型,而不是集合本身(resultType 与resultMap 不能并用)
        resultMap:
        建立SQL查询结果字段与实体属性的映射关系信息
        查询的结果集转换为java对象,方便进一步操作。
        将结果集中的列与java对象中的属性对应起来并将值填充进去
        parameterMap:
代码语言:text复制
<resultMap id="BaseResultMap" type="com.online.charge.platform.student.model.Student">
<id property="id" column="id" />
<result column="NAME" property="name" />
<result column="HOBBY" property="hobby" />
<result column="MAJOR" property="major" />
<result column="BIRTHDAY" property="birthday" />
<result column="AGE" property="age" />
</resultMap>
继承map:
代码语言:text复制
<resultMap type="com.bean.Topology" id="resultMapTopology">
    <id column="topology_pk" property="topology_pk" javaType="java.lang.Long"/>
    <result column="topology_id" property="topology_id" javaType="java.lang.String"/>
</resultMap>
<resultMap type="com.bean.Topology" id="resultMapTopologyOnConnection" extends="resultMapTopology">
<collection 
        property="topology_hostlist"
                column="topology_pk"
                select="com.mapper.HostMapper.getHostListByTopology_Pk" />
</resultMap>

动态sql拼接

if 标签

if标签通常用于WHERE语句、UPDATE语句、INSERT语句中,通过判断参数值来决定是否使用某个查询条件、判断是否更新某一个字段、判断是否插入某个字段的值。

代码语言:shell复制
<if test="name != null and name != ''">
        and NAME = #{name}
</if>

test还可以使用静态方法:@com.newlife.s4.util.StringTools@isNullOrEmpty(rulesID) 如果需要在标签里使用><等特殊符号需要通过转义:<![CDATA[<=]]>代表<=

foreach 标签

foreach标签主要用于构建in条件,可在sql中对集合进行迭代。也常用到批量删除、添加等操作中。

代码语言:perl复制
collection:collection属性的值有三个分别是list、array、map三种,分别对应的参数类型为:List、数组、map集合。
        item :表示在迭代过程中每一个元素的别名
        index :表示在迭代过程中每次迭代到的位置(下标)
        open :前缀
        close :后缀
        separator :分隔符,表示迭代时每个元素之间以什么分隔
代码语言:perl复制
 <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
        #{item}
        </foreach>
choose标签

  有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。MyBatis提供了choose 元素,按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行 otherwise中的sql。类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。

代码语言:shell复制
<choose>
<when test="Name!=null and student!='' ">
        AND name LIKE CONCAT(CONCAT('%', #{student}),'%')
</when>
<when test="hobby!= null and hobby!= '' ">
        AND hobby = #{hobby}
</when>
<otherwise>
                    AND AGE = 15
</otherwise>
</choose>

格式化输出

where标签

用于去除多余或者添加and或者or,先去除后添加

代码语言:shell复制
<where>
<if test="name!=null and name!='' ">
        NAME LIKE CONCAT(CONCAT('%', #{name}),'%')
</if>
<if test="hobby!= null and hobby!= '' ">
        AND hobby = #{hobby}
</if>
</where>
set 标签

用户剔除或者添加多余的“,”

代码语言:shell复制
<set>
<if test="name!=null and name!='' ">
        NAME = #{name},
</if>
<if test="hobby!=null and hobby!='' ">
        MAJOR = #{major},
</if>
<if test="hobby!=null and hobby!='' ">
        HOBBY = #{hobby}
</if>
</set>
trim标签

trim标记是一个格式化的标记,主要用于拼接sql的条件语句(前缀或后缀的添加或忽略),可以完成set或者是where标记的功能。 trim属性主要有以下四个

代码语言:markdown复制
prefix:前缀覆盖并增加其内容
        suffix:后缀覆盖并增加其内容
        prefixOverrides:前缀判断的条件
        suffixOverrides:后缀判断的条件
代码语言:text复制
<trim  suffixOverrides="," >
<if test="name != null  ">
        NAME=#{name},
</if>
<if test="hobby != null  ">
        HOBBY=#{hobby},
</if>
</trim>
<trim prefix="WHERE" prefixOverrides="AND | OR">
<if test="name != null and name.length()>0"> AND name=#{name}
</if>
<if test="hobby != null and hobby.length()>0"> AND hobby=#{hobby}
</if>
</trim>

配置关联关系

association标签

一对一

代码语言:html复制
<resultMap type="com.jy.entity.Orders" id="ordersAndUser">
<id property="id" column="id"/>
<result property="user_id" column="user_id"/>
<!-- 这是映射 -->
<association property="user" javaType="com.jy.entity.User">
<id property="id" column="id" />
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="realname" column="realname"/>
</association>
</resultMap>
collection

一对多

代码语言:text复制
<resultMap type="com.jy.entity.User" id="UserAndOrders">
<id property="id" column="uid"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="realname" column="realname"/>
<collection property="orders" ofType="com.jy.entity.Orders">
<id property="id" column="id"/>
<result property="user_id" column="user_id"/>
</collection>
</resultMap>
关联查询时多表字段冲突解决
代码语言:text复制
<result column="id" property="id" jdbcType="DECIMAL" />
<association property="demos" javaType="com.hand.core.demos.dto.Demos">
<result column="did" property="id" jdbcType="DECIMAL" />
</association>
<sql id="WithDemos_Column_List">
        k.id,d.id did
</sql>

定义常量及引用

sql标签

当多种类型的查询语句的查询字段或者查询条件相同时,可以将其定义为常量,方便调用。

代码语言:shell复制
<sql id="Base_Column_List">
        ID,MAJOR,BIRTHDAY,AGE,NAME,HOBBY
</sql>
include标签

用于引用定义的常量

代码语言:text复制
<include refid="Base_Column_List" />

其他操作

如何传递集合

传递List

代码语言:c#复制
<select id="selectCustomerCountList" parameterType="java.util.List" resultType="java.lang.Long">
        select count(1) from np_customer_info where id in
<foreach item="item" collection="list" separator="," open="(" close=")" index="">  #{item, jdbcType=INTEGER}
        </foreach>
        </select>

或者

代码语言:c#复制
DAO层:
        Long selectCustomerCountList(@Param("customerIdList") List customerIdList);
        XML文件:
<select id="selectCustomerCountList" parameterType="java.util.List" resultType="java.lang.Long">
        select count(1) from np_customer_info where id in
<foreach item="item" collection="customerIdList" separator="," open="(" close=")" index="">  #{item, jdbcType=INTEGER}
        </foreach>
        </select>

传递map

代码语言:c#复制
    List customerIdList = new LinkedList();
 maps.put("customerIds", customerIdList);
<select id="selectCustomerCountMap" parameterType="java.util.Map" resultType="java.lang.Long">
        select count(1) from np_customer_info where id in
<foreach item="item" collection="customerIds" separator="," open="(" close=")" index="">  #{item, jdbcType=INTEGER}
        </foreach>
        </select>

传递数组

代码语言:perl复制
<delete id="deleteBrandByIdsArray" parameterType="Integer[]">
        delete from bbs_brand
<where>
        id
<foreach  collection="array" item="id" open="in (" close=")" separator=",">
        #{id}
        </foreach>
        </where>
        </delete>

或者

代码语言:text复制
    public void batchDelete(@Param(value = "userIds") Integer[] userIds);
<foreach collection="userIds" item="item" index="index" open="("
        separator="," close=")">
        #{item}
        </foreach>

调用静态方法

代码语言:shell复制
<if test="@com.jylcloud.jyl.common.core.util.MybatisValidationUtils@isNotBlank(communityName)">
</if>

其中com.jylcloud.jyl.common.core.util是包名,MybatisValidationUtils是类名,isNotBlank是方法名

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞