网上的解决方法是在java实体类中使用string类型,读取的时候转换成字符串,插入的时候转uuid。
查询的时候这样子转换
<id column="application_id" property="applicationId" javaType="java.lang.String" jdbcType="VARCHAR" />
插入的时候
<insert id="insert" parameterType="le.center.repository.ApplicationMapper">
insert into app(application_id) values (#{applicationId}::uuid);
</insert>
我自己的解决方案是在SessionFactory里面添加一个类型转换
<bean name="UUIDTypeHandler" class="le.center.common.UUIDTypeHandler" ></bean>
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"/>
<property name="typeHandlers">
<list>
<ref bean="UUIDTypeHandler" />
</list>
</property>
<!-- 配置Mybatis的全局配置文件 -->
<property name="configLocation" value="classpath:mybatis/config/mybatis-config.xml"/>
<!-- 配置mapper.xml文件 -->
UUIDTypeHandler 代码如下
public class UUIDTypeHandler extends BaseTypeHandler<java.util.UUID> {
@Override
public UUID getNullableResult(ResultSet arg0, String arg1)
throws SQLException {
String vStr = arg0.getString(arg1);
return getValue(vStr);
}
@Override
public UUID getNullableResult(ResultSet arg0, int arg1) throws SQLException {
String vStr = arg0.getString(arg1);
return getValue(vStr);
}
@Override
public UUID getNullableResult(CallableStatement arg0, int arg1)
throws SQLException {
String vStr = arg0.getString(arg1);
return getValue(vStr);
}
@Override
public void setNonNullParameter(PreparedStatement arg0, int arg1,
UUID arg2, JdbcType arg3) throws SQLException {
if(null != arg2){
arg0.setObject(arg1, arg2);
}
}
private UUID getValue(String vStr){
if(notNull(vStr)){
return UUID.fromString(vStr);
}
return null;
}
private boolean notNull(String arg1){
return (null != arg1 && !"".equals(arg1));
}
}
然后插入 读取都不需要你写过多的代码,自身的实体类里面写UUID类型,mybatis读写的时候 会自动处理。
读的配置
<id column="application_id" property="applicationId" />
插入的配置
<insert id="insert" parameterType="le.center.repository.ApplicationMapper">
insert into app(application_id) values (#{applicationId});
</insert>
另外用mybatis-generator:generate 命令生成代码会将UUID生成为object 类型,可以继承JavaTypeResolverDefaultImpl 类
暂时的将object 定义为UUID 生成。这也是没办法的,java.sql.Types里面不能识别UUID 将其归类到了OTHER 类型里面。
public class LeTypeResolverImpl extends JavaTypeResolverDefaultImpl{
public LeTypeResolverImpl() {
super();
this.forceBigDecimals=false;
typeMap.put(Types.OTHER, new JdbcTypeInformation("OTHER", //$NON-NLS-1$
new FullyQualifiedJavaType(UUID.class.getName())));
}
}
generatorConfig.xml 配置
<javaTypeResolver type="le.center.common.LeTypeResolverImpl" >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
想用命令自己改mybatis-generator-core 包,或者自己写代码执行MyBatisGenerator里面的generate 方法