mybatis插件 ~ 通用Mapper
综述
通用Mapper的主要目标是为了减少单表的增,删,改,查等大量重复,简单的sql语句。例如selectByPrimaryKey,deleteByPrimaryKey等等。
它相较于未使用通用Mapper的变化有:
环境:需要使用tk.mybatis开头的相关对象,而非org.mybatis。
映射:使用注解进行映射,例如@Table,@Id,@Column等,不在使用resultMap
基础操作:XXMapper继承通用Mapper,直接调用Mapper中的方法。
生成代码:生成的xml文件不在包含resultMap,基础的selectXX,deleteXX方法,非常简洁;生成的Mapper接口中不再包含基本的方法,并继承自通用Mapper;生成的Entity中有映射相关的注解,例如@Table,@Id,@Column等。
接下来逐一介绍这些内容。
环境
第一点,引入的依赖不在是org.mybatis,而是tk.mybatis。
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>版本号</version>
</dependency>
第二点,相关的对象使用tk.mybatis,而非org.mybatis,例如@MapperScan注解
@tk.mybatis.spring.annotation.MapperScan(basePackages= "扫描包")
第三点,可以设置Mapper的相关属性,
mapper
prop: value
mapper为通用mapper的前缀,prop为mapper的属性,value为其值。属性如下:
mappers:设置通用Mapper接口,默认的值为tk.mybatis.mapper.common.Mapper,它允许用户扩展(extend)通用Mapper,有两种方式,第一种设置为该选项的值,第二种使用@RegisterMapper接口。
Identity:数据库的标识,在自动生成ID时,根据标识查询不同的sql语句,例如mysql使用select last_insert_id()
order:全局设置selectKey标签的order属性,可选值有before和after。
catalog:数据库的catalog,没啥用
schema:数据库实例名称,在生成sql时,表名会添加前缀,例如test.user,查询test数据库下面的user表。
notEmpty:全局配置XXSelective相关的sql语句,在判断时添加不为空的条件,默认为不为null,例如username,默认为username!=null,设置为true后,变为user_name != null and user_name != ’’
style:表,列名称映射时采用的策略,默认为驼峰下划线形式,无需配置。
enableMethodAnnotation:在get和set方法上使用@Column注解,这种情况只适用于没有定义属性,只有属性的get和set方法。
useSimpleType:字段与列进行映射时,使用简单映射方式,不支持复杂对象属性,基础类型,例如User下面存在Address属性,int age字段,这两个字段不会映射。
usePrimitiveType:在useSimpleType的基础上支持基础类型
enumAsSimpleType:把枚举类型视为基础类型
simpleTypes:额外添加被视为基础对象的类型。
wrapKeyword:全局配置@Column注解,在名称中使用`columnName`包裹,好处在于当columnName为sql语句的关键字时,能够正常映射,例如存在from字段。
checkExampleEntityClass:在使用Example进行相关的基础操作时,校验类型一致性,直接使用XXExample则不需要,例如查询User,使用UserExample则不需要。
safeDelete:使用delete语句必须带有where条件,没有where条件抛错。
safeUpdate:使用update语句必须带有where条件。
useJavaType:字段映射时配置javaType,等价于标签配置javaType属性。
生成代码
在生成代码的配置文件中添加
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="tk.mybatis.mapper.common.Mapper" />
<property name="IDENTITY" value="MYSQL" />
<property name="caseSensitive" value="true" />
<property name="forceAnnotation" value="true" />
<property name="beginningDelimiter" value="`" />
<property name="endingDelimiter" value="`" />
</plugin>
使用Mybatis-plus代码生成器FastAutoGenerator时,它默认使用的就是通用Mapper,但类型变为com.baomidou.global.BaseMapper,里面的方法也不相同。
生成后产生的内容变化:
mapper接口:继承通用Mapper,例如UserMapper extends Mapper
xml文件:不再包含基础的select,delete等等这些,resultMap也不会生成。
entity:带有映射相关的注解,例如@Table,@Id,@Column等。
映射
表与对象的映射,列与字段的映射两类。
全局:
@NameStyle:配置表名称与类,列名称与字段名称之间的映射方式,默认为驼峰
表:
@Table:表与对象的映射。name属性配置为表名称。
列:
@Id:该属性为主键,当为联合主键时,可以在多个属性上添加。
@keySql:主键生成的策略,通常不使用,在具体的程序中使用setId,使用各种ID生成器生成会比较方便。
@Column:列与属性的映射,name为列名称。
@ColumnType:等价于resultMap下的result标签,可以配置javaType,jdbcType,typeHandler等。
@Transient:忽略这个字段。
注:@Id必须存在
基础操作
单表的,基础的增,删,改,查。
未使用通用Mapper:
第一步,在Mapper接口中使用deleteByPrimaryKey,
第二步,在XML中编写delete sql语句。
使用通用Mapper:
直接调用通用Mapper中的deleteByXX方法。
通用Mapper中提供了很多基础操作,这些接口都非常简单。查询具有多样性,通用Mapper提供了selectByExample方法,可以在其中配置查询中的各部分内容。通常只配置条件部分。
Example example = newExample(Country.class);
example.setForUpdate(true);
example.createCriteria().andGreaterThan("id",100).andLessThan("id",151);
example.or().andLessThan("id",41);
List<Country> countries = mapper.selectByExample(example);
其他方式基本不使用,有一些缺点。
XXExample:为每个实体对象生成XXExample对象,这些对象太多,不好维护,基本不使用此方式。
Example.builder:在Java中拼接sql的每个部分,通常不这样干,有sql注入的风险,而且sql与Java代码应该解耦。
扩展通用Mapper
当通用Mapper未提供你经常使用的方法,需要考虑扩展通用Mapper,步骤如下:
第一步,创建XXMapper接口,在接口上添加@RegisterMapper。
第二步,在XXMapper中添加需要扩展的方法,例如经常使用queryByEqualMap方法,传入Map,其中String为属性名称,Object为属性的值。在方法上添加@SelectProvider注解,
@SelectProvider(type = MySelectProvider.class, method = "dynamicSQL")
第三步,MySelectProvider方法继承MapperTemplate方法,实现queryByEqualMap方法。
第四步,在其他Mapper中就可以使用queryByEqualMap方法。
更多内容参考官网:Wiki - Gitee.com
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)