MyBatis③MyBatis配置文件和ResultMap结果映射
MyBatis③MyBatis配置文件和ResultMap结果映射
5、MyBatis配置文件
configuration配置
- properties:属性
- settings:设置
- typeAliases:类型别名
- typeHandlers:类型处理器
- objectFactory:对象工厂
- plugins:插件
- environments:环境配置
- environment:环境变量
- transactionManager:事务管理器
- dataSource(数据源
- environment:环境变量
- databaseIdProvider:数据库厂商标识
- mappers:映射器
5.1、enviroments
MyBatis 可以配置多种环境,有助于将 SQL 映射应用于多种数据库之中。例如,开发、测试和生产环境需要有不同的配置。
注意:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
- 环境 ID:默认
development - 事务管理器:默认
JDBC - 数据源:默认
POOLED
<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>
</environments>
5.2、properties
可以在properties标签内部增加属性,也可以引入外部配置文件。
说明:如果一个属性在多个地方进行了配置,MyBatis的加载顺序是:
- 读取
properties标签内的属性; - 读取
properties标签引入的外部配置文件,覆盖之前读取的同名属性; - 读取作为
方法参数传递的属性,覆盖之前读取的同名参数。
即可以理解为,如果不考虑方法参数,优先读取外部配置文件中的属性。
<!-- 引入外部配置文件 -->
<properties resource="资源路径"/>
<!-- 增加属性 -->
<property name="" value=""/>
</properties>
设置好的属性,可以在整个mybatis-config配置文件中用${value}来替代属性值,这些属性值可以动态配置,提高了配置的灵活性。如:
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
关于上述说明中第3点——方法参数的解释:
在构建SqlSessionFactory的时候,调用含Properties参数的构造方法。
此时Properties文件就作为方法参数传递,其中的属性即被加载读取。

5.3、typeAliases
类型别名可为 Java 类型设置一个缩写名字。仅用于 XML 配置,可以降低冗余的全限定类名书写。
1、typeAlias
为Java类型自定义一个别名。
<typeAliases>
<typeAlias alias="User" type="indi.jaywee.pojo.User"/>
</typeAliases>
2、package
扫描包:指定一个包名,MyBatis会在指定的包下搜索JavaBean。
使用Bean的首字母小写类名作为其别名,比如User的别名会是user。
<typeAliases>
<package name="indi.jaywee.pojo"/>
</typeAliases>
在指定包名的前提下,如果使用注解为Bean起别名,则别名为注解值。
@Alias("uu")
public class User{
...
}
别名可以用在原本使用 全限类名 的任何地方,例如:
<select id="listUsers" resultType="User">/*在配置文件中起的别名*/
select *
from mybatis.user
</select>
3、Java内建别名
以下是Java类型内建的类名别名,不区分大小写。


5.4、settings
常用设置

5.5、mappers
编写Mapper.xml后要到配置文件中注册,否则会报错。
1、相对于类路径的资源引用
<mappers>
<mapper resource="indi/jaywee/dao/UserMapper.xml"/>
</mappers>
2、接口的完全限定类名
要求:Mapper接口和对应Mapper.xml必须同名且在同一个包下。
<mappers>
<mapper class="indi.jaywee.dao.UserMapper"/>
</mappers>
3、将包内的映射器接口实现全部注册为映射器
要求:Mapper接口和对应Mapper.xml必须同名且在同一个包下。
<mappers>
<package name="indi.jaywee.dao"/>
</mappers>
5.6、其他配置
目前阶段较少使用。
- typeHandlers
- objectFactory
- plugins
- mybatis-generator-core
- mybatis-plus
- 通用mapper
- databaseProvider
6、ResultMap结果映射
设计思想:对简单的语句做到零配置,对复杂的语句描述语句之间的关系。
6.1、简单语句
对简单的语句做到零配置:如果数据库字段和实体类属性能自动映射,则无需使用ResultMap配置;
例1:以下语句会将查询结果中数据库所有列映射到 HashMap的键,由 resultType 属性指定。
<select id="getUserById" resultType="map">
select id,username,password
from user
where id = #{id}
</select>
例2:以下语句会将查询结果中数据库所有列映射到JavaBean的属性,由 resultType 属性指定。
- 此时
MyBatis会隐式创建一个ResultMap,将数据库列映射到实体类属性上。 - 如果列名和属性名匹配不上,可以在select语句中设置
列别名。
<select id="listUsers" resultType="User">
select * from user
</select>
<!--起别名-->
<select id="listUsers" resultType="User">
select
user_id as id,
user_psw ad password
from user
</select>
6.2、复杂语句
对复杂的语句描述语句之间的关系:需要显式创建一个ResultMap,配置数据库列和实体类属性的映射关系。
- id:用于标识一个结果映射。
- type:映射数据库的类,完全限定名或别名。
- column:数据库的列名或列别名。
- property:映射到列结果的属性。
<resultMap id="" type="映射的实体类名">
<result column="数据库的字段名" property="实体类的属性名"/>
</resultMap>
优点:ResultMap来解决不匹配的问题,无需修改SQL语句(不用起别名),在多表查询的情况下很适用。
例:(假设数据库字段是user_id,user_psw,实体类属性是id,password)
创建ResultMap并配置映射关系,在select标签中引入并使用。
<mapper namespace="indi.jaywee.dao.UserMapper">
<resultMap id="UserMap" type="User">
<result column="user_id" property="id"/>
<result column="user_psw" property="password"/>
</resultMap>
<select id="getUserById" resultMap="UserMap">
select *
from mybatis.user
where id = #{id};
</select>
</mapper>

浙公网安备 33010602011771号