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://xiahunao.cn/news/2805317.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

一周学会Django5 Python Web开发-Http请求HttpRequest请求类

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计25条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

架构篇36:微服务架构最佳实践 - 基础设施篇

文章目录 自动化测试自动化部署配置中心接口框架API 网关服务发现服务路由服务容错服务监控服务跟踪服务安全小结每项微服务基础设施都是一个平台、一个系统、一个解决方案,如果要自己实现,其过程和做业务系统类似,都需要经过需求分析、架构设计、开发、测试、部署上线等步骤…

document.cookie中expires 格式设置问题导致部分iphone safari上登录失效

一、问题描述 设备信息&#xff1a;iPhone 12, iOS 16.3 昨天有个小伙伴发现自己的iPhone safari打开网页登录时&#xff0c;登录页面显示登录成功&#xff0c;但实际进入首页后仍然显示未登录。多次测试&#xff0c;该问题在该设备上属于必现问题。 二、问题排查与解决 经过…

【办公类-16-10-01】“2023下学期 中4班 自主游戏观察记录(python 排班表系列)

背景需求 上学期的周安排里&#xff0c;每班每周的自主游戏会轮到多个不同的内容 因此在每周的自主游戏观察有2次记录&#xff0c;观察的项目可以写不一样的&#xff0c; 如一位老师写沙水游戏&#xff0c;另一位写表演游戏 本学期&#xff0c;中班的自主游戏全部是户外的&am…

高并发系统实战课个人总结(极客时间)

高并发系统实战课 场景 读多写少 我会以占比最高的“读多写少”系统带你入门&#xff0c;梳理和改造用户中心项目。这类系统的优化工作会聚焦于如何通过缓存分担数据库查询压力&#xff0c;所以我们的学习重点就是做好缓存&#xff0c;包括但不限于数据梳理、做数据缓存、加缓…

[yolov9]使用python部署yolov9的onnx模型

【框架地址】 https://github.com/WongKinYiu/yolov9 【yolov9简介】 在目标检测领域&#xff0c;YOLOv9 实现了一代更比一代强&#xff0c;利用新架构和方法让传统卷积在参数利用率方面胜过了深度卷积。 继 2023 年 1 月 正式发布一年多以后&#xff0c;YOLOv9 终于来了&a…

月之暗面:Moonshot AI接口总结

前言&#xff1a; 开发者们只需访问 platform.moonshot.cn&#xff0c;便能创建自己的 API Key&#xff0c;进而将 Kimi 智能助手背后的同款 moonshot 模型能力&#xff0c;如长文本处理和出色的指令遵循等&#xff0c;集成至自己的产品中。这不仅增强了现有产品的功能&#x…

C++之stack与queue的模拟实现

一、 stack的介绍和使用 1. stack的介绍 stack 的文档介绍 翻译&#xff1a; 1. stack 是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack 是作为容器适配器被实现的&#xff…

【Ubuntu】Anaconda的安装和使用

目录 1 安装 2 使用 1 安装 &#xff08;1&#xff09;下载安装包 官网地址&#xff1a;Unleash AI Innovation and Value | Anaconda 点击Free Download 按键。 然后 点击下图中的Download开始下载安装包。 &#xff08;2&#xff09;安装 在安装包路径下打开终端&#…

华为配置WDS手拉手业务示例

配置WDS手拉手业务示例 组网图形 图1 配置WDS手拉手业务示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 企业用户通过WLAN接入网络&#xff0c;以满足移动办公的最基本需求。但企业考虑到AP通过有线部署的成本较高&#xff0c;所以通过建立…

二百二十四、Kettle——曲线实现从Hive插入更新到ClickHouse(分区字段是month或year)

一、目的 对于以month、year为分区字段的数据&#xff0c;不是像day字段分区那样每天增量插入更新即可&#xff0c;而是要以部分字段查询、部分字段更新&#xff0c;但是ClickHouse数据库并不适合更新操作&#xff0c;直接使用Kettle的插入更新控件会导致问题&#xff0c;必须…

Win11系统cmd输入“ipconfig”报错:ipconfig不是内部或外部命令

方法一&#xff1a; 正常系统添加系统变量&#xff0c;看佬的wp&#xff1a;【网络】解决‘ipconfig不是内部或外部命令&#xff0c;也不是可运行的程序_ifconfig不是内部或外部命令,也不是可运行的程序-CSDN博客 方法二&#xff1a; 1.下载everything 2.搜索ipconfig 3.去…

网络安全笔记总结

IAE引擎 1.深度检测技术--DFI和DPI技术 DFI和DPI都是流量解析技术&#xff0c;对业务的应用、行为及具体信息进行识别&#xff0c;主要应用于流量分析及流量检测。 DPI&#xff1a;深度包检测技术 DPI是一种基于应用层的流量检测和控制技术&#xff0c;对流量进行拆包&#x…

个人博客系列-前端部署-创建框架(4)

项目环境介绍 Vue3 Vite TypeScript 服务器&#xff1a;阿里云contos node版本&#xff1a;v18.18.2 npm版本&#xff1a;v10.2.4 执行下面一行命令&#xff0c;创建vue3框架 npm create vuelatest修改端口&#xff1a;9528&#xff0c; 此步骤可以忽略&#xff08;使用默…

发电机组启动前的准备和检查注意事项

发电机组启动前的准备&#xff1a; 1.检查润滑油的油位、 冷却液液位、燃油量&#xff1b; 2.检查机的供油、润滑、冷却等系统各个管路及接头有无漏油漏水现象&#xff1b; 3.检查电气线路有无破皮等漏电隐患&#xff0c;接地线电气线路是否松动&#xff0c;机组与基础的连接是…

工作中常见问题总结

工作中常见错误清单 1、springboot实现无数据库启动 问题 springboot往往是作为b/s系统的server端的架子来使用&#xff0c;但是有些时候&#xff0c;是作为静默的server&#xff0c;并没有界面和数据库&#xff0c;但是springboot默认是链接数据库的&#xff0c;如何解决这个…

bean 实例化的三种方式与生命周期

目录 构造方法&#xff08;常用&#xff09;静态工厂实例工厂与 FactoryBeanbean 生命周期控制配置方法接口方法bean 生命周期阶段 构造方法&#xff08;常用&#xff09; 提供可访问的构造方法 public class BookDaoImpl implements BookDao {public BookDaoImpl() {// ...}…

Rust之构建命令行程序(四):用TDD(测试-驱动-开发)模式来开发库的功能

开发环境 Windows 11Rust 1.75.0 VS Code 1.86.2 项目工程 这次创建了新的工程minigrep. 用测试-驱动模式来开发库的功能 既然我们已经将逻辑提取到src/lib.rs中&#xff0c;并将参数收集和错误处理留在src/main.rs中&#xff0c;那么为代码的核心功能编写测试就容易多了。我…

STM32F103x 的时钟源

AHB (Advanced High-performance Bus) 高速总线&#xff0c;用来接高速外设的。 APB (Advanced Peripheral Bus) 低速总线&#xff0c;用来接低速外设的&#xff0c;包含APB1 和 APB2。 APB1&#xff1a;上面连接的是低速外设&#xff0c;包括电源接口、备份接口、 CAN 、 US…

k8s的svc流量通过iptables和ipvs转发到pod的流程解析

文章目录 1. k8s的svc流量转发1.1 service 说明1.2 endpoints说明1.3 pod 说明1.4 svc流量转发的主要工作 2. iptables规则解析2.1 svc涉及的iptables链流程说明2.2 svc涉及的iptables规则实例2.2.1 KUBE-SERVICES规则链2.2.2 KUBE-SVC-EFPSQH5654KMWHJ5规则链2.2.3 KUBE-SEP-L…