# Mybatis动态标签 **Repository Path**: fpfgitmy_admin/mybatis-dynamic-tag ## Basic Information - **Project Name**: Mybatis动态标签 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-28 - **Last Updated**: 2021-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### Mybatis动态标签 #### 汇总 | 标签名称 | 示意 | | --- | --- | | select | 定义查询语句 | | insert | 定义增加语句 | | update | 定义修改语句 | | delete | 定义删除语句 | | resultMap | 绑定结果集和对象属性 | | foreach | 用于遍历 | | if | 用于判断属性 | | choose | 用于多条件判断属性 | | where | 进行语句where拼接 | | set | 格式化update语句 | | trim | 去除属性的空格 | | collection | 多对多关联关系 | | association | 一对一关联关系 | | sql | 定义sql常量片段 | #### SQL定义标签 ##### select + 标签示意:定义查询语句 + 属性示意: + id :唯一的标识符 + parameterType:传给此语句的参数的全路径名或别名(不填写默认以参数数据类型为主) + resultType :语句返回值类型或别名 + resultMap :返回一个resultMap(resultMap和resultType不能共用) + 代码示例 ``` ``` ##### insert + 标签示意:增加语句 + 属性示意: + id :唯一的标识符 + parameterType:传给此语句的参数的全路径名或别名 + useGeneratedKeys: useGeneratedKeys设置为 true 时,表示如果插入的表userId以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键id返回 + keyProperty: 将主键的值注入到实体类指定的属性中 + keyColumn:指定数据库主键的名称 + 代码示例 ``` INSERT INTO `bss_user` (`nick_name`, `real_name`, `avatar`, `sex`, `phone`, `password`, `create_time`, `update_time`) VALUES (#{nickName}, #{realName}, #{avatar}, #{sex}, #{phone}, #{password}, now(), NULL); ``` ##### update + 标签示意:定义修改语句 + 属性示意: + id :唯一的标识符 + parameterType:传给此语句的参数的全路径名或别名 + 代码示例 ``` update `bss_user` set `nick_name` = #{nickName} where `user_id` = #{userId} ``` ##### delete + 标签示意:定义删除语句 + 属性示意: + id :唯一的标识符 + parameterType:传给此语句的参数的全路径名或别名 + 代码示意 ``` delete from `bss_user` where `user_id` = #{userId} ``` ##### sql标签 + 标签示意:定义一些常量片段,比如字段 + 属性示意: + id:定义标签的标识 + 代码示意: ``` `user_id`,`nick_name`, `real_name`, `avatar`, `sex`, `phone`, `password`, `create_time`, `update_time` ``` ##### include标签 + 标签示意:引用常量 + 代码示意: ``` ``` #### 配置对象属性与查询结果集标签 ##### resultMap + 标签示意:将字段名和属性对应起来 + 主标签属性示意: + id :唯一的标识符 + type:传给此语句的参数的全路径名或别名 + extends: 继承指定namespace的指定的id的resultMap + autoMapping:在映射时自动忽略大小写,默认false + 子标签示意: + id:用于设置主键字段与领域模型属性的映射关系,此处主键为ID,对应id + result:用于设置普通字段与领域模型属性的映射关系 + 子标签属性示意: + column: 标识数据库表的字段 + property: 标识实体类的属性 + jdbcType:数据库和实体类类型,不写默认以实体类为主 + typeHandler:对当前结果集再处理 + 代码示意 ``` ``` ``` ``` #### 动态拼接SQL ##### if标签 + 标签示意:判断对应属性值是否符合条件,如果符合则执行标签内语句 + 属性示意: + test:进行属性值的比对 + 代码示意: ``` update `bss_user` set `nick_name` = #{nickName} `real_name` = #{real_name} where `user_id` = #{userId} ``` ##### foreach标签 + 标签示意:循环遍历参数,进行语句拼接 + 属性示意: + collection:标识参数参数的属性值list、array + item:标识每一个元素的别名 + index:指定一个名字,用于表示在迭代过程中,每次迭代到的位置 + open:表示语句以什么开始,比如"(" + close:表示语句以什么结束,比如")" + separator:表示语句每次迭代以什么分割 + 代码示意: ``` ``` ##### choose标签 + 标签示意:多条件判断,相当于多个if else + 子标签示意: + when: 用于if的判断 + test属性:判断具体的属性 + otherwise:用于else的判断 + 代码示意: ``` ``` #### 格式化输出 ##### where标签 + 标签示意:用于格式化调多余的and + 错误代码示意: 当第一个条件不成立,第二个条件成立的时候就会出现sql语句拼接错误 ``` ``` + 正确代码示意:where会过滤调多余的and ``` ``` ##### set标签 + 标签示意:动态配置set关键字,并且剔除追加到条件默认的条件不想关的逗号 + 代码示意: ``` update `bss_user` `nick_name` = #{nickName}, `real_name` = #{realName}, `avatar` = #{avatar}, `update_time` = now() where `user_id` = #{userId} ``` ##### trim标签 + 标签示意:去除多余关键字标签,和拼接对应的关键字 + 属性示意: + prefix:前缀的值 + prefixOverrides:指定去除多余的前缀内容 + suffix:在trim标签内sql语句加上后缀 + suffixOverrides:指定去除多余的后缀内容 + 代码示意: ``` ``` #### 关联关系配置 ##### collection 1. 定义父类接受vo ``` package com.example.demo.vo; import com.example.demo.model.Article; import lombok.Data; import java.util.List; /** * @Author felix fei * @Date 2021/4/6 0006 9:28 * @Version 1.0.1 * @describe: */ @Data public class UserArticleVO { private String userId; private String nickName; private String realName; private String avatar; private Integer sex; private Integer type; private String phone; private List
articleList; } ``` 2. 定义子类 ``` package com.example.demo.model; import lombok.Data; /** * @Author felix fei * @Date 2021/4/6 0006 9:08 * @Version 1.0.1 * @describe: */ @Data public class Article { private String articleId; private String userId; private String title; private String content; private String createTime; private String updateTime; } ``` 3. 定义父类sql片段 ``` bu.`user_id`,bu.`nick_name`, bu.`real_name`, bu.`avatar`, bu.`sex`, bu.`phone`, bu.`password`, bu.`create_time`, bu.`update_time` ``` 4. 定义子类sql片段 ``` ba.`article_id`, ba.`user_id`, ba.`title`, ba.`content`, ba.`create_time`, ba.`update_time` ``` ##### collection(方式一) + 优点:代码复用性高,主表分页查询正确 + 缺点:子表需要进行多次的sql查询 + 标签示意:映射一对多的关系 + 属性示意: + property:主表中声明的多的一方的属性名称 + javaType:指定关联的类型(可以不用指定) + ofType:指定泛型的类型(可以不用指定) + select:指定对应的select语句,可以使用 namespace+sqlid 的方式 + column:指定父子集关系对应的关联字段(属性)或传输字段(属性) + 单个值指定方式:`column="user_id"`,子表中使用的是主表中 `property="userId"`,该属性的名称 + 多个值指定方式:`column="{userId1=user_id,属性名=主表中column的值}"`,子表中使用`#{userId1}`,`属性名`` + 总结:单个值可以直接写,多个值用逗号分隔 + 代码示意: 1. 定义主表查询语句和resultMap ``` ba.`article_id`, ba.`user_id`, ba.`title`, ba.`content`, ba.`create_time`, ba.`update_time` ``` 2. 定义子表的查询语句 ``` ``` ##### collection(方式二) + 优点:只需要执行一次sql的查询 + 缺点:主表分页查询不正确 + 标签示意:映射一对多的关系 + 属性示意: + property:主表中声明的多的一方的属性名称 + javaType:指定关联的类型(可以不用指定) + ofType:指定泛型的类型(必须指定) + select:指定对应的select语句,可以使用 namespace+sqlid 的方式 + column:指定父子集关系对应的关联字段(属性)或传输字段(属性) + 代码示意: 1. 定义查询语句和resultMap ``` ``` ##### association 1. 定义UserVo ``` package com.example.demo.vo; import com.example.demo.model.Account; import lombok.Data; import java.util.Date; /** * @Author felix fei * @Date 2021/4/13 0013 11:11 * @Version 1.0.1 * @describe: */ @Data public class UserVo { private String userId; private String nickName; private String realName; private String avatar; private Integer sex; private Integer type; private String phone; private String createTime; private Account account; } ``` 2. 定义Account ``` package com.example.demo.model; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; /** * @Author felix fei * @Date 2021/4/13 0013 10:59 * @Version 1.0.1 * @describe: */ @Data public class Account { private String accountId; private String userId; private BigDecimal availableAmount = new BigDecimal(0.00); private BigDecimal frozenAmount = new BigDecimal(0.00); private int points; private String createTime; private String updateTime; } ``` ##### association(方式一) + 优点:代码复用性高 + 缺点:主表查询一次,子表就要查询一次 + 标签示意:映射一对一的关联查询 + 属性示意: + property:主表中声明的多的一方的属性名称 + javaType:指定关联的JavaBean对象(可以不用指定) + select:指定对应的select语句,可以使用 namespace+sqlid 的方式 + column:指定父子集关系对应的关联字段(属性)或传输字段(属性) + 代码示意: 1. 定义主表查询语句和resultMap ``` bu.`user_id`,bu.`nick_name`, bu.`real_name`, bu.`avatar`, bu.`sex`, bu.`phone`, bu.`password`, bu.`create_time`, bu.`update_time` ``` 2. 定义子表查询语句 ``` bua.`account_id`,bua.`user_id`,bua.`available_amount`,bua.`frozen_amount`,bua.`points`,bua.`create_time`,bua.`update_time` ``` ##### association(方式二) + 优点:只查询一次 + 标签示意:映射一对一的关联查询 + 属性示意: + property:主表中声明的多的一方的属性名称 + javaType:指定关联的JavaBean对象(必须指定) + select:指定对应的select语句,可以使用 namespace+sqlid 的方式 + column:指定父子集关系对应的关联字段(属性)或传输字段(属性) + 代码示意: 1. 定义查询语句和resultMap ``` ```