Java通用Mapper UUID简单示例

#通用 Mapper UUID 简单示例

##不可回写的 UUID

通用 Mapper 中对 UUID 的用法主要提到了一种专有的写法,如下写法:

@GeneratedValue(generator = "UUID")

这种方式实现很容易理解,就是在你 insert 之前,调用 UUID 的公共方法在<bind> 标签中生成了一个值,插入到了数据库,由于这个值是临时的,并没有set到对象,因此这种方式是不支持回写的。

由于回写方式很常见,因此用这种方式很难满足要求。

而且在文档中也提到了一种可以回写的方式,由于没有提供例子,导致很多人不理解或者尝试失败,因此很早就有必要写一篇如何使用可回写 UUID 的方式(我曾经远程协助一个朋友解决过这个问题,这个朋友答应我把自己的用法写下来分享给大家,可惜食言了)。

##可回写的 UUID

最简单的可回写 UUID 方式就是像 Oracle 序列那样直接写一个返回 UUID 的 SQL 就能实现,这是第一种写法:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY,generator = "select uuid()")
private String id;

使用这种方式的时候必须注意,由于是执行 SQL,所以底层是使用<selectKey> 实现的,并且因为需要先得到 UUID 的值才能插入数据库,因此还需要配置ORDER属性,使用 Java 方式配置时,用下面的方式进行配置:

Config config = new Config();
// 其他配置
// 主键自增回写方法执行顺序,默认AFTER,可选值为(BEFORE|AFTER)
config.setOrder("BEFORE");
mapperHelper.setConfig(config);

使用 Spring 方式进行配置时如下:

<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="com.isea533.mybatis.mapper"/>
  <property name="properties">
    <value>
      mappers=tk.mybatis.mapper.common.Mapper
      ORDER=BEFORE
    </value>
  </property>
</bean>

注意是增加ORDER=BEFORE这一行,如果你还有其他配置,都可以按这种方式一行一个key=value

这么配置以后就可以正确的获取 UUID 的值了。

##任意类型的主键回写值

你可能没注意到上面 UUID 类型的主键中,id 属性的类型是String,因为select uuid() 返回的字符串,所以 Java 中的类型要和数据库类型匹配。

因此,如果你使用一个select myId() 函数返回一个自定义类型的主键值,你需要让 Java 中的类型和这个匹配。

##通用主键 SQL 配置

如果你每一个实体类中都有一个id 属性,并且配置的注解都一样,都执行同样的 SQL 去返回值。如果都去配置这个注解会很麻烦。想要解决这种重复性配置,最简单的方式就是提取基类,让使用相同方式主键策略的实体类继承同一个基类就能解决。

解决方案看这里: https://github.com/guozilanTK/base/tree/master/base-id

但是如果你需要适用不同的数据库,这种方式麻烦点的解决办法就是针对不同的数据库创建不同的基类,放在不同的项目中,但是使用相同的包名,具体应用到生产环境时使用对应数据库的基类 jar 包就可以。除此之外还有一种方式,这种方式就是使用 IDENTITY,这个参数用于配置取回主键的方式。

默认提供的IDENTITY 可选值参考文档 GenerationType.IDENTITY 。

这个参数除了这些可选值外,还可以是可以执行的 SQL,也就是说最前面的配置方式可以改为:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;

在 Java 方式中用下面的方式进行配置:

Config config = new Config();
// 其他配置
config.setIDENTITY("select uuid()");
// 主键自增回写方法执行顺序,默认AFTER,可选值为(BEFORE|AFTER)
config.setOrder("BEFORE");
mapperHelper.setConfig(config);

使用 Spring 方式进行配置时如下:

<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="com.isea533.mybatis.mapper"/>
  <property name="properties">
    <value>
      mappers=tk.mybatis.mapper.common.Mapper
      IDENTITY=select uuid()
      ORDER=BEFORE
    </value>
  </property>
</bean>

这里仍然要注意设置ORDER=BEFORE,如果你用IDENTITY 提供的那些可选参数,就不要设置(默认为AFTER),可选参数中仍然是针对的数据库支持自增的情况,那些情况仍然是插入数据库后才会有主键值,这点一定要明白!

在这种情况下,如果换了数据库,只需要修改一下配置就能解决,例如 SQL SERVER 的:

IDENTITY=select replace(newid(), '-', '')

##小结

关于 UUID 的内容就上面这些,还需要提醒一点的就是由于ORDER是一个全局的配置,所以使用时要注意保证所有主键方式都是一致的ORDER方式,主键自增的时候使用@GeneratedValue(generator = "JDBC") 这种方式通过 JDBC 接口去获取返回值更好。当然使用批量插入时,MySql 支持多主键回写,但是 SqlServer 仅能返回最后一个插入的主键,所以选择使用某种方式时,一定要有所了解,做好测试,避免数据库差异带来的问题。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • 详解MyBatis开发Dao层的两种方式(Mapper动态代理方式)

    MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上一篇博客中Dao接口实现类方法. Mapper接口开发需要遵循以下规范: (1)Mapper.xml文件中的namespace与mapper接口的类路

  • Spring Boot整合mybatis并自动生成mapper和实体实例解析

    最近一直都在学习Java,发现目前Java招聘中,mybatis出现的频率挺高的,可能是目前Java开发中使用比较多的数据库ORM框架.于是我准备研究下Spring Boot和mybatis的整合. 1.在pom.xml文件中添加下面的配置 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-

  • Mybatis MapperScannerConfigurer自动扫描Mapper接口生成代理注入到Spring的方法

    前言 Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring Mybatis在与Spring集成的时候可以配置 MapperFactoryBean来生成Mapper接口的代理. 例如: <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mappe

  • MyBatis通用Mapper实现原理及相关内容

    MyBatis通用Mapper实现原理 本文会先介绍通用 Mapper 的简单原理,然后使用最简单的代码来实现这个过程. 基本原理 通用 Mapper 提供了一些通用的方法,这些通用方法是以接口的形式提供的,例如. public interface SelectMapper<T> { /** * 根据实体中的属性值进行查询,查询条件使用等号 */ @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL

  • Spring Boot集成MyBatis实现通用Mapper的配置及使用

    什么是通用Mapper 通用Mapper就是为了解决单表增删改查,基于Mybatis的插件.开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删改查方法. 关于MyBatis,大部分人都很熟悉.MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Pla

  • 详解Mybatis通用Mapper介绍与使用

    使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQL.而且,当数据库表结构改动时,对应的所有SQL以及实体类都需要更改.这工作量和效率的影响或许就是区别增删改查程序员和真正程序员的屏障.这时,通用Mapper便应运而生-- 什么是通用Mapper 通用Mapper就是为了解决单表增删改查,基于Mybatis的插件.开发人员不需要编写SQL,不需要在DAO中增加方法,只要写好实体类,就能支持相应的增删

  • Mapper批量插入Oracle数据@InsertProvider注解

    Mapper: @Mapper @OracleRepository public interface OracleRadiusMapper{ @InsertProvider(type = OracleRadiusProvider.class , method = "insertRadiusDataBatch") int insertRadiusDataBatch(@Param("list")List<AcctInfo> acctInfoList); }

  • 浅谈MyBatis通用Mapper实现原理

    本文会先介绍通用 Mapper 的简单原理,然后使用最简单的代码来实现这个过程. 基本原理 通用 Mapper 提供了一些通用的方法,这些通用方法是以接口的形式提供的,例如. public interface SelectMapper<T> { /** * 根据实体中的属性值进行查询,查询条件使用等号 */ @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL") List<T>

  • MyBatis-Plus通过插件将数据库表生成Entiry,Mapper.xml,Mapper.class的方式

    创建maven项目,修改pom.xml文件,如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mave

  • MyBatis直接执行SQL的工具SqlMapper

    可能有些人也有过类似需求,一般都会选择使用其他的方式如Spring-JDBC等方式解决. 能否通过MyBatis实现这样的功能呢? 为了让通用Mapper更彻底的支持多表操作以及更灵活的操作,在2.2.0版本增加了一个可以直接执行SQL的新类SqlMapper. 我们来了解一下SqlMapper. SqlMapper提供的方法 SqlMapper提供了以下这些公共方法: Map<String,Object> selectOne(String sql) Map<String,Object&

随机推荐