mybatis常用标签

在这里插入图片描述

一.定义sql语句

1.select 标签

属性介绍:
(1)id :唯一的标识符.
(2)parameterType:传给此语句的参数的全路径名或别名 例:com.test.poso.User或user
(3)resultType :语句返回值类型或别名。注意,如果是集合,那么这里填写的是集合的泛型,而不是集合本身(resultType 与resultMap 不能并用)

<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="Object">select * from student where id=#{id}
</select>
2.insert标签

属性介绍:
(1)id :唯一的标识符
(2)parameterType:传给此语句的参数的全路径名或别名 例:com.test.poso.User

<insert id="insertAgent" parameterType="Object">INSERT  INTO t_node_agent (host_name, os_type, created_date)VALUES (#{hostName}, #{osType}, #{createdDate})
</insert>
3.delete标签

属性同 insert

<delete id="deleteByPrimaryKey" parameterType="Object">delete from student where id=#{id}
</delete>
4.update标签

属性同 insert

<update id="updateOne"  parameterType="com.inspur.search.data.EntityRelation">update ENTITY_RELATION SET SRC_ID=#{srcId},SRC_TYPE=#{srcType},DEST_ID=#{destId},DEST_TYPE=#{destType},REL_TYPE=#{relType},STATUS=#{status},SN_ID=#{snId}where id=#{id}
</update>

二.配置对象属性与查询结果集

1.resultMap 标签的使用

基本作用:建立SQL查询结果字段与实体属性的映射关系信息

查询的结果集转换为java对象,方便进一步操作

将结果集中的列与java对象中的属性对应起来并将值填充进去
注意:与java对象对应的列不是数据库中表的列名,而是查询后结果集的列名

<resultMap id="getStudentRM" type="EStudnet"><id property="id" column="ID"/><result property="studentName" column="Name"/><result property="studentAge" column="Age"/>
</resultMap>
<select id="getStudent" resultMap="getStudentRM">SELECT ID, Name, AgeFROM TStudent
</select>

标签说明:

主标签
(1)id:该resultMap的标志
(2)type:返回值的类名,此例中返回EStudnet类

子标签:
(1)id:用于设置主键字段与领域模型属性的映射关系,此处主键为ID,对应id。
(2)result:用于设置普通字段与领域模型属性的映射关系

三.动态拼接SQL

1.if 标签的使用

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

<select id="getStudentListLikeName" parameterType="StudentEntity" resultMap="studentResultMap">     SELECT * from STUDENT_TBL ST       
WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')      
</select> 

但是此时如果studentName是null或空字符串,此语句很可能报错或查询结果为空。此时我们使用if动态sql语句先进行判断,如果值为null或等于空字符串,我们就不进行此条件的判断。

修改为:

<select id=" getStudentListLikeName " parameterType="StudentEntity" resultMap="studentResultMap">     SELECT * from STUDENT_TBL ST      <if test="studentName!=null and studentName!='' ">     WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')      </if>     
</select>  
2.foreach 标签的使用

foreach标签主要用于构建in条件,他可以在sql中对集合进行迭代。如下:

<delete id="deleteBatch"> delete from user where id in<foreach collection="array" item="id" index="index" open="(" close=")" separator=",">#{id}</foreach>
</delete>

我们假如说参数为---- int[] ids = {1,2,3,4,5} ----那么打印之后的SQL如下:
delete form user where id in (1,2,3,4,5)

属性介绍:

foreach标签主要有以下参数:

collection:collection 属性的值有三个分别是 list、array、map 三种,分别对应的参数类型为:List、数组、map 集合。

item :循环体中的具体对象,表示在迭代过程中每一个元素的别名,支持属性的点路径访问,如item.age,item.info.details,在list和数组中是其中的对象,在map中是value。

index :表示在迭代过程中每次迭代到的位置(下标),在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。

open :前缀,表示该语句以什么开始

close :后缀,表示该语句以什么结束

separator :分隔符,表示迭代时每个元素之间以什么分隔,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。   
我们通常可以将之用到批量删除、添加等操作中。

3.choose 标签的使用

有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。MyBatis提供了choose 元素,按顺序判断when中的条件是否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行 otherwise中的sql。类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。
if是与(and)的关系,而choose是或(or)的关系。
  例如下面例子,同样把所有可以限制的条件都写上,方面使用。选择条件顺序,when标签的从上到下的书写顺序:

<select id="getStudentListChooseEntity" parameterType="StudentEntity" resultMap="studentResultMap">     SELECT * from STUDENT_TBL ST      <where>     <choose>     <when test="studentName!=null and studentName!='' ">     ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')      </when>     <when test="studentSex!= null and studentSex!= '' ">     AND ST.STUDENT_SEX = #{studentSex}      </when>     <when test="studentBirthday!=null">     AND ST.STUDENT_BIRTHDAY = #{studentBirthday}      </when>     <when test="classEntity!=null and classEntity.classID !=null and classEntity.classID!='' ">     AND ST.CLASS_ID = #{classEntity.classID}      </when>     <otherwise>     </otherwise>     </choose>     </where>     
</select>  

四.格式化输出

1.where

当if标签较多时,这样的组合可能会导致错误。例如,like姓名,等于指定性别等:

<!-- 查询学生list,like姓名,=性别 -->     
<select id="getStudentListWhere" parameterType="StudentEntity" resultMap="studentResultMap">     SELECT * from STUDENT_TBL ST      WHERE      <if test="studentName!=null and studentName!='' ">     ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')      </if>     <if test="studentSex!= null and studentSex!= '' ">     AND ST.STUDENT_SEX = #{studentSex}      </if>     
</select>  

如果上面例子,参数studentName为null或’’,则或导致此sql组合成“WHERE AND”之类的关键字多余的错误SQL。
这时我们可以使用where动态语句来解决。这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。

<!-- 查询学生list,like姓名,=性别 -->     
<select id="getStudentListWhere" parameterType="StudentEntity" resultMap="studentResultMap">     SELECT * from STUDENT_TBL ST      <where>     <if test="studentName!=null and studentName!='' ">     ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')      </if>     <if test="studentSex!= null and studentSex!= '' ">     AND ST.STUDENT_SEX = #{studentSex}      </if>     </where>     
</select>    
2.set

当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。
没有使用if标签时,如果有一个参数为null,都会导致错误,如下示例:

<!-- 更新学生信息 -->     
<update id="updateStudent" parameterType="StudentEntity">     UPDATE STUDENT_TBL      SET STUDENT_TBL.STUDENT_NAME = #{studentName},      STUDENT_TBL.STUDENT_SEX = #{studentSex},      STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},      STUDENT_TBL.CLASS_ID = #{classEntity.classID}      WHERE STUDENT_TBL.STUDENT_ID = #{studentID};      
</update>   

使用set+if标签修改后,如果某项为null则不进行更新,而是保持数据库原值。如下示例:

<!-- 更新学生信息 -->     
<update id="updateStudent" parameterType="StudentEntity">     UPDATE STUDENT_TBL      <set>     <if test="studentName!=null and studentName!='' ">     STUDENT_TBL.STUDENT_NAME = #{studentName},      </if>     <if test="studentSex!=null and studentSex!='' ">     STUDENT_TBL.STUDENT_SEX = #{studentSex},      </if>     <if test="studentBirthday!=null ">     STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},      </if>     <if test="classEntity!=null and classEntity.classID!=null and classEntity.classID!='' ">     STUDENT_TBL.CLASS_ID = #{classEntity.classID}      </if>     </set>     WHERE STUDENT_TBL.STUDENT_ID = #{studentID};      
</update>  
3.trim

trim是更灵活的去处多余关键字的标签,他可以实践where和set的效果。
where例子的等效trim语句:

<!-- 查询学生list,like姓名,=性别 -->     
<select id="getStudentListWhere" parameterType="StudentEntity" resultMap="studentResultMap">     SELECT * from STUDENT_TBL ST      <trim prefix="WHERE" prefixOverrides="AND|OR">     <if test="studentName!=null and studentName!='' ">     ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')      </if>     <if test="studentSex!= null and studentSex!= '' ">     AND ST.STUDENT_SEX = #{studentSex}      </if>     </trim>     
</select>     

set例子的等效trim语句:

<!-- 更新学生信息 -->     
<update id="updateStudent" parameterType="StudentEntity">     UPDATE STUDENT_TBL      <trim prefix="SET" suffixOverrides=",">     <if test="studentName!=null and studentName!='' ">     STUDENT_TBL.STUDENT_NAME = #{studentName},      </if>     <if test="studentSex!=null and studentSex!='' ">     STUDENT_TBL.STUDENT_SEX = #{studentSex},      </if>     <if test="studentBirthday!=null ">     STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},      </if>     <if test="classEntity!=null and classEntity.classID!=null and classEntity.classID!='' ">     STUDENT_TBL.CLASS_ID = #{classEntity.classID}      </if>     </trim>     WHERE STUDENT_TBL.STUDENT_ID = #{studentID};      
</update>   

五.配置关联关系

1.collection

一对一
association通常用来映射一对一的关系,例如,有个类user,对应的实体类如下:(getter,setter方法省略)

private String id;//主键
private String userName;//用户姓名

有个类Article,对应的实体类如下:

private String id;//主键
private String articleTitle;//文章标题
private String articleContent;//文章内容

如果我想查询一个用户的时候,也查到他写的一篇文章,可以怎样写呢?在类user加入一个属性article

private String id;//主键
private String userName;//用户姓名
private Article article;//新增的文章属性

mapper.xml 我在user类的mapper.xml这样配置

<resultMap id="userResultMap" type="test.mybatis.entity.User"><id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/><result column="userName" property="userName" jdbcType="VARCHAR" javaType="java.lang.String"/>
//这里把user的id传过去<association property="article" column="id"                       select="test.mybatis.dao.articleMapper.selectArticleByUserId" />//test.mybatis.dao.articleMapper为命名空间</resultMap>

同时,我的article对应的xml这样写

<resultMap id="articleResultMap" type="test.mybatis.entity.Article"><id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/><result column="articleTitle" property="articleTitle" jdbcType="VARCHAR" javaType="java.lang.String"/><result column="articleContent" property="articleContent" jdbcType="VARCHAR" javaType="java.lang.String"/></resultMap>(当然,这里还有查询user表的语句,省略)

同时,在article对应的xml有这样的select语句:

<select id="selectArticleByUserId"
parameterType="java.lang.String"
resultMap="ArticleResultMap" >
select * from
tb_article where userId=#{userId} </select>
2.association

一对多
实体类增加对应属性

private String id;//主键
private String userName;//用户姓名
private List<Article> articleList;

userMapper.xml这样配置

<resultMap id="userResultMap" type="test.mybatis.entity.User"><id column="id" property="id" jdbcType="VARCHAR" javaType="java.lang.String"/><result column="userName" property="userName" jdbcType="VARCHAR" javaType="java.lang.String"/>
//这里把user的id传过去<collection property="articleList" column="id"                       select="test.mybatis.dao.articleMapper.selectArticleListByUserId" />
</resultMap>
以下省略,类同,Mybatis会把结果封装成List类型。

如果我还想通过Article表另一张表,比如文章中有个fk_id,也可以像上面这样重复配置,把fk_id当做与另一张表关联的参数,那时就可以通过用户查到文章,查到文章关联的另一张表了

六.SQL标签

更多用于写sql语句的一部分,写在配置文件中的常量
当多种类型的查询语句的查询字段或者查询条件相同时,可以将其定义为常量,方便调用,这样就可以通过SQL片段达到代码复用。为求 结构清晰也可将 sql 语句分解。

<!-- 动态条件分页查询 -->
<sql id="sql_count">select count(*)
</sql><sql id="sql_select">select *
</sql>

七.include标签

用于引用定义的常量
通过引用

<select id="selectCount" resultType="com.iot.site.module.quote.entity.Quote"><include refid = "sql_count"/>from site_quote
</select>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/487048.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ico图片怎么制作(图片怎么变成ico格式)

ico图片一般命名为favicon.ico&#xff0c;主要用于作为缩略的网站标志&#xff0c;显示在浏览器的地址栏或者在标签中&#xff0c;一般用网站logo来制作。那么ico图片怎么制作&#xff1f;Logo图片怎么变成ico格式&#xff1f;下面boke112百科就跟大家说一说ico图片制作步骤&a…

MATLAB中的稀疏矩阵和密集矩阵

在MATLAB中&#xff0c;矩阵可以表示为密集或稀疏格式。通常&#xff0c;矩阵默认以密集格式存储&#xff0c;这意味着每个元素都明确地存储在内存中&#xff0c;无论它的值是多少。然而&#xff0c;当矩阵含有大量的零元素时&#xff0c;这种存储方式就会变得非常低效。为了更…

RabbitMQ监控方法以及核心指标

RabbitMQ监控方法以及核心指标 1. 监控指标采集2. 使用rabbimq插件采集指标2.1 3.8.0之前版本&#xff0c;使用外部插件暴露2.2 3.8.0之后版本&#xff0c;使用内置插件暴露 3. 使用rabbitmq_exporter采集指标3.1 部署rabbitmq_exporter3.2 prometheus采集rabbitmq_exporter的暴…

Open CASCADE学习|绘制砂轮

今天绘制一个砂轮&#xff0c;其轮廓由两条直线段和两段圆弧构成&#xff0c;圆弧分别与直线相切&#xff0c;两条圆弧之间相交而非相切。建模思路是&#xff1a;先给定两条直线段的起始点及长度&#xff0c;画出直线段&#xff0c;然后给定其中一圆弧的半径及圆心角&#xff0…

【Docker快速入门】Docker部署MySQL

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

如何在nginx增加健康检查接口

在docker中部署的nginx或者在nginx部署的nginx一般是需要一个健康检查接口的 这样的话&#xff0c;就可以确定容器当前的状态是否是健康的 那么&#xff0c;如何给nginx增加一个健康检查的接口呢&#xff1f; 接下来呢&#xff0c;我们就演示一个在nginx中如何增加健康检查的…

Linux学习方法-框架学习法——Linux驱动架构的演进

配套视频学习链接&#xff1a;https://www.bilibili.com/video/BV1HE411w7by?p4&vd_sourced488bc722b90657aaa06a1e8647eddfc 目录 Linux驱动演进的过程 Linux驱动的原始架构(Linux V2.4) 平台总线架构(platform) Linux设备树 Linux驱动演进的趋势 Linux驱动演进的过程…

信息系统项目管理师(高项)—学习笔记

第一章信息化发展 1.1 信息与信息化 1.1.1 信息 信息是物质、能量及其属性的标示的集合&#xff0c;是确定性的增加。 它以物质介质为载体&#xff0c;在传递和反映世界各种事物存在方式、运动状态等的表征。 信息不是物质&#xff0c;也不是能力&#xff0c;它以一种普遍…

idea在工具栏中显示快速创建包和类的图标

一、效果图 点击需要创建包或者类的位置&#xff0c;在点击对用的图标就可以快速创建类或者包了。 二、设置 步骤一 View-->Appearance-->Toolbar 步骤二 File-->Settings-->Appearance & Behavior-->Menus and Toolbars-->Main Toolbar-->----…

(十八)devops持续集成开发——使用docker安装部署jenkins流水线服务

前言 本节内容介绍如何使用docker容器来部署安装jenkins流水线服务。关于docker容器的安装本节内容不做介绍。请读者提前安装。 正文 ①使用docker查找jenkins官方镜像 ② 拉取jenkins官方镜像jenkins/jenkins&#xff0c;选择一个最新稳定版本&#xff0c;避免一些插件不兼…

Java编程实战:构建医疗信息管理新平台

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

电脑c盘太满了怎么办?5个必备的好方法~

随着我们在电脑上存储和安装越来越多的文件和程序&#xff0c;C盘的空间可能会迅速减少&#xff0c;甚至变得过于拥挤。当C盘空间不足时&#xff0c;会影响电脑的运行速度和性能&#xff0c;甚至导致系统崩溃。本文将介绍一些解决C盘空间不足问题的方法&#xff0c;帮助你更好地…