mybatis 中使用postgreSQL的UUID 解决方法

网上的解决方法是在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 方法



猜你喜欢

转载自blog.csdn.net/wangzhi291/article/details/80103013