mybatis-config.xml 配置文件
一、安装mybatis
要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。
如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
二、配置文件
引入约束文件
在mybatis-config.xml 的配置文件中,根据mybatis的版本命名域中需要引入
“http://mubatis.org/dtd/mybatis-3-config.dtd” 这样的内容,且引入之后编辑文件,使用ALT + / 会有提示
属性(properties)
引入外部可动态替换的属性,也可以通过properties元素的子元素来传递。
<!--1.url 允许我们使用网络路径的资源或者磁盘资源-->
<properties url="http://www.xxx.com/cad/db.properties"></properties>
<!--2.resource 则允许我们使用类路径下的资源-->
<properties resource="com/zengg/db.properties"></properties>
<!--3.直接配置信息-->
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
完成引入之后,配置文件的其他地方想要使用properties文件中的内容,则使用${key}这样的EL表达式即可。例如:
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
如果一个属性有多次配置,那么Mybatis将按照下面的顺序来加载:
- 在 properties 元素体内指定的属性首先被读取。
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
- 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。(有兴趣可以了解sqlSessionFactory)
既然properties的使用是按照EL表达式来做的,那么它同样可以使用到一些EL表达式的用法,例如:
<!-- 如果属性 'username' 没有被配置,'username' 属性的值将为 'ut_user' -->
<property name="username" value="${username:ut_user}"/>
<!-- 如果在key中使用了“:” 或者是因为三元表达式定义了“:” 那么上面的例子中,则需要使用 “?:” 去区分 -->
<!-- key是db:username -->
<property name="username" value="${db:username?:ut_user}"/>
设置(setting)
Setting配置的示例如下:
<settings>
<!-- 采用驼峰命名 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 允许JDBC自动生成主键 -->
<setting name="useGeneratedKeys" value="true"/>
</settings>
实际上,官网文档中提供了许多我们可以配置的参数:
官方文档
类型别名(typeAliases)
typeAliases 的作用是为了在映射文件中使用这些javaBean的时候能更加简洁
<typeAliases>
<typeAlias alias="Eemployee" type="com.zengg.Employee"/>
<typeAlias alias="dept" type="com.zengg.Dept"/>
<typeAlias alias="role" type="com.zengg.Role"/>
<typeAlias alias="permission" type="com.zengg.Permission"/>
<typeAlias alias="section" type="com.zengg.Section"/>
<typeAlias alias="tag" type="com.zengg.Tag"/>
</typeAliases>
当然这样做有一个明显的弊端,就是每新增一个javaBean的类,就需要在这里新增一条typeAlias的记录,我们可以指定一个包名,这样做的作用是会自动将此包下面的所有javaBean的首字母小写的非限定类名作为别名,比如说com.zengg.EmpDept 的别名就应该是empDept
<typeAliases>
<package name="com.zengg"/>
</typeAliases>
除此之外还有一种情况,就是此包下的不同文件夹内有两个同名的类,按照规则他们转换的typeAlias的别名会一样。此时我们可以使用一个注解去区分,即
@Alias("author")
public class Author {
...
}
最后,mybatis官方还为一些常见的Java类型建立了默认的别名
类型处理器( typeHandler)
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。
平时使用最多的类型处理器如jdbcType的Varchar对应了java.lang.String等等
下面是一个官方文档的示例,这个示例介绍了如何自定义一个处理器,并覆盖已经存在的String和Varchar的类型处理器( 要注意 MyBatis 不会通过窥探数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指明那是 VARCHAR 类型的字段, 以使其能够绑定到正确的类型处理器上。这是因为 MyBatis 直到语句被执行时才清楚数据类型。)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ExampleTypeHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter);
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return rs.getString(columnName);
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return rs.getString(columnIndex);
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return cs.getString(columnIndex);
}
}
<!-- mybatis-config.xml -->
<typeHandlers>
<typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
插件(plugins)
MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
使用插件的时候需要注意,因为如果插件的作用不仅仅是监听的话,需要改变一些逻辑。可能会影响到底层Mybatis的核心行为。
以前做过一个拦截器的例子:
环境配置
先上示例
<!-- Mybatis 允许我们配置多种环境-->
<!--
一些具体的配置信息代表的类信息查看在Configuration.class中可以查看
environment : 配置一个环境的具体信息
@ id属性:代表了环境的唯一标识,在最外层environments 的default属性中使用,表示使用哪个环境作为默认环境
# transactionManager :{
@ type : 配置事务管理器的类型 JDBC(JDBCTransactionFactory)或者MANAGED(ManagedTransactionFactory) 两种类型
自定义事务管理器:实现TransactionFactory接口,Type直接使用实现类的全类名即可
# dataSource:{
@type 数据源类型n : 可选择JNDI | POOLED | UNPOOLED
详情可查看官方文档http://www.mybatis.org/mybatis-3/zh/configuration.html#
自定义数据源则实现org.apache.ibatis.datasource.DataSourceFactory接口即可
}
}
-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="product">
<transactionManager type="JDBC">
<property name="..." value="..."/>
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="${driver1}"/>
<property name="url" value="${url1}"/>
<property name="username" value="${username1}"/>
<property name="password" value="${password1}"/>
</dataSource>
</environment>
</environments>
数据库厂商标识(databaseIdProvider)
databaseIdProvider的作用就是提供多厂商支持,在配置好不同的厂商后。在mapper.xml文件中,往往一个语句的id表示唯一执行sql,但是不同厂商需要的sql是不一致的。例如mysql和oracle这两种常用的。我们可以使用一下方式来处理
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle" />
<property name="MySQL" value="mysql" />
</databaseIdProvider>
<!-- 通过databaseId来区分 -->
<select id="getEmpById" resultType="employee" databaseId="mysql">
select * from tb1_employee where id = #{id}
</select>
<select id="getEmpById" resultType="employee" databaseId="oracle">
select e.id,e.lastName from tb1_employee e where id = #{id}
</select>
映射器(mappers)
映射器有一些地方和properties的使用相似,例如resource 也是引入类路径下的资源,url 还是引入磁盘或者网络资源的。
<!-- 1 使用相对于类路径的资源引用(resource) -->
<mappers>
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
</mappers>
<!-- 2 使用完全限定资源定位符(URL) -->
<mappers>
<mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>
<!-- 3 使用类名的方式注册接口(Class)这种注册的方式要求必须让接口和xml文件的位置在同一包路径下 -->
<!-- 当然这并不是要求我们一定非要放在同一个包里,我们可以使用相同路径,将接口和xml文件放在src 和 resources 的两个路径下 -->
<mappers>
<mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>
<!-- 4.将包内的映射器接口全部注册为映射器,简化第三步的操作 -->
<mappers>
<package name="org.mybatis.builder"/>
</mappers>