mybatis 中使用postgreSQL的UUID 解决方法

网上的解决方法是在java实体类中使用string类型,读取的时候转换成字符串,插入的时候转uuid。

查询的时候这样子转换

插入的时候


	insert into app(application_id) values (#{applicationId}::uuid);	
	

 我自己的解决方案是在SessionFactory里面添加一个类型转换

  

        
        
        
				
					
				
			
        
        
        

UUIDTypeHandler 代码如下

public class UUIDTypeHandler extends BaseTypeHandler {

	
	@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读写的时候 会自动处理。

读的配置

	

插入的配置


	insert into app(application_id) values (#{applicationId});	
	


另外用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 配置

 
      
    

想用命令自己改mybatis-generator-core 包,或者自己写代码执行MyBatisGenerator里面的generate 方法



你可能感兴趣的:(java)