百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

你真的会写mybatis.xml吗?养成好习惯写养眼好用的xml

bigegpt 2024-08-21 12:03 2 浏览

你真的会写mybatis.xml吗?养成好习惯写养眼好用的xml

我们使用mybatis无非就是进行一些增删改查的操作,但是简单的增删改查想要写好却大有门道。

对于实体的新增墙裂建议写一个通用的新增语句,这样在新增的时候就不需要每一次都去写一个新的语句了:

<insert id="insertSelective" parameterType="com.xyh.entity.QuartzJob">
 insert into xyh_quartz_job
 <trim prefix="(" suffix=")" suffixOverrides=",">
 <if test="id != null">
 id,
 </if>
 <if test="jobKey != null">
 job_key,
 </if>
 <if test="jobGroup != null">
 job_group,
 </if>
 <if test="jobStatus != null">
 job_status,
 </if>
 <if test="jobCronExpress != null">
 job_cron_express,
 </if>
 <if test="isDeleted != null">
 is_deleted,
 </if>
 </trim>
 <trim prefix="values (" suffix=")" suffixOverrides=",">
 <if test="id != null">
 #{id,jdbcType=BIGINT},
 </if>
 <if test="jobKey != null">
 #{jobKey,jdbcType=VARCHAR},
 </if>
 <if test="jobGroup != null">
 #{jobGroup,jdbcType=VARCHAR},
 </if>
 <if test="jobStatus != null">
 #{jobStatus,jdbcType=INTEGER},
 </if>
 <if test="jobCronExpress != null">
 #{jobCronExpress,jdbcType=VARCHAR},
 </if>
 <if test="isDeleted != null">
 #{isDeleted,jdbcType=INTEGER},
 </if>
 </trim>
 </insert>

参数解析:

id:唯一标识

parameterType:传入的参数实体

trim:

rim标签有四个属性:prefix,prefixOverrides,suffix,suffixOverrides。

prefix,suffix 表示在trim标签包裹的部分的前面或者后面添加内容(注意:是没有prefixOverrides,suffixOverrides的情况下) 。

如果有prefixOverrides,suffixOverrides 表示覆盖Overrides中的内容。

如果只有prefixOverrides,suffixOverrides 表示删除。

以上示例中suffixOverrides表示删除最后的','。

关于删除,一般我们会用到使用主键删除,或者传入参数删除这两种情况。

因此可以新增两条通用的语句:

 <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
 delete from xyh_quartz_job
 where id = #{id,jdbcType=BIGINT}
 </delete>
 <delete id="deleteByExample" parameterType="com.xyh.entity.QuartzJobCriteria">
 delete from xyh_quartz_job
 <if test="_parameter != null">
 <include refid="Example_Where_Clause" />
 </if>
 </delete>

这里又出现了一个include标签,他的意思是通过id引用其他的语句,以下是通用更新的语句:

<sql id="Update_By_Example_Where_Clause">
 <where>
 <foreach collection="example.oredCriteria" item="criteria" separator="or">
 <if test="criteria.valid">
 <trim prefix="(" prefixOverrides="and" suffix=")">
 <foreach collection="criteria.criteria" item="criterion">
 <choose>
 <when test="criterion.noValue">
 and ${criterion.condition}
 </when>
 <when test="criterion.singleValue">
 and ${criterion.condition} #{criterion.value}
 </when>
 <when test="criterion.betweenValue">
 and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
 </when>
 <when test="criterion.listValue">
 and ${criterion.condition}
 <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
 #{listItem}
 </foreach>
 </when>
 </choose>
 </foreach>
 </trim>
 </if>
 </foreach>
 </where>
 </sql>

参数解析

where:表示where条件

foreach:循环对象

foreach一共有三种参数类型,分别为List,Array,Map三种。

item:环体中的具体对象。

collection:要做foreach的对象,作为入参时,List<?>对象默认用list代替作为键,数组对象有array代替作为键,Map对象没有默认的键。

if:条件判断

如果条件为真才会渲染if里的语句

choose...when:条件判断

当有多个条件时使用choose...when。

在工作中运用最多的就是查询了,怎么把查询写的漂亮也是有讲究的,首先我们一般都要定义一个Base_Column_List:

<sql id="Base_Column_List">
 id, job_key, job_group, job_status, job_cron_express, remarks, job_desc, job_params, gmt_create, gmt_modified, is_deleted
 </sql>

包含了我们一般情况下都需要查询的字段,避免以后每次查询都要重复写这些字段。

除了字段,还有查询条件。查询条件千变万化,我们也可以先把能统一的部分通用出来:

<sql id="Example_Where_Clause">
 <where>
 <foreach collection="oredCriteria" item="criteria" separator="or">
 <if test="criteria.valid">
 <trim prefix="(" prefixOverrides="and" suffix=")">
 <foreach collection="criteria.criteria" item="criterion">
 <choose>
 <when test="criterion.noValue">
 and ${criterion.condition}
 </when>
 <when test="criterion.singleValue">
 and ${criterion.condition} #{criterion.value}
 </when>
 <when test="criterion.betweenValue">
 and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
 </when>
 <when test="criterion.listValue">
 and ${criterion.condition}
 <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
 #{listItem}
 </foreach>
 </when>
 </choose>
 </foreach>
 </trim>
 </if>
 </foreach>
 </where>
 </sql>

这里的prefixOverrides表示删掉第一个and。

然后首先根据主键查询:

 <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
 select 
 <include refid="Base_Column_List" />
 from xyh_quartz_job
 where id = #{id,jdbcType=BIGINT}
 </select>

看起来十分的简介。

根据外部条件查询:

 <select id="selectByExample" parameterType="com.xyh.entity.QuartzJobCriteria" resultMap="BaseResultMap">
 select
 <if test="distinct">
 distinct
 </if>
 <include refid="Base_Column_List" />
 from xyh_quartz_job
 <if test="_parameter != null">
 <include refid="Example_Where_Clause" />
 </if>
 <if test="orderByClause != null">
 order by ${orderByClause}
 </if>
 </select>

根据外部条件查询数量:

<select id="countByExample" parameterType="com.xyh.entity.QuartzJobCriteria" resultType="java.lang.Long">
 select count(*) from xyh_quartz_job
 <if test="_parameter != null">
 <include refid="Example_Where_Clause" />
 </if>
 </select>

当然mybatis的通用mapper就是在帮我们做这些事,不过其实通用mapper底层的方式也是这样。我们在平时写mybatis.xml的时候要养成这种书写习惯,熟练运用各种标签,能提取出来的就提取出来,使我们的主干语句看起来通俗易懂,别人看我们写的代码也不至于那么头疼了。

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...