一.typeHandler(类型处理器)
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型。Mybatis默认为我们实现了许多TypeHandler, 当我们没有配置指定TypeHandler时,Mybatis会根据参数或者返回结果的不同,默认为我们选择合适的TypeHandler处理。
将数据库的类型以合适的方式与java的类型适配
例如IntegerTypeHandler对应java.lang.Integer,int
对应转换数据库兼容的NUMERIC 或 INTEGER
将Data转换为long类型例子
1.编写类继承BaseTypeHandler类,重写父类方法
or 实现org.apache.ibatis.type.TypeHandler接口
public class DateTypeHandler extends BaseTypeHandler<Date> {
//将java类型转换为成数据库需要的类型 i是参数的位置
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Date date, JdbcType jdbcType) throws SQLException {
long time = date.getTime();
ps.setLong(i,time);
}
//将数据库中的某些数据的类型转换成java类型
//String参数 要转换的字段名称
/**
*
* @param rs 查询出的结果集
* @param columnName 要转换的字段的名称
*
*/
@Override
public Date getNullableResult(ResultSet rs, String columnName) throws SQLException {
//获得结果集中需要的数据(long)转换成data类型 返回
long aLong = rs.getLong(columnName);
Date date=new Date(aLong);
return date;
}
//将数据库中的某些数据的类型转换成java类型
@Override
public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
//获得结果集中需要的数据(long)转换成data类型 返回
long aLong = rs.getLong(columnIndex);
Date date=new Date(aLong);
return date;
}
//将数据库中的某些数据的类型转换成java类型
@Override
public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
long aLong = cs.getLong(columnIndex);
Date date=new Date(aLong);
return date;
}
}
2.核心配置文件(有顺序注意顺序)
<!--自定义注册类型处理器-->
<typeHandlers>
<typeHandler handler="com.itheima.handler.DateTypeHandler"/>
</typeHandlers>
3.测试类
@Test
public void test1() throws IOException {
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作 参数:namespace + id
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user=new User();
user.setUsername("zhaoliu");
user.setPassword("123");
user.setBirthday(new Date());
mapper.save(user);
sqlSession.commit();
//释放资源
sqlSession.close();
}
@Test
public void test2() throws IOException {
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作 参数:namespace + id
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User u = mapper.findById(9);
System.out.println(u.getBirthday());
//释放资源
sqlSession.close();
}
二.plugins标签(分页插件例子)
1.导入通用PageHelper的坐标
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>3.7.5</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>0.9.1</version>
</dependency>
2.在mybatis核心配置文件中配置PageHelper插件
<!--配置分页助手插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<!--指定方言 例如oracle是rownum mysql是Limit-->
<property name="dialect" value="mysql"/>
</plugin>
</plugins>
3.测试分页数据获取
@Test
public void test3() throws IOException {
//获得核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
//获得session工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//获得session会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行操作 参数:namespace + id
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 设置分页相关参数 当前页 每页显示的条数
PageHelper.startPage(1,3);//第一页,每页三条
List<User> all = mapper.findAll();
for (User user : all) {
System.out.println(user);
}
//获得与分页相关的参数
PageInfo<User> pageInfo=new PageInfo<User>(all);
System.out.println("当前页:"+pageInfo.getPageNum());
System.out.println("每页显示条数:"+pageInfo.getPageSize());
System.out.println("总条数:"+pageInfo.getSize());
System.out.println("总页数:"+pageInfo.getPages());
System.out.println("上一页:"+pageInfo.getPrePage());
System.out.println("下一页:"+pageInfo.getNextPage());
System.out.println("是否是第一页:"+pageInfo.isIsFirstPage());
System.out.println("是否是最后一页:"+pageInfo.isIsLastPage());
//释放资源
sqlSession.close();
}