目录
运行时发现 xxx cannot be cast to xxx
无论是Mybatis在预处理语句(PreparedStatement)中设置一个参数是,还是从结果集中取出一个值式都会用类型处理器将获取的值以合适的方式转换成java类型,下表描述一些默认的类型处理器(部分)

可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。
具体做法为:实现org.apache.ibatis.type.TypeHandler接口,或继承一个很便利的类org.apache.ibatis.type.BaseTypeHandler,然后可以选择性地将它映射到一个JDBC类型。
例如需求:一个Java中的Date数据类型,我想将之存到数据库的时候存成一个1970年至今的毫秒数,取出来时转换成java的Date,即java的Date与数据库的varchar毫秒值之间转换

①定义BaseTypeHandler类下和覆盖四个没实现的方法
-
-
- public class DateHandler extends BaseTypeHandler
{ - //将java类型转换成数据库需要的类型
- public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
- long time = date.getTime();
- preparedStatement.setLong(i,time);
-
- }
-
- //将数据库中的类型转换成java类型
- //String参数 要转换的字段名称
- //ResultSet 查询出的结果集
- @Override
- public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
- //获得结果集中需要的数据(long)转换成Date类型 返回
- long aLong = resultSet.getLong(s);
- Date date =new Date(aLong);
- return date;
- }
- //将数据库中的类型转换成java类型
- @Override
- public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
- long aLong = resultSet.getLong(i);
- Date date =new Date(aLong);
- return date;
- }
- //将数据库中的类型转换成java类型
- @Override
- public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
- long aLong = callableStatement.getLong(i);
- Date date =new Date(aLong);
- return date;
- }
- }
UserMapper接口下
- package com_mybatis_config.mapper;
-
-
- import com_mybatis_config.pojo.User;
-
- public interface UserMapper {
- public void save(User user);
-
- }
-
user类下一些
- package com_mybatis_config.pojo;
-
-
- import java.util.Date;
-
- public class User {
- private int id;
- private String username;
- private String password;
- private Date birthday;
- }
- //和一些getset方法toString
MybatisTest类下
- public class MybatisTest {
- @Test
- public void test1() throws IOException {
- InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
- SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);
- SqlSession sqlSession = sqlSessionFactory.openSession(true);
-
- UserMapper mapper = sqlSession.getMapper(UserMapper.class);
- //创建user
- User user=new User();
- user.setBirthday(new Date());
- user.setPassword("kckc");
- user.setUsername("ssm");
-
-
-
- //执行操作
- mapper.save(user);
- sqlSession.close();
-
- }
- }
UserMapper_config.xml下
- "1.0" encoding="UTF-8" ?>
- mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com_mybatis_config.mapper.UserMapper">
-
- <insert id="save" parameterType="user">
- insert into user values(#{id},#{username},#{password},#{birthday})
-
- insert>
-
-
-
- mapper>
sqlMapCongif中加上

运行结果


之前在弄的时候因为省时间,将建包代替了建模块,重复利用了之前的配置导致的,这里我检查了好久才发现实在sqlMapConfig.xml中起别名的时候,将之前的包名字重复用了,所以报出不能强行转换

改回来就正常显示了
查询出来取出来可以正常显示
通过在接口类中定义接口,然后在UserMapper_config.xml中进行配置
- <select id="findById" parameterType="int" resultType="user">
- select *from user where id=#{id}
- select>
- @Test
- public void test2() throws IOException {
- InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
- SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);
- SqlSession sqlSession = sqlSessionFactory.openSession(true);
-
- UserMapper mapper = sqlSession.getMapper(UserMapper.class);
-
- User byId = mapper.findById(5);
- System.out.println("id为5的生日是"+byId.getBirthday());
-
- sqlSession.close();
-
- }
运行结果

MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可过得分页的相关数据
①导入通用PageHelper的坐标
②在mybatis核心配置文件中配置PageHelper插件
③测试分页数据获取
导入PageHelper的坐标
- dependency>
- <groupId>com.github.pagehelpergroupId>
- <artifactId>pagehelperartifactId>
- <version>3.7.5version>
- dependency>
-
- <dependency>
- <groupId>com.github.jsqlparsergroupId>
- <artifactId>jsqlparserartifactId>
- <version>0.9.1version>
- dependency>
②在mysql的核心配置文件中配置PageHelper插件(这里为sqlMapConfig.xml)
- 配置分页助手插件-->
- <plugins>
- <plugin interceptor="com.github.pagehelper.PageHelper">
- <property name="dialect" value="mysql"/>
- plugin>
- plugins>
测试
- @Test
- public void test3() throws IOException {
- InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
- SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
- SqlSession sqlSession = sqlSessionFactory.openSession(true);
-
- UserMapper mapper = sqlSession.getMapper(UserMapper.class);
-
- //设置分页相关参数 当前页+每页显示的条数
- PageHelper.startPage(1, 3);
- List
userList = mapper.findAll(); - for (User user : userList) {
- System.out.println(user);
- }
-
-
- //执行操作
- sqlSession.close();
- }
-

-
-
- //设置分页相关参数 当前页+每页显示的条数
- PageHelper.startPage(1, 3);
- List
userList = mapper.findAll(); - for (User user : userList) {
- System.out.println(user);
- }
-
- //获得与分页相关的参数
- PageInfo
pageInfo =new PageInfo(userList); - System.out.println("当前页:"+pageInfo.getPageNum());
- System.out.println("上一页:"+pageInfo.getPrePage());
- System.out.println("下一页:"+pageInfo.getNextPage());
- System.out.println("每页显示条数:"+pageInfo.getPageSize());
- System.out.println("总条数:"+pageInfo.getTotal());
- System.out.println("总页数:"+pageInfo.getPages());
- System.out.println("是否是第一页:"+pageInfo.isIsFirstPage());
- System.out.println("是否是最后一页:"+pageInfo.isIsLastPage());
-
- //执行操作
- sqlSession.close();
- }
-
-
运行结果

properties标签:该标签可以加载外部的properties文件
typeAliases标签:设置类型别名
environments标签:数据源环境配置标签
typeHandlers标签:配置自定义类型处理器
plugins标签:配置MyBatis的插件