前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mybatis常用操作

Mybatis常用操作

原创
作者头像
啵啵肠
发布2023-11-20 14:38:07
1250
发布2023-11-20 14:38:07
举报

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【定义sql语句】属性介绍:
    • 继承map:
    • 动态sql拼接
      • if 标签
        • foreach 标签
          • choose标签
          • 格式化输出
            • where标签
              • set 标签
                • trim标签
                • 配置关联关系
                  • association标签
                    • collection
                      • 关联查询时多表字段冲突解决
                      • 定义常量及引用
                        • sql标签
                          • include标签
                          • 其他操作
                            • 如何传递集合
                            • 调用静态方法
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档