Mybatis中的java.io.NotSerializableException

在学习Mybatis中,用JUnit运行了一个测试方法,出现了如下错误:

org.apache.ibatis.cache.CacheException: Error serializing object.  Cause: java.io.NotSerializableException: com.lilu.mybatis.po.User
运行的测试方法如下:

@Test
	public void testFindUserByHashmap() {
		//获取session
		SqlSession session = sqlSessionFactory.openSession();
		//获限mapper接口实例
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//构造查询条件Hashmap对象
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("id", 4);
		map.put("username", "xiao");
		
		//传递Hashmap对象查询用户列表
		List<User> list;
		try {
			list = userMapper.findUserByHashmap(map);
			for (User user : list) {
				System.out.println(user);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			//关闭session
			session.close();
		}
	}
usermapper.xml中的sql语句:

<select id="findUserByHashmap" parameterType="Hashmap" resultType="com.lilu.mybatis.po.User">
	   select * from user where id=#{id} and username like '%${username}%'
  </select>
看异常发现说com.lilu.mybatis.po.User这个实体类没有序列化,然后我在User类中加上implements Serializable再运行一次就不报错了。

public class User implements Serializable{

	public User() {
		// TODO Auto-generated constructor stub
	}....}
14:47:33,232 DEBUG org.apache.ibatis.logging.LogFactory:135 - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
14:47:33,385 DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource:316 - PooledDataSource forcefully closed/removed all connections.
14:47:33,385 DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource:316 - PooledDataSource forcefully closed/removed all connections.
14:47:33,386 DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource:316 - PooledDataSource forcefully closed/removed all connections.
14:47:33,386 DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource:316 - PooledDataSource forcefully closed/removed all connections.
14:47:33,577 DEBUG com.lilu.mybatis.mapper.UserMapper:62 - Cache Hit Ratio [com.lilu.mybatis.mapper.UserMapper]: 0.0
14:47:33,586 DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction:136 - Opening JDBC Connection
14:47:33,938 DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource:387 - Created connection 22756955.
14:47:33,939 DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction:100 - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@15b3e5b]
14:47:33,942 DEBUG com.lilu.mybatis.mapper.UserMapper.findUserByHashmap:159 - ==>  Preparing: select * from user where id=? and username like '%xiao%' 
14:47:33,992 DEBUG com.lilu.mybatis.mapper.UserMapper.findUserByHashmap:159 - ==> Parameters: 4(Integer)
14:47:34,024 DEBUG com.lilu.mybatis.mapper.UserMapper.findUserByHashmap:159 - <==      Total: 1
User [id=4,username=xiaojun,sex=1,birthday=Tue Sep 26 00:00:00 CST 2017,address=天津市,toString=com.lilu.mybatis.po.User@dbd940d]
14:47:34,059 DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction:122 - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@15b3e5b]
14:47:34,060 DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction:90 - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@15b3e5b]
14:47:34,061 DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource:344 - Returned connection 22756955 to pool.
上面是正常运行的结果,运行后还有数据库连接的释放资源,运行其他测试方法的时候都没有。

如果报序列化的错误就去找报错的类是否序列化,这个类引用的类是否序列化,如果一个父类序列化了,那么它的子类不需要implements Serializable也序列化了。

然后什么是序列化,为什么要序列化呢?

这个大大写的很详细:点击打开链接


  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MyBatis,当你在查询条件将`java.util.Date`类型的属性与`java.lang.String`类型的属性进行比较时,可能会出现报错信息"invalid comparison: java.util.Date and java.lang.String"。这是因为在比较过程MyBatis无法将`java.util.Date`类型的属性与`java.lang.String`类型的属性进行正确的比较。 为了解决这个问题,你可以使用MyBatis提供的类型处理器来处理`java.util.Date`类型的属性。类型处理器可以将`java.util.Date`类型的属性转换为数据库的日期类型,以便正确比较。 以下是一个示例,展示了如何在MyBatis使用类型处理器来解决`java.util.Date`和`java.lang.String`比较的问题: 1. 首先,在你的MyBatis配置文件,添加类型处理器的配置: ```xml <typeHandlers> <typeHandler handler="org.apache.ibatis.type.DateTypeHandler" /> </typeHandlers> ``` 2. 然后,在你的Mapper接口,将`java.util.Date`类型的属性与`java.lang.String`类型的属性进行比较: ```xml <select id="selectByDateAndString" parameterType="map" resultType="YourResultType"> SELECT * FROM your_table WHERE date_column = #{dateProperty, jdbcType=DATE} AND string_column = #{stringProperty, jdbcType=VARCHAR} </select> ``` 在上面的示例,`date_column`是数据库表的日期类型列,`string_column`是数据库表的字符串类型列。`dateProperty`和`stringProperty`是你传入的参数,分别对应`java.util.Date`类型的属性和`java.lang.String`类型的属性。 通过使用类型处理器和正确设置jdbcType,你可以避免在MyBatis比较`java.util.Date`和`java.lang.String`类型时出现报错。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值