在学习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也序列化了。
然后什么是序列化,为什么要序列化呢?
这个大大写的很详细:点击打开链接