#通用 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 仅能返回最后一个插入的主键,所以选择使用某种方式时,一定要有所了解,做好测试,避免数据库差异带来的问题。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。如果你想了解更多相关内容请查看下面相关链接
本文向大家介绍Java 实现简单Socket 通信的示例,包括了Java 实现简单Socket 通信的示例的使用技巧和注意事项,需要的朋友参考一下 Java socket 封装了传输层的实现细节,开发人员可以基于 socket 实现应用层。本文介绍了 Java socket 简单用法。 1. 传输层协议 传输层包含了两种协议,分别是 TCP (Transmission Control Protoc
本文向大家介绍common-lisp简单引用示例,包括了common-lisp简单引用示例的使用技巧和注意事项,需要的朋友参考一下 示例 Quote是一种特殊的运算符,可防止评估其参数。它返回其参数,未被评估。
我用泽西岛写了一个非常简单的例子。我从泽西岛网站下载了最新的jar文件到WEB-INF的lib文件夹中。我的课程和在下面。 当我提供URL我得到。 然而,当我使用Maven时,它是有效的。我用的是Eclipse开普勒,Glassfish 4服务器,Java 7。 非Maven版本我做错了什么? 谢谢。 类: Web.xml:
问题内容: 如何在Android的通知栏中显示简单的通知?请帮助我提供最简单的解决方案。 问题答案: 我假设您是在Notificationbar中询问通知。如果是这样,请尝试以下代码,
本文向大家介绍nodeJS模块简单用法示例,包括了nodeJS模块简单用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了nodeJS模块简单用法。分享给大家供大家参考,具体如下: 1.定义Student模块,Teacher模块 2.定义kclass模块 3.定义启动模块 index.js 运行结果: 希望本文所述对大家nodejs程序设计有所帮助。
本文向大家介绍Yii2中DropDownList简单用法示例,包括了Yii2中DropDownList简单用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Yii2中DropDownList简单用法。分享给大家供大家参考,具体如下: 这里以实际应用为例讲解Yii2 DropDownList用法。 有一张分类表,无限极分类那种,表结构如下,pid就是父分类ID 这里我们要实现: 新建分