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

你真的会写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>
                <otherwise>
                   
                </otherwise>
              </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的时候要养成这种书写习惯,熟练运用各种标签,能提取出来的就提取出来,使我们的主干语句看起来通俗易懂,别人看我们写的代码也不至于那么头疼了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容