【定义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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!