TkMybatis的使用

通用mapper:tkmybatis

tkmybatis是上一次进行做项目时进行使用的以下对其进行总结,以便日后记忆使用。
tkmybatis在git上的链接https://github.com/abel533/Mapper/wiki

Java 编码方式集成

Java 编码方式集成是最少见的一种情况,但是通过这种集成方式可以很容易让大家看清通用 Mapper 集成的入口,这里会提供两种方式。

  1. 最直接的方式
  2. 使用 Configuration 作为入口集成

添加依赖

在开始写代码前,先把依赖添加进来。

在 Java 编码集成方式中,首先你肯定已经引入了 MyBatis 的依赖:


  org.mybatis
  mybatis
  版本号

所有版本号看这里:http://mvnrepository.com/artifact/org.mybatis/mybatis

通用 Mapper 支持 MyBatis 3.2.4+

在 mybatis 依赖的基础上,添加通用 Mapper 的依赖即可:


    tk.mybatis
    mapper
    最新版本

最新版本看这里:http://mvnrepository.com/artifact/tk.mybatis/mapper

如果你使用的 Jar 包,你可以通过上面提供的链接下载 Jar。

编写代码集成

使用 Java 编码方式时,正常情况下你都会有构建 SqlSessionFactory 的代码。

在创建 SqlSessionFactory 对象前或者后对应两种配置通用 Mapper 的方法,由于没有提供 mybatis-config.xml 文件的解析类,这里会推荐使用 创建后 的方式来创建。

创建后

在创建 SqlSessionFactory 后,在任何其他调用发生前,使用下面的方式配置通用 Mapper。

//从刚刚创建的 sqlSessionFactory 中获取 session
session = sqlSessionFactory.openSession();
//创建一个MapperHelper
MapperHelper mapperHelper = new MapperHelper();
//特殊配置
Config config = new Config();
//主键自增回写方法,默认值MYSQL,详细说明请看文档
config.setIDENTITY("MYSQL");
//支持getter和setter方法上的注解
config.setEnableMethodAnnotation(true);
//设置 insert 和 update 中,是否判断字符串类型!=''
config.setNotEmpty(true);
//校验Example中的类型和最终调用时Mapper的泛型是否一致
config.setCheckExampleEntityClass(true);
//启用简单类型
config.setUseSimpleType(true);
//枚举按简单类型处理
config.setEnumAsSimpleType(true);
//自动处理关键字 - mysql
config.setWrapKeyword("`{0}`");
//设置配置
mapperHelper.setConfig(config);
//注册通用接口,和其他集成方式中的 mappers 参数作用相同
//4.0 之后的版本,如果类似 Mapper.class 这样的基础接口带有 @RegisterMapper 注解,就不必在这里注册
mapperHelper.registerMapper(Mapper.class);
//配置 mapperHelper 后,执行下面的操作
mapperHelper.processConfiguration(session.getConfiguration());

如果省略 Config 的配置,上述代码简化为:

//从刚刚创建的 sqlSessionFactory 中获取 session
session = sqlSessionFactory.openSession();
//创建一个MapperHelper
MapperHelper mapperHelper = new MapperHelper();
mapperHelper.processConfiguration(session.getConfiguration());

通用 Mapper 默认就是通过 session.getConfiguration() 获取所有的 MyBatis 方法,然后对其中属于通用方法的方法进行处理。

创建前

创建前就是通过使用 tk.mybatis.mapper.session.Configuration 替换 MyBatis 中的 org.apache.ibatis.session.Configuration来实现。配置代码如下:

Configuration configuration = new Configuration();
//这里可以参考上面的方式来配置 MapperHelper
configuration.setMapperHelper(new MapperHelper());
sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

实现原理:

这种配置方式是通过重写原 Configuration 中的 addMappedStatement 方法来实现的:

@Override
public void addMappedStatement(MappedStatement ms) {
try {
 super.addMappedStatement(ms);
 //没有任何配置时,使用默认配置
 if (this.mapperHelper == null) {
   this.mapperHelper = new MapperHelper();
 }
 this.mapperHelper.processMappedStatement(ms);
} catch (IllegalArgumentException e) {
 //这里的异常是导致 Spring 启动死循环的关键位置,为了避免后续会吞异常,这里直接输出
 e.printStackTrace();
 throw new RuntimeException(e);
}
}

通过上面其中一种方式配置后,通用方法都会生效。

接下来请继续看下一章内容。

细化依赖的用法

首先不推荐 Maven 初学者看这里,也不建议通用 Mapper 初学者看这里。

在决定是否看之前,先看看细化依赖用法的特点:

  • 可以以最精简的方式引入通用 Mapper,按照需要引入。
  • 可以将某个依赖替换为自己的实现或者选择特定版本的依赖(比如某些依赖可以选择 Java 6 或者 Java 8 的版本)。

当你需要自己选择具体的依赖时,继续看下面的介绍。

通用 Mapper4 中,原来的 tk.mybatis:mapper 项目已经拆分,1.1.1 中添加的依赖是通过特殊打包方式将所有拆分的项目合并到了一个 jar 包中。

如果需要对依赖进行详细的定制,可以分别引入下面的依赖:



  tk.mybatis
  mapper-core
  ${mapper-core.version}




  tk.mybatis
  mapper-base
  ${mapper-base.version}



  tk.mybatis
  mapper-extra
  ${mapper-extra.version}



  tk.mybatis
  mapper-weekend
  ${mapper-weekend.version}



  tk.mybatis
  mapper-generator
  ${mapper-generator.version}

通用 Mapper 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增 删改查操作以及Example相关的单表操作。为什么要用通用mapper?我们这里列举一下 原生Mybatis的痛点:
1、mapper.xml文件里有大量的sql,当数据库表字段变动,配置文件就要修改
2、需要自己实现sql分页,select * from table where . . . limit 1,3
自己手写分页,除了传参page、pageSize,还需要返回条目总数count。
3、数据库可移植性差:如果项目更换数据库,比如oracle–>mysql,mapper.xml中的 sql要重新写,因为Oracle的PLSQL 和mysql 支持的函数是不同的。 4、生成的代码量过大。
5、批量操作,批量插入,批量更新,需要自写。
而这些,通过通用mapper就可以很轻松的解决了。

通用mapper与spring集成:

集成通用 Mapper 在上面的基础上添加下面的依赖:
 

  org.mybatis
  mybatis
  版本号


  org.mybatis
  mybatis-spring
  版本号


  org.springframework
  spring-context
  版本号


  org.springframework
  spring-tx
  版本号


  org.springframework
  spring-jdbc
  版本号

###通用mapper需要集成以下的
     
    tk.mybatis  
    mapper 
    最新版本 

和通用 Mapper 以前版本一样,可以直接使用 tk.mybatis 提供 的 tk.mybatis.spring.mapper.MapperScannerConfigurer 进行配置,这个配置和 MyBatis 官方提供的 org.mybatis.spring.mapper.MapperScannerConfigurer 区别只是 第一层的包名, tk 和 org 。所以使用这种方式时,如果你项目已经使用 org. 进行了 配置,只需要改成 tk. 即可。

     
 

如果你需要对通用 Mapper 进行特殊配置,可以按下面的方式进行配置:


    
    
    
        
            参数名=值
            参数名2=值2
            ...
        
    

TKMybatis主要的方法

select

List select(T record)  根据T对象中的属性名称查询,类似于select * from table where t.name=#{name} and  t.password = #{password}

T selectOne(T record)  根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号

T selectByPrimaryKey(Object key)  根据主键查询   说明:根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条 件使用等号

int selectCount(T record);  说明:根据实体中的属性查询总数,查询条件使用等号

insert

int insert(T record);  说明:保存一个实体,null的属性也会保存,不会使用数据库默认值

int insertSelective(T record);  说明:保存一个实体,null的属性不会保存,会使用数据库默认值

update

int updateByPrimaryKey(T record);  说明:根据主键更新实体全部字段,null值会被更新

int updateByPrimaryKeySelective(T record);  说明:根据主键更新属性不为null的值

delete

int delete(T record);  说明:根据实体属性作为条件进行删除,查询条件使用等号

int deleteByPrimaryKey(Object key);  说明:根据主键字段进行删除,方法参数必须包含完整的主键属性

通用代码生成器

通用 Mapper 专用代码生成器生成的 Model 会在原有基础上增加 @Table,@Id,@Column 等注解,方便自动会数据库字段进行映射。



    org.mybatis.generator
    mybatis-generator-core
    1.3.6




    tk.mybatis
    mapper
    4.0.0





    tk.mybatis
    mapper-generator
    1.0.0

Java代码很容易,和测试中的一样:

public static void main(String[] args) throws Exception {
        List warnings = new ArrayList();
        boolean overwrite = true;
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = 
                      cp.parseConfiguration(getResourceAsStream("generatorConfig.xml"));
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
        for (String warning : warnings) {
            System.out.println(warning);
        }
    }

注意,测试中还有 startDB 等方法,这是因为测试中使用的 hsqldb 内存数据库。

这段代码容易,最主要的一个内容是"generatorConfig.xml",我们应该如何配置该类。

下面是一个generatorConfig.xml的例子:





    
        
        

        
            
            
            
            
            
        

        
        

        
        

        
        

和一般的配置相比,这里只是多了一个插件的配置:


    
    
    
    
    

这里最关键的参数就是 mappers,配置后生成的 Mapper 接口都会自动继承上改接口,如果你定义了一个自己的基础接口,例如:

package xxx.base;

import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

/**
 * 继承自己的MyMapper
 */
public interface MyMapper extends Mapper, MySqlMapper {
    //TODO
    //FIXME 特别注意,该接口不能被扫描到,否则会出错
}

在配置插件时,可以配置为:


其他参数的含义:

  • caseSensitive 是否区分大小写,默认值 false。如果数据库区分大小写,这里就需要配置为 true,这样当表名为 USER 时,会生成 @Table(name = “USER”) 注解,否则使用小写 user 时会找不到表。
  • forceAnnotation 是否强制生成注解,默认 false,如果设置为 true,不管数据库名和字段名是否一致,都会生成注解(包含 @Table 和 @Column)。
  • beginningDelimiter 和 endingDelimiter 开始和结束分隔符,对于有关键字的情况下适用。
  • useMapperCommentGenerator 是否使用通用 Mapper 提供的注释工具,默认 true 使用,这样在生成代码时会包含字段的注释(目前只有 mysql 和 oracle 支持),设置 false 后会用默认的,或者你可以配置自己的注释插件。
  • generateColumnConsts 在生成的 model中,增加字段名的常量,便于使用 Example 拼接查询条件的时候使用。
  • lombok 增加 model 代码生成时,可以直接生成 lombok 的 @Getter@Setter@ToString@Accessors(chain = true) 四类注解, 使用者在插件配置项中增加 即可生成对应包含注解的 model 类。

在上面

 

SQL 中的 {1} 代表的是对应表的大写形式,{0} 是小写形式,这个配置生成的代码会像下面这样:

public class Country {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY,
            generator = "select SEQ_COUNTRY.nextval from dual")
    private Integer id;
    // 省略其他
}

Maven中使用:


  
    maven-compiler-plugin
    
      ${jdk.version}
      ${jdk.version}
    
  
  
    org.mybatis.generator
    mybatis-generator-maven-plugin
    1.3.6
    
      
        ${basedir}/src/main/resources/generator/generatorConfig.xml
      
      true
      true
    
    
      
        mysql
        mysql-connector-java
        5.1.29
      
      
        tk.mybatis
        mapper
        4.0.0
      
    
  

在插件中配置了配置文件的路径,覆盖和输出详细日志三个参数。

除此之外需要特别注意的是 ,MBG 配置中用到的所有外部代码都必须通过依赖方式配置在这里,否则运行时会提示找不到对应的类而报错。这里有两个必须的依赖,一个是 JDBC 驱动,另一个是 Mapper 的插件。

下面看配置文件generatorConfig.xml:




    

    
        
        

        
            
            
        

        
        

        

        

        

        
        

这里和之前相差不多,只是通过 引入了外部属性文件,在 配置时,使用的属性文件中的参数。

运行

在 pom.xml 这一级目录的命令行窗口执行 mvn mybatis-generator:generate即可(前提是配置了mvn)。

更加详细的TKMybatis配置:


    
    
    
    
    
     
    
    
    
    
        
        
        
        
        
        
        
        
    
        
        
        
    
        
        
            
        
    
        
        
            
            
        
    
    
        
        
            
            
    
            
            
    
            
            
    
            
            
    
            
            
        
    
    
        
        
            
            
        
    
    
        
        
            
            
    
            
        
    
        
        
    
            
            
    
            
            
    
            
            
    
            
    
            
    
            
    
            
    
            
    
            
            
    
            
            
    
    
            
    
            
    
    
             
             
                 
                 
    
                 
    
                 
    
                 
    
                 
             
    
             
        

通用代码生成器实例:

        
            tk.mybatis
            mapper-spring-boot-starter
            2.1.5
        

        
            mysql
            mysql-connector-java
            runtime
        
        
            tk.mybatis
            mapper
            3.4.4
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
            
                org.mybatis.generator
                mybatis-generator-maven-plugin
                1.3.5
                
                    ${basedir}/src/main/resources/generator/generatorConfig.xml
                    true
                    true
                
                
                    
                        mysql
                        mysql-connector-java
                        ${mysql.version}
                    
                    
                        tk.mybatis
                        mapper
                        3.4.4
                    
                
            
        
    

在配置genratorConfig.xml,使用插件直接运行即可





    
    

    
        
        

        
        
            
        

        
        
            
        

        
        

        
        

        
        

        
        

你可能感兴趣的:(Java,从入门到放弃,工具的使用,java,spring,mybatis,tkmybatis)