返回顶部
首页 > 资讯 > 后端开发 > Python >MyBatis常用标签以及使用技巧总结
  • 133
分享到

MyBatis常用标签以及使用技巧总结

2024-04-02 19:04:59 133人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

前言 mybatis常用标签及标签使用技巧 MyBatis的常用标签有很多,比如 <sql id="">:预定义可以复用的sql语句 <include refid=

前言

mybatis常用标签及标签使用技巧

MyBatis的常用标签有很多,比如

<sql id="">:预定义可以复用的sql语句

<include refid="">:根据id引用定义的sql语句

<trim>:空白补全,配合<if>标签使用

<if test="">:条件判断,该语句返回的true,则该标签内的语句就生效

<bind name="" value="">:创建一个变量,并且可以绑定到上下文

1、统一的增删改

通过我暂时的开发经验来说,我认为对一张表增删改操作,起码包括:增加一条记录、删除一条记录、修改一条记录。所以一张表的操作起码包括:增删改。

增加一条是主键id自增,删除一条记录是根据主键id删除,修改一条记录是根据主键id修改,返回值都是Integer类型的成功增删改的记录条数。以User对象为例:

UserMapper.java:


@Mapper
@Repository
public interface UserMapper {

    
    Integer insertOne(User user);

    
    Integer deleteOne(User user);

    
    Integer updateOne(User user);
}

则对应的UserMapper.xml:


<mapper namespace="UserMapper">
    <!--update的条件sql(除了自增主键id)-->
    <sql id="updateCondition">
        <if test=" uuid!=null and uuid!='' ">
            uuid = #{uuid},
        </if>
        <if test=" username!=null and username!='' ">
            username = #{username},
        </if>
        <if test=" passWord!=null and password!='' ">
            password = #{password},
        </if>
    </sql>
    <!--新增一条-->
    <insert id="insertOne"
            keyProperty="id"
            useGeneratedKeys="true"
            parameterType="User">
        INSERT INTO
            user
            (uuid,username,password)
        VALUES
            (#{uuid},#{username},#{password})
    </insert>
    <!--删除一条-->
    <delete id="deleteOne"
            parameterType="User">
        DELETE FROM user WHERE id = #{id}
    </delete>
    <!--修改一条(根据id主键)-->
    <update id="updateOne"
            parameterType="User">
        UPDATE
            user
        <trim prefix="SET" suffixOverrides=",">
            <include refid="updateCondition"></include>
        </trim>
        WHERE
            id = #{id}
    </update>
</mapper>

由于一般修改语句是根据id,所以在<update>标签中,WHERE id = #{id}是写死了的。一般修改的话,是除了id可以修改其余都是可以修改的,所以一般字段会比较多,利用<sql>标签预定义好除了id的字段,并且利用<if>标签包裹起来,同时特别注意:最后要加上逗号。然后在<trim>标签中利用<include>标签引用预定义的修改语句的条件。<include>标签就相当于直接把该id的sql语句直接粘贴到这里,这里是为了看起整体排版比较舒服所以才这么做的。

2、统一的查询

通过我暂时的开发经验来说,我认为对一张表查询操作,起码包括:查询多条记录(可分页可条件)、查询一条记录(可条件),查询该表的总记录数。所以一张表的操作起码包括:三个查询。

查询列表、单个查询、查询该表的总记录数,同样是以User对象为例:

UserMapper.java:


@Mapper
@Repository
public interface UserMapper {

    
    List<User> selectList(User user);

    
    User selectOne(User user);

    
    Long count(User user);

}

分别返回User集合、单个User对象以及记录数。

对应的UserMapper.xml:


<mapper namespace="UserMapper">
    <!--select的条件sql(全有)-->
    <sql id="selectCondition">
        <if test=" id!=null and id!='' ">
            AND u.id = #{id}
        </if>
        <if test=" uuid!=null and uuid!='' ">
            AND u.uuid = #{uuid}
        </if>
        <if test=" username!=null and username!='' ">
            AND u.username = #{username}
        </if>
        <if test=" password!=null and password!='' ">
            AND u.password = #{password}
        </if>
    </sql>
    <!--分页的条件sql(当前页,每页记录数)-->
    <sql id="limitCondition">
        <if test=" currentPage!=null and currentPage!='' and pageSize!=null and pageSize!='' ">
            <bind name="offset" value="pageSize*(currentPage-1)"/>
            <bind name="rows" value="pageSize"/>
            #{offset},#{rows}
        </if>
    </sql>
    <!--user表的别名-->
    <sql id="userAs">
        u.id                AS uId,
        u.uuid              AS uUuid,
        u.username          AS uUsername,
        u.password          AS uPassword
    </sql>
    <!--返回的结果集-->
    <resultMap id="userMap" type="User">
        <id column="uId" property="id"/>
        <result column="uUuid" property="uuid"/>
        <result column="uUsername" property="username"/>
        <result column="uPassword" property="password"/>
    </resultMap>
    <!--查询所有(可分页,可单条件,可多条件)-->
    <select id="selectList"
            parameterType="User"
            resultMap="userMap">
        SELECT
            <include refid="userAs"></include>
        FROM
            user u
        <trim prefix="WHERE" prefixOverrides="AND">
            <include refid="selectCondition"></include>
        </trim>
        ORDER BY
            u.id
        <trim prefix="LIMIT">
            <include refid="limitCondition"></include>
        </trim>
    </select>
    <!--查询一条(可单条件,可多条件)-->
    <select id="selectOne"
            parameterType="User"
            resultMap="userMap">
        SELECT
            <include refid="userAs"></include>
        FROM
            user u
        <trim prefix="WHERE" prefixOverrides="AND">
            <include refid="selectCondition"></include>
        </trim>
    </select>
    <!--查询记录数(可单条件,可多条件)-->
    <select id="count"
            parameterType="User"
            resultType="long">
        SELECT
            count(u.id)
        FROM
            user u
        <trim prefix="WHERE" prefixOverrides="AND">
            <include refid="selectCondition"></include>
        </trim>
    </select>
</mapper>

根据三个需求:查询全表、查询单个两个都可以用到条件查询,所以都可以用到同样的sql,所以就可以使用同样的<sql>标签来预定义然后复用。小结一下就是:

  • 查询全表:查询字段、可全条件、可分页
  • 查询单个:查询字段、可全条件
  • 查询记录数:可全条件

得益于<trim>标签和<if>标签的配合(if标签判断条件是否成立,如果成立则if标签内部语句生效,trim判断内部是否有语句,如果有则trim生效),没有条件传入就查询全表,没有分页传入的时候就不分页,做到了有条件则查条件,无条件则全查,有分页则查分页,无分页则全查。同时定义好结果集映射(column是查出来的列,property是Pojo对象的属性,需要对应好)以及配置好查询字段的别名(AS)。定义结果集和配置查询字段的别名是方便以后扩展。

条件查询的<sql>需要注意的是利用AND连接。

分页的<sql>需要注意的是利用<bind>标签来定义变量,注意变量的换算,一般采用的是传入当前页(currentPage)和每页记录数(pageSize),而数据库中limit语句的参数是limit offset,rows,offset(偏移量,也就是从表中的第几个元素开始,0是首位),rows(记录数,也就是返回多少个),总的来说就是从第几个开始,返回第条记录。然后利用简单的数学换算,将currentPage和pageSize转换为offset和rows。

<trim>标签的使用,利用<include>标签引入相应的sql语句后,再用<trim>标签包围,注意好prefix、suffix、prefixOverrides和suffixOverrides。

注意

SQL语句中各关键字的顺序

3、统一的增删改查

最后将增删改和查询总结合并起来就是:

UserMapper.java:


@Mapper
@Repository
public interface UserMapper {

    
    Integer insertOne(User user);

    
    Integer deleteOne(User user);

    
    Integer updateOne(User user);

    
    List<User> selectList(User user);

    
    User selectOne(User user);

    
    Long count(User user);

}

UserMapper.xml:


<mapper namespace="UserMapper">
    <!--select的条件sql(全有)-->
    <sql id="selectCondition">
        <if test=" id!=null and id!='' ">
            AND u.id = #{id}
        </if>
        <if test=" uuid!=null and uuid!='' ">
            AND u.uuid = #{uuid}
        </if>
        <if test=" username!=null and username!='' ">
            AND u.username = #{username}
        </if>
        <if test=" password!=null and password!='' ">
            AND u.password = #{password}
        </if>
    </sql>
    <!--update的条件sql(除了自增主键id)-->
    <sql id="updateCondition">
        <if test=" uuid!=null and uuid!='' ">
            uuid = #{uuid},
        </if>
        <if test=" username!=null and username!='' ">
            username = #{username},
        </if>
        <if test=" password!=null and password!='' ">
            password = #{password},
        </if>
    </sql>
    <!--分页的条件sql(当前页,每页记录数)-->
    <sql id="limitCondition">
        <if test=" currentPage!=null and currentPage!='' and pageSize!=null and pageSize!='' ">
            <bind name="offset" value="pageSize*(currentPage-1)"/>
            <bind name="rows" value="pageSize"/>
            #{offset},#{rows}
        </if>
    </sql>
    <!--user表的别名-->
    <sql id="userAs">
        u.id                AS uId,
        u.uuid              AS uUuid,
        u.username          AS uUsername,
        u.password          AS uPassword
    </sql>
    <!--返回的结果集-->
    <resultMap id="userMap" type="User">
        <id column="uId" property="id"/>
        <result column="uUuid" property="uuid"/>
        <result column="uUsername" property="username"/>
        <result column="uPassword" property="password"/>
    </resultMap>
    <!--新增一条-->
    <insert id="insertOne"
            keyProperty="id"
            useGeneratedKeys="true"
            parameterType="User">
        INSERT INTO
            user
            (uuid,username,password)
        VALUES
            (#{uuid},#{username},#{password})
    </insert>
    <!--删除一条-->
    <delete id="deleteOne"
            parameterType="User">
        DELETE FROM user WHERE id = #{id}
    </delete>
    <!--修改一条(根据id主键)-->
    <update id="updateOne"
            parameterType="User">
        UPDATE
            user
        <trim prefix="SET" suffixOverrides=",">
            <include refid="updateCondition"></include>
        </trim>
        WHERE
            id = #{id}
    </update>
    <!--查询所有(可分页,可单条件,可多条件)-->
    <select id="selectList"
            parameterType="User"
            resultMap="userMap">
        SELECT
            <include refid="userAs"></include>
            user u
            JOIN role r on u.roleId = r.id
        <trim prefix="WHERE" prefixOverrides="AND">
            <include refid="selectCondition"></include>
        </trim>
        ORDER BY
            u.id
        <trim prefix="LIMIT">
            <include refid="limitCondition"></include>
        </trim>
    </select>
    <!--查询一条(可单条件,可多条件)-->
    <select id="selectOne"
            parameterType="User"
            resultMap="userMap">
        SELECT
            <include refid="userAs"></include>
        FROM
            user u
        <trim prefix="WHERE" prefixOverrides="AND">
            <include refid="selectCondition"></include>
        </trim>
    </select>
    <!--查询记录数(可单条件,可多条件)-->
    <select id="count"
            parameterType="User"
            resultType="long">
        SELECT
            count(u.id)
        FROM
            user u
        <trim prefix="WHERE" prefixOverrides="AND">
            <include refid="selectCondition"></include>
        </trim>
    </select>
</mapper>

对一张表的操作最起码就应该包括以上:增加一条记录、删除一条记录、修改一条记录、查询列表(可条件、可分页)、查询一条(可条件)、查询记录数(可条件)。

4、利用idea的Code Templates自动生成

总结后观察到,每张表都有这6个操作,并且代码基本上都大致相同,差别只是对象的名字和表中字段不一样,那我每次创建Mapper文件都需要手敲吗?NoNoNo,可以利用IDEA的Code Templates功能,预先定义好Mapper Java和Mapper Xml的大致结构,然后利用传参传入对象名就可以了,这样每次就能自动生成大量代码,然后只需要修改极少部分代码就可以了。

Code Templates文件的创建:

打开IDEA,左上角依次点击:File->搜索template->找到File and Code Templates,在右侧创建新文件,输入文件名,扩展名Java:


#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "") package ${PACKAGE_NAME};#end

import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;
#parse("File Header.java")

@Mapper
@Repository
public interface ${NAME} {

    
    Integer insertOne(${Pojo} ${pojo});

    
    Integer deleteOne(${Pojo} ${pojo});

    
    Integer updateOne(${Pojo} ${pojo});

    
    List<${Pojo}> selectList(${Pojo} ${pojo});
    
    
    ${Pojo} selectOne(${Pojo} ${pojo});

    
    Long count(${Pojo} ${pojo});

}

${Pojo}:Pojo对象的类名

${pojo}:Pojo对象的变量名

这样下次在新建Mapper.java文件的时候直接利用该template创建就可以了。

同样的,Mapper.xml:


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "Http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${PRE}.mapper.${NAME}">
    <!--select的条件sql(全有)-->
    <sql id="selectCondition">
        <if test=" arg!=null and arg!='' ">
            AND arg = #{arg}
        </if>
    </sql>
    <!--update的条件sql(除了自增主键id)-->
    <sql id="updateCondition">
        <if test=" arg!=null and arg!='' ">
            arg = #{arg},
        </if>
    </sql>
    <!--分页的条件sql(当前页,每页记录数)-->
    <sql id="limitCondition">
        <if test=" currentPage!=null and currentPage!='' and pageSize!=null and pageSize!='' ">
            <bind name="offset" value="pageSize*(currentPage-1)"/>
            <bind name="rows" value="pageSize"/>
            #{offset},#{rows}
        </if>
    </sql>
    <!--返回的结果集-->
    <resultMap id="${Pojo}Map" type="${PRE}.pojo.${Pojo}">
        <id column="id" property="id"/>
        <result column="" property=""/>
    </resultMap>
    <!--新增一条记录-->
    <insert id="insertOne"
            keyProperty="id"
            useGeneratedKeys="true"
            parameterType="${PRE}.pojo.${Pojo}">
        INSERT INTO
            ${TABLE_NAME}
            ()
        VALUES
            ()
    </insert>
    <!--删除一条记录-->
    <delete id="deleteOne"
            parameterType="${PRE}.pojo.${Pojo}">
        DELETE FROM
            ${TABLE_NAME}
        WHERE
            id = #{id}
    </delete>
    <!--修改一条记录(根据id主键)-->
    <update id="updateOne"
            parameterType="${PRE}.pojo.${Pojo}">
        UPDATE
            ${TABLE_NAME}
        <trim prefix="SET" suffixOverrides=",">
            <include refid="updateCondition"></include>
        </trim>
        WHERE
            id = #{id}
    </update>
    <!--查询所有(可分页,可单条件,可多条件)-->
    <select id="selectList"
            parameterType="${PRE}.pojo.${Pojo}"
            resultMap="${Pojo}Map">
        SELECT
            *
        FROM
            ${TABLE_NAME}
        <trim prefix="WHERE" prefixOverrides="AND">
            <include refid="selectCondition"></include>
        </trim>
        ORDER BY
            id
        <trim prefix="LIMIT">
            <include refid="limitCondition"></include>
        </trim>
    </select>
    <!--查询一条(可单条件,可多条件)-->
    <select id="selectOne"
            parameterType="${PRE}.pojo.${Pojo}"
            resultMap="${Pojo}Map">
        SELECT
            *
        FROM
            ${TABLE_NAME}
        <trim prefix="WHERE" prefixOverrides="AND">
            <include refid="selectCondition"></include>
        </trim>
    </select>
    <!--根据主键id(效率高)查询记录数(可单条件,可多条件)-->
    <select id="count"
            parameterType="${PRE}.pojo.${Pojo}"
            resultType="long">
        SELECT
            count(id)
        FROM
            ${TABLE_NAME}
        <trim prefix="WHERE" prefixOverrides="AND">
            <include refid="selectCondition"></include>
        </trim>
    </select>
</mapper>

${PRE}:包的前缀

${Pojo}:对象的类名

${TABLE_NAME}:表名

即可以非常快速地生成Mapper.java和Mapper.xml了

5、连接关系表

因为Mybatis的特性,它可以连表查询。同样的,我们利用上述的方法创建好RoleMapper,如果想要在UserMapper中使用RoleMapper中定义好的sql,那么直接使用<include refid="包名+id">,下面是在UserMapper.xml中使用user表和role表连表查询列表举例:


	<!--查询所有(可分页,可单条件,可多条件)-->
    <select id="selectList"
            parameterType="com.fangaoxs.userserver.pojo.User"
            resultMap="userMap">
        SELECT
            <include refid="userAs"></include>,
            <include refid="com.xxx.userserver.mapper.RoleMapper.roleAs"></include>
        FROM
            user u
            JOIN role r on u.roleId = r.id
        <trim prefix="WHERE" prefixOverrides="AND">
            <include refid="selectCondition"></include>
        </trim>
        ORDER BY
            u.id
        <trim prefix="LIMIT">
            <include refid="limitCondition"></include>
        </trim>
    </select>

那么,这样就实现了user表和role的联合查询,并且roleMapper.xml中的<sql>也在userMapper.xml中得到了复用。

总结

到此这篇关于MyBatis常用标签以及使用技巧总结的文章就介绍到这了,更多相关MyBatis常用标签使用技巧内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: MyBatis常用标签以及使用技巧总结

本文链接: https://lsjlt.com/news/125802.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MyBatis常用标签以及使用技巧总结
    前言 MyBatis常用标签及标签使用技巧 MyBatis的常用标签有很多,比如 <sql id="">:预定义可以复用的sql语句 <include refid=...
    99+
    2024-04-02
  • MyBatis foreach 标签常用方法总结
    一、前言   在 MyBatis 中,常常会遇到集合类型的参数,虽然我们可以通过 OGNL 表达式来访问集合的某一个元素,但是 OGNL 表达式无法遍历集合。foreach 标签就是专门用来解决这类问题的,foreach 标签可以用来遍历数...
    99+
    2023-08-20
    mybatis java mysql
  • 28个JavaScript常用字符串方法以及使用技巧总结
    目录前言1. 获取字符串长度2. 获取字符串指定位置的值(1)charAt()(2)charCodeAt()3. 检索字符串是否包含特定序列(1)indexOf()(2)lastIn...
    99+
    2024-04-02
  • Mybatis的where标签使用总结梳理
    目录背景原始的手动拼接Mybatis where标签的使用进阶:自定义trim标签where语句的坑小结背景 在上篇文章,我们系统地学习了where 1...
    99+
    2024-04-02
  • android nfc常用标签读取总结
    有几天没有更新博客了,不过本篇却准备了许久,希望能带给每一位开发者最简单高效的学习方式。废话到此为止,下面开始正文。 NFC(Near Field Communicatio...
    99+
    2022-06-06
    nfc 标签 Android
  • MyBatis之Mapper详解及常用技巧
    select先看一个简单的案例:<select id="selectPerson" parameterType="int" resultType="hashma...
    99+
    2024-04-02
  • Python常用的爬虫技巧总结
    用python也差不多一年多了,python应用最多的场景还是web快速开发、爬虫、自动化运维:写过简单网站、写过自动发帖脚本、写过收发邮件脚本、写过简单验证码识别脚本。 爬虫在开发过程中也有很多复用的过程...
    99+
    2022-06-04
    爬虫 常用 技巧
  • Android编程常用技巧实例总结
    本文实例讲述了Android编程常用技巧。分享给大家供大家参考,具体如下: 1. 登录的时候,如果输入有误,则输入框左右震动,表示输入有误 在res下准备一个anim文件夹,里...
    99+
    2022-06-06
    技巧 Android
  • mysql常用命令以及小技巧
    目录1. 清理二进制日志2. mysqldump不锁表3. mysql跳过空事务4. 番外5. mysql8.0使用mysqldump导出数据1. 清理二进制日志 purge mas...
    99+
    2024-04-02
  • Mybatis中where标签与if标签怎么结合使用
    这篇文章主要介绍“Mybatis中where标签与if标签怎么结合使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Mybatis中where标签与if标签怎么结合使用”文章能帮...
    99+
    2023-07-05
  • Vue项目中常用的实用技巧总结
    本篇内容主要讲解“Vue项目中常用的实用技巧总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue项目中常用的实用技巧总结”吧!目录前言 使用 $attrs 和 $listeners 进行多层...
    99+
    2023-06-20
  • 科汛CMS的sql标签使用技巧
    关键字描述:使用技巧 标签   Field < 求职 where from 科技 ...
    99+
    2022-06-12
    使用技巧 标签 Field < where 求职 科技 from 教育
  • Mybatis中typeAliases标签和package标签使用
    目录typeAliases标签和package标签的使用1、typeAliases2、packageproperties,typeAliases,package三个标签使用以及细节t...
    99+
    2024-04-02
  • mybatis的<choose>标签使用
    记录:418 场景:使用MyBatis的标签的标签的test属性,对入参属性的值做非null(!=null)、非空(!='')判断,或者与常量做相等(==)或者不等判断(!=)。 版本:JDK 1.8,Spring Boot 2.6.3,m...
    99+
    2023-09-22
    mybatis choose标签使用 Java ORM框架
  • 帝国cms模板开发常用技巧总结
    本文详细讲述了帝国cms模板开发常用技巧。分享给大家供大家参考。具体分析如下: 对于使用帝国cms的一些新人来说,经常会做做模板的时候遇到一些小问题,大大降低了模板的制作速度! 以下总结了一部分帝国cms中常用的一些技巧...
    99+
    2022-06-12
    帝国cms 模板 开发 常用 技巧 总结
  • Mybatis中where标签与if标签结合使用详细说明
    目录前言使用<where>标签总结不使用<where>标签总结前言 由于不小心将and或者or写在了语句后面,导致mybatis无法自主判...
    99+
    2023-03-03
    mybatis where标签 mybatis where mybatis if标签
  • HTML5 video标签的使用技巧有哪些
    这篇文章主要讲解了“HTML5 video标签的使用技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HTML5 video标签的使用技巧有哪些”吧!...
    99+
    2024-04-02
  • MyBatis常用动态sql大总结
    简介 相信大家没用Mybatis之前,都碰到过各种条件判断拼接SQL、需要去掉多余的逗号等痛苦,Mybatis中的动态SQL能很好的解决上面说的情况,可以很灵活的组装SQL语句,从...
    99+
    2024-04-02
  • Python常用数据结构和公共方法技巧总结
    目录1. 列表1.1 列表的定义1.2 列表常用操作1.3 循环遍历1.4 应用场景2. 元组2.1 元组的定义2.2 元组常用操作2.3 循环遍历2.4 应用场景3. 字典3.1 ...
    99+
    2024-04-02
  • MySQL开发规范与使用技巧总结
    命名规范 1.库名、表名、字段名必须使用小写字母,并采用下划线分割。 a)MySQL有配置参数lower_case_table_names,不可动态更改,Linux系统默认为 0,即库表名以实际情况存储,大小写敏感。如果是1,以小写存储,大...
    99+
    2018-02-06
    MySQL开发规范与使用技巧总结
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作