二、Mybatis核心配置文件概述与标签
1.1 Mybatis核心配置文件层级关系
1.2 environments标签
数据库环境的配置,支持多环境配置
其中,事务管理器(transactionManager)类型有两种:
• JDBC:这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
• MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如JEE应用服务器的上下文)。 默认情况下它会关闭连接,然而一些容器并不希望这 样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。
其中,数据源(dataSource)类型有三种:
• UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。
• POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。
• JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
1.3 mapper标签
该标签的作用是加载映射的,加载方式有如下几种:
• 使用相对于类路径的资源引用,例如:<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
• 使用完全限定资源定位符(URL),例如:<mapper url="file:///var/mappers/AuthorMapper.xml"/>
• 使用映射器接口实现类的完全限定类名,例如:<mapper class="org.mybatis.builder.AuthorMapper"/>
• 将包内的映射器接口实现全部注册为映射器,例如:<package name="org.mybatis.builder"/>
1.4 properties标签
实际开发中,习惯将数据源的配置信息单独抽取成一个properties文件,该标签可以加载额外配置的properties文件
1.5 typeAliases标签
类型别名是为Java 类型设置一个短的名字。原来的类型名称配置如下
上面是自定义类的别名,mybatis框架已经设置了一些常用别名,比如:八大基本类型就是对应包装类的别名
1.6 plugins标签
MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即
可获得分页的相关数据
开发步骤:
① 导入通用PageHelper的坐标
1 <!-- 分页助手 --> 2 <dependency> 3 <groupId>com.github.pagehelper</groupId> 4 <artifactId>pagehelper</artifactId> 5 <version>3.7.5</version> 6 </dependency> 7 <dependency> 8 <groupId>com.github.jsqlparser</groupId> 9 <artifactId>jsqlparser</artifactId> 10 <version>0.9.1</version> 11 </dependency>
② 在mybatis核心配置文件中配置PageHelper插件
1 <!-- 注意:分页助手的插件 配置在通用馆 mapper 之前 --> 2 <plugin interceptor="com.github.pagehelper.PageHelper"> 3 <!-- 指定方言 --> 4 <property name="dialect" value="mysql"/> 5 </plugin>
③ 测试分页数据获取
1 public void testPageHelper() 2 { 3 // 设置分页参数 4 PageHelper.startPage(1, 2); 5 List < User > select = userMapper2.select(null); 6 for(User user: select) 7 { 8 System.out.println(user); 9 } 10 }
1.7 typeHandlers标签
你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。具体做法为:实现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类型的方法
1 public class MyDateTypeHandler extends BaseTypeHandler<Date> {
2 //设置一个Date数据类型存到数据库变成毫秒数
3 //这个方法作用就是:当要存入数据库的实体字段类型和表字段类型不匹配时,转换成表字段类型的格式。否则insert数据可能报错
4 public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType type)
5 {
6 preparedStatement.setString(i,date.getTime()+"");
7 }
8 //设置一个数据从数据库取出来时转换成我需要的类型格式
9 public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
10 return new Date(resultSet.getLong(s));
11 }
12 public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
13 return new Date(resultSet.getLong(i));
14 }
15 public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
16 return callableStatement.getDate(i);
17 }
18 }
③ 在MyBatis核心配置文件中进行注册
<!-- 注册类型自定义转换器 -->
<typeHandlers>
<typeHandler handler="com.itheima.typeHandlers.MyDateTypeHandler"></typeHandler>
</typeHandlers>