之前在a_28_0学了核心配置文件的简单配置,这节课将深入学习MyBatis的核心配置文件 学这节课之前,请你保证已经对上节课映射文件的学习已经掌握,并且上节课的环境你是已经通过测试的,这节课将继续使用上节课的环境 请你保证已经对上节课dao层的代理开发方式很熟悉,因为这节课我们写接口不写对应的实现类,也就是使用代理开发方式简化掉实现类 并且还要熟悉前面a_27学的增删改查

 

typeHandlers标签

 

无论是MyBatis在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成Java类型。 简单说就是java中的数据类型,跟数据库中的数据类型是不同的,两者其实是会经过中间者,将这两者的数据类型互相转换,中间者就是类型处理器 下表描述了一些默认的类型处理器

类型处理器Java类型JDBC类型
BooleanTypeHandlerjava.lang.Boolean,boolean数据库兼容的BOOLEAN
ByteTypeHandlerjava.lang.Byte,byte数据库兼容的NUMERIC或BYTE
ShortTypeHandlerjava.lang.Short,short数据库兼容的NUMERIC或SHORT INTEGER
IntegerTypeHandlerjava.lang.Integer,int数据库兼容的NUMERIC或INTEGER
LongTypeHandlerjava.lang.long,long数据库兼容的NUMERIC或LONG INTEGER

 

MyBatis提供的类型处理器是有限的,如果无法满足我们我们要将java中的某种类型解析转换成JDBC类型时,此时就需要我们自定义类型处理器。 你可以重写类型处理器或创建你自己的类型处理器,来解决MyBatis提供的类型处理器无法转换的指定类型。具体做法如下 具体做法: 实现org.apache.ibatis.type.TypeHandler接口,或继承一个很便利的类org.apache.ibatis.type.BaseTypeHandler,然后可以选择性地将java类型映射到JDBC类型上

 

例如需求: 一个Java中的Data数据类型,如何将该数据存到数据库的时候,在数据库存成一个1970年至今的毫秒数,从数据库取出来时就转换为java的Date类型。简单来说 就是java的Date数据类型,与数据库vachar数据类型的毫秒值之间转换

 

需求实现步骤:

1、定义转换类继承类BaseTypeHandler

2、覆盖4个未实现的方法,其中setNonNullParameter为java程序设置数据到数据库的回调方法,getNullableResult为查询时mysql的字符串类型转换成java中的Type类型的方法

3、在MyBatis核心配置文件中进行注册

4、测试转换是否正确

该需求的难点: 默认的类型处理器无法处理日期对象转换成JDBC类型的长整型,只能将java的Date类型转换为JDBC的Date类型 该需求的解决: 需要自定义类型处理器,将时间转换成毫秒值,然后再插入到数据库中 这个需求会在下面具体演示,首先就是搭建环境,如下

 

typeHandlers标签 -- typeHandler测试环境搭建

 

具体操作如下

 

第一步: 确保数据库的test库里面有user表,并且表内是如下数据

 

第二步: 在src/main/java目录下,右键java,新建com.huanf.domain.User类,写入如下

 

第三步: 在src/main/java目录下,右键java,新建com.huanf.mapper.UserMapper接口,写入如下

 

第四步: 在src/main/resources目录下新建jdbc.properties文件,写入如下

 

第五步: 在src/main/resources目录下新建log4j.properties文件,写入如下

 

第六步: 在src/main/resources目录下新建sqlMapConfig.xml文件,写入如下

 

第七步: 在src/main/resources目录下新建com/huanf/mapper目录,里面新建UserMapper.xml文件,写入如下

 

第八步: 在src/test/java目录新建com.huanf.test.MapperTest类,写入如下

 

第九步: 在pom.xml写入如下

 

第十步: 在MapperTest类运行测试,由于我们搭建的是测试环境,所以此时运行是报错的

原因: 默认的类型处理器无法处理日期对象转换成JDBC类型的长整型,只能将java的Date类型转换为JDBC的Date类型 下面会进行解决: 需要自定义类型处理器,将时间转换成毫秒值,然后再插入到数据库中

 

typeHandlers标签 -- 自定义DateTypeHandler实现 -- 把当前时间以毫秒值存入数据库

 

需求实现步骤:

1、定义转换类继承类BaseTypeHandler

2、覆盖4个未实现的方法,其中setNonNullParameter为java程序设置数据到数据库的回调方法,getNullableResult为查询时mysql的字符串类型转换成java中的Type类型的方法

3、在MyBatis核心配置文件中进行注册

4、测试转换是否正确

 

具体操作:

 

第一步: 在src/main/java/com.huanf目录下新建handler.DateTypeHandler类,写入如下

 

第二步: 在sqlMapConfig里面添加如下

 

第三步: 在MyBatisTest类测试test1,然后去数据库查看数据是否插入

 

获取数据库的毫秒值时间,要求输出标准格式的时间在控制台

 

第一步: 在UserMapper.xml里面添加如下

 

第二步: 在UserMapper接口添加如下

 

第三步: 在MyBatisTest类添加如下,并运行测试test2

 

plugins标签

 

MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据

 

开发步骤:

1、导入通用PageHelper的坐标

2、在mybatis核心配置文件中配置PageHelper插件

3、测试分页数据获取

 

具体步骤:

 

第一步: 在pom.xml添加如下

 

第二步: 在UserMapper接口添加如下

 

第三步: 在sqlMapConfig.xml添加如下

 

第四步: 在UserMapper.xml添加如下

 

第五步: 在MyBatisTest类添加如下,并执行测试test3

 

plugins标签 -- 分页相关数据获取

 

上面的分页查询虽然实现了功能,但是还存在问题: 如何根据当前查询出来的数据确定当前也是第几页,当前页的上下页是谁,是否是最后一页。这些参数都是还没实现的 其实实现很简单,只需要改测试代码即可

 

具体操作:

在MyBatisTest类把test3()修改为如下,并执行测试test3()