Java通用Mapper UUID简单示例

时间:2022-02-10 04:00:43

#通用 mapper uuid 简单示例

##不可回写的 uuid

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

?
1
@generatedvalue(generator = "uuid")

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

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

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

##可回写的 uuid

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

?
1
2
3
@id
@generatedvalue(strategy = generationtype.identity,generator = "select uuid()")
private string id;

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

?
1
2
3
4
5
config config = new config();
// 其他配置
// 主键自增回写方法执行顺序,默认after,可选值为(before|after)
config.setorder("before");
mapperhelper.setconfig(config);

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

?
1
2
3
4
5
6
7
8
9
<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,也就是说最前面的配置方式可以改为:

?
1
2
3
@id
@generatedvalue(strategy = generationtype.identity)
private string id;

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

?
1
2
3
4
5
6
config config = new config();
// 其他配置
config.setidentity("select uuid()");
// 主键自增回写方法执行顺序,默认after,可选值为(before|after)
config.setorder("before");
mapperhelper.setconfig(config);

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

?
1
2
3
4
5
6
7
8
9
10
<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 的:

?
1
identity=select replace(newid(), '-', '')

##小结

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

总结

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

原文链接:https://blog.csdn.net/isea533/article/details/53011890