Mybatis tk.mybatis

通用 Mapper

通用Mapper方便的使用 Mybatis 进行单表的增删改查,是一款优秀开源产品。它使用拦截器来实现具体的执行 Sql,完全使用原生的 Mybatis 进行操作。
它提供了所有单表的基本增删改查方法,大大节省了书写基本 mapper.xml 的时间。尤其对于新工程和新表来说,极大的提高了项目构建效率。使用这个通用 Mapper 甚至能改变对 Mybatis 单表基础操作不方便的想法,使用它能简单的使用单表的增删改查,包含动态的增删改查。
同时,在代码结构合理的前提下,更换 RDBMS 也无须修改 sql,只需修改部分配置即可实现。

通用Mapper的pom依赖

  1. <dependency>
  2. <groupId>tk.mybatis</groupId>
  3. <artifactId>mapper</artifactId>
  4. <version>x.x.x</version>
  5. </dependency>

项目中集成使用

Java编码方式

  1. MapperHelper mapperHelper = new MapperHelper();
  2. //特殊配置
  3. Config config = new Config();//具体支持的参数看后面的文档
  4. config.setXXX(XXX);//设置配置
  5. mapperHelper.setConfig(config);// 注册自己项目中使用的通用Mapper接口,这里没有默认值,必须手动注册
  6. mapperHelper.registerMapper(Mapper.class);
  7. //配置完成后,执行下面的操作
  8. mapperHelper.processConfiguration(session.getConfiguration());

Spring配置方式实现

  1. <bean >
  2. <property name="basePackage" value="com.fcant.mybatis.mapper"/>
  3. <property name="properties">
  4. <value>mappers=tk.mybatis.mapper.common.Mapper</value>
  5. </property>
  6. </bean>

:::danger 注意这里是 tk.mybatis.xxx, 和 MyBatis 的唯一区别就是 org. 改成了 tk.,方便修改和记忆。 ::: 通用 Mapper 的各项属性通过 properties 属性进行配置,如果默认配置就是一行 mappers=tk.mybatis.mapper.common.Mapper 时,可以不写,就会变成:

  1. <bean >
  2. <property name="basePackage" value="com.fcant.mybatis.mapper"/>
  3. </bean>

继承通用 Mapper 接口(注意必须要加泛型):

  1. @Repository
  2. public interface MaterialDao extends Mapper<MaterialMeta>,
  3. InsertUseGeneratedKeysMapperr<MaterialMeta> {}

示例继承了Mapper和InsertUseGeneratedKeysMapper,则直接拥有了这2个接口的所有方法。
实体类的代码:

  1. @Table(name = "tb\_helpcenter\_material")
  2. public class MaterialMeta {
  3. @Id
  4. @GeneratedValue(strategy = GenerationType.IDENTITY)
  5. private Long id;
  6. private String title;
  7. private String tags;
  8. private Long classificationId;
  9. private String platform;
  10. private String lecturerName;
  11. // Setters&Getters
  12. }

实体类的规则

  1. 表名默认使用类名, 驼峰转下划线 (只对大写字母进行处理), 如 UserInfo 默认对应的表名为 user_info。
    2. 表名可以使用 @Table(name = “tableName”) 进行指定, 对不符合第一条默认规则的可以通过这种方式指定表名.
    3. 字段默认和 @Column 一样, 都会作为表字段, 表字段默认为 Java 对象的 Field 名字驼峰转下划线形式.
    4. 可以使用 @Column(name = “fieldName”) 指定不符合第 3 条规则的字段名
    5. 使用 @Transient 注解可以忽略字段, 添加该注解的字段不会作为表字段使用.
    6. 建议一定是有一个 @Id 注解作为主键的字段, 可以有多个 @Id 注解的字段作为联合主键.
    7. 默认情况下, 实体类中如果不存在包含 @Id 注解的字段, 所有的字段都会作为主键字段进行使用 (这种效率极低).
    8. 实体类可以继承使用, 可以参考测试代码中的 tk.mybatis.mapper.model.UserLogin2 类.
    9. 由于基本类型, 如 int 作为实体类字段时会有默认值 0, 而且无法消除, 所以实体类中建议不要使用基本类型.
    10.@NameStyle 注解,用来配置对象名 / 字段和表名 / 字段之间的转换方式,该注解优先于全局配置 style,可选值:
    另外,建议实体类的所有 Field 全部使用装箱类,不要使用基本类型。
    id 字段上的 @GeneratedValue 注解用来表示该表使用的主键策略类型。

    关于主键策略

    主键策略主要用于 insert 场景。通常情况下,可以不用设置表对象的主键策略。不设置时,默认会使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键。
    也可以以 ( @GeneratedValue(generator = "") 的形式来指定主键策略命令。如:@GeneratedValue(strategy = GenerationType.IDENTITY
    ,generator = "select last_insert_id()") 等。
    同时,可以根据实际需要,在全局配置中指定主键策略的执行 ORDER。

    Service层的调用使用

    在Service层直接调用即可
    1. MaterialMeta materialMeta = ReflectUtil.convertObj(MaterialMeta.class, material, false);
    2. materialMeta.setPlatform(platformStr);
    3. materialDao.insertSelective(materialMeta);
    ```java Example example = new Example(MaterialMeta.class); example.createCriteria().andEqualTo(“classificationId”, material.getClassificationId()).andEqualTo(“deleted”,false);

example.orderBy(“sort”).desc(); PageHelper.startPage(1, 1); List materialMetas = materialDao.selectByExample(example);

  1. ```java
  2. materialMeta.setStatus(MaterialStatus.online);
  3. materialMeta.setPublishDate(new Date());
  4. materialDao.updateByPrimaryKeySelective(materialMeta);

:::danger 基本的SQL不需要手写了,特殊的SQL还是需要自定义 :::

tk.mybatis配合分页插件PageHelper的使用

PageHelper的Github的仓库地址:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md

A.引入PageHelper相关依赖

  1. <dependency>
  2. <groupId>com.github.pagehelper</groupId>
  3. <artifactId>pagehelper</artifactId>
  4. <version>最新版本</version>
  5. </dependency>

B.直接在项目中集成使用即可

示例代码

  1. PageHelper.offsetPage(offset, limit);
  2. Page<MaterialMeta> metas = (Page<MaterialMeta>) materialDao.selectByExample(example);