目录
1.typeHandler标签
无论是MyBatis在预处理语句(PrepareedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成java类型。
类型处理器 | Java类型 | JDBC类型 |
BooleanTypeHandler | java.lang.Boolean.boolean | 数据库兼容的BOOLEAN |
ByteTypeHandler | java.lang.Byte.byte | 数据库兼容的NUMERIC或BYTE |
ShortTypeHandler | java.lang.Short.short | 数据库兼容的NUMERIC或SHORT INTEGER |
IntegerTypeHandler | java.lang.Integer.int | 数据库兼容的NUMERIC或INTEGER |
LongTypeHandler | java.lang.Long.long | 数据库兼容的NUMERIC或LONG INTEGER |
重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类型,具体做法为:实现org.apache.ibatis.type.TypeHandler接口,或继承一个很便利的类org.apache.ibatis.type.BaseTypeHandler,然后可以选择性的将它映射到一个JDBC类型。例如需求:一个java中的Date数据类型,我想要将之存到数据库的时候存成一个1970年至今的毫秒数,取出来时转换成java的Date,即java的Date与数据库中的varchar毫秒值之间的转换。
开发步骤为:
- 定义转换类型类BaseTypeHandler<T>
- 覆盖4个未实现的方法,其中setNonNullParameter为java程序设置数据到数据库的回调方法,getNullableResult为查询时mysql的字符串类型转换成java的Type类型的方法
- 在MyBatis核心配置文件中进行注册
- 测试转换是否正确
package com.caoyan.handler;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
public class DateTypeHandler extends BaseTypeHandler<Date> {
// 将数据库中类型 转换成java类型
// String参数 要转换的字段名称
// ResultSet 查询出的结果集
@Override
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
// 获得结果集中需要的数据(long) 转换成Date类型 返回
Long long1 = resultSet.getLong(s);
Date date = new Date(long1);
return date;
}
// 将数据库中类型 转换成java类型
@Override
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
Long long1 = resultSet.getLong(i);
Date date = new Date(long1);
return date;
}
// 将数据库中类型 转换成java类型
@Override
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
Long long1 = callableStatement.getLong(i);
Date date = new Date(long1);
return date;
}
// 将java类型转换为数据库需要的类型
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType)
throws SQLException {
long time = date.getTime();
preparedStatement.setLong(i, time);
}
}
在sqlMapConfig.xml中配置类型处理器。
<!-- 注册类型处理器 -->
<typeHandlers>
<typeHandler handler="com.caoyan.handler.DateTypeHandler" />
</typeHandlers>
package com.caoyan.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import com.caoyan.domain.User;
import com.caoyan.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
public class MapperTest {
@Test
public void test1() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 创建user
User user = new User();
user.setUsername("ceshi");
user.setPassword("abc");
user.setBirthday(new Date());
// 执行保存操作
userMapper.save(user);
sqlSession.commit();
sqlSession.close();
}
@Test
public void test2() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findById(8);
System.out.println("user中的birthday:" + user.getBirthday());
sqlSession.commit();
sqlSession.close();
}
}
2.plugins标签
MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据。开发步骤如下:
- 导入通用PageHelper的坐标
<!-- 分页助手 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>4.4</version>
</dependency>
- 在mybatis核心配置文件中配置PageHelper插件
<!-- 版本5.0以下配置分页助手插件 -->
<!-- <plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql" />
</plugin>
</plugins> -->
<!-- 版本5.0以上配置分页助手插件 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
- 测试分页数据获取
@Test
public void test3() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 设置分页相关参数,当前页+每页显示的条数
PageHelper.startPage(2, 3);
List<User> userList = userMapper.findAll();
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
3.知识小结
MyBatis核心配置文件常用标签:
- properties标签:该标签可以加载外部的properties文件
- typeAlias标签:设置类型别名
- environments标签:数据源环境配置标签
- typeHandlers标签:配置自定义类型处理器
- plugins标签:配置MyBatis的插件