ssm中mybatis处理数据库(mysql)与pojo属性中类型不一致(string转date)

        一般在表设计的时候会考虑到数据库字段类型和java中属性一致的问题,但是也有可能会出现一些情况导致类型不一致的问题,比如:二次开发中需求更改等。此时数据库和java中的代码不能随便更改,所以考虑的思路是通过typeHandler作为中间体来把类型转换。

        当然,如果可以直接在获取字段后,直接通过simpleFormart来转换后,来处理数据就可以了。

        此方法是在获取不了字段的情况下进行的。

数据库中类型:varchar

java的pojo属性:Date


实现类型转换功能其实就是三步:

一.定义一个转换工具类进行自己需要类型的转换(比如在工具包中新建一个TypeHandlerToString类,继承 BaseTypeHandler或者实现 TypeHandler 接口)
二.注册刚定义的转换工具类,使它可以起作用
三.在UserMapper.xml文件中给出要用哪个TypeHandler


第一:添加一个工具类来定义转换的类型

a.在工具类包中定义一个工具类,如:TypeHandlerToString  继承 BaseTypeHandler,泛型选择要java的pojo需要的类型:Date

b.重写相应的四个方法(一个set,三个get---get方法只是参数不一样)

一个set方法

	@Override
	public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
		ps.setString(i,simpleDateFormat.format(parameter));
		
	}
三个get方法
	@Override
	public Date getNullableResult(ResultSet rs, String columnIndex) throws SQLException {
		String varchartime = rs.getString(columnIndex);
		if(varchartime != null){
			return new Date(Long.parseLong(varchartime));
		}
		else return null;
	}

	@Override
	public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
		String varchartime = rs.getString(columnIndex);
		if(varchartime != null){
			return new Date(Long.parseLong(varchartime));
		}
		else return null;
	}

	@Override
	public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
		String varchartime = cs.getString(columnIndex);
		if(varchartime != null){
			return new Date(Long.parseLong(varchartime));
		}
		else return null;
	}
至此,自定义的转换工具类已经完成
注意:如果是实现接口的话,在重写的set方法中需要处理下parameter为null的情况


第二:在mybatis-config.xml文件中注册,添加typeHandler组件,包含了handler,jdbcType,javaType


注册可以两种方式:在实现类上添加注解 或 在mybatis-config.xml添加标签



  	
     
	
其中

handler:自己定义的转换工具类来映射,如:cn.lung.flower.utils.TypeHandlerToString,这个属性是一定要有的

jdbcType:数据库中字段的类型,如:varchar

javaType:java中的属性,如:Date

此处需要注意:java的pojo类的date类型一定要是java.util.Date,如果是java.sql.Date的数据会出现错误。而在mybatis-config.xml文件中的类型mybatis-config.xml文件中的类型也可以是java.sql.Date,但是最好和pojo一致。

至此,类型的转换功能已经可以使用了

-----------------------------------------------------------------------------------------------
扩展一下:

在注册的时候,可以分为多种情况(拿注解举例子):

        只添加@MappedJdbcTypes注解,不添加@MappedTypes  :   个人测试,显示的数据和数据库中不一致

        只添加@MappedTypes注解,不添加@MappedJdbcTypes  :   个人测试,数据一致

        两种注解都不添加           :   个人测试,数据一致

在mybatis-config.xml文件中添加或者不添加 jdbcType,javaType 属性,和注解的情况是一样的

它内部是如何匹配到的在这就不详细解释了,这个链接有详细分析:http://blog.csdn.net/a1258531/article/details/51822875

-----------------------------------------------------------------------------------------------

第三:在UserMapper.xml文件的resultMap组件中添加 javaType+jdbcType或者 typeHandler ,可以匹配到之前定义的转换工具类

这一步会涉及到mybatis内部是如何找到转换类的(如果是string和data类型之间的转换,整个第三步都可以不要。如果是,如:String<---->varchar的话,需要下面的操作)
如果注册时    只添加@MappedTypes注解,不添加@MappedJdbcType   对应的UserMapper文件中resultMap就只添加javaType,

	
一句话,注册时添加了什么,就要在使用时指定什么,这样mybatis才能匹配上

或者是用typeHandler代替,直接指定实现类,如下:

	

所以最简单的做法是:

自定义的实现类继承BaseTypeHandler +mytis-config.xml文件组件只添加handler属性 + UserMapper.xml文件resultMap字段用typeHandler

测试一下:

写一个User类,定义一个类型为java.util.Date的属性date,重写toString(),加入SimpleDateFormat,指定格式

    SimpleDateFormat s = new SimpleDateFormat("yyyy/MM/dd/ HH:mm:ss");

   @Override
    public String toString() {
        return " date="  s.format(date) ;
    }
随便找一个地方调用user对象,打印出来,结果:

注意一个基本问题:格式设置时要和数据库的格式一样,比如:数据库精确到秒,则java端也要精确到秒,否则数据丢失



LG

你可能感兴趣的:(ssm)