MyBatis03配置文件中的常用标签及属性
Posted elaina
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis03配置文件中的常用标签及属性相关的知识,希望对你有一定的参考价值。
MyBatis配置文件
标签配置的顺序
properties
settings
typeAliases
typeHandlers
objectFactory
objectWrapperFactory
reflectorFactory
plugins
environments
databaseIdProvider
mappers
typeAliases
取别名
<!-- 可用typeAliases标签配置别名,只能配置domain中类的别名 -->
<typeAliases>
<!-- 单个别名定义|alias:别名,type:别名的映射类型
<typeAlias type="blog.mybatis.domain.User" alias="user"/>
-->
<!-- package标签|指定要配置别名的包,当指定之后,该包下的实体类都会注册别名,且默认类名就是别名,不区分大小写 -->
<package name="blog.mybatis.domain"/>
</typeAliases>
Mappers
指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件
<mappers>
<!-- 通过resource引用mapper映射文件
<mapper resource="blog/mybatis/dao/UserDao.xml"/>
-->
<!-- 通过class引用mapper接口
class:配置mapper接口全限定名
要求:需要mapper.xml和mapper.java同名并且在一个目录中
<mapper class="blog.mybatis.dao.UserDao"/>
-->
<!-- 通过package指定dao接口所在的包,当指定完之后就不需要再写mapper、resource或class
要求:需要mapper.xml和mapper.java同名并且在一个目录中
-->
<package name="blog.mybatis.dao"/>
</mappers>
延迟加载
也称为懒加载,在用到数据时才进行加载,不需要用到数据时就不加载数据
优点:先从单表查询,需要时再去关联查询,大大提高数据库性能,减轻服务器压力,因为单表查询要比关联查询多表速度快
缺点:用到数据时才会进行查询, 当在大批量数据查询时,查询需要时间,导致用户等待时间变长,造成用户体验下降
使用场景:一对一、多对一使用立即加载;一对多、多对多使用延迟加载
<!-- 配置全局延迟加载 -->
<settings>
<!-- lazyLoadingEnabled:设置全局延迟加载
默认值为false,即默认所有关联对象都会被立即加载
-->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- aggressiveLazyLoading:设置侵入式延迟加载
默认为false,即默认为深入式延迟加载(3.4.1版本之前默认为true,即默认为侵入式延迟加载)
-->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 立即加载:
lazyLoadingEnabled=false,aggressiveLazyLoading=true|false
执行完主对象的SQL语句之后直接执行关联对象的SQL语句
深入式延迟加载:
lazyLoadingEnabled=true,aggressiveLazyLoading=false
执行完主对象的SQL语句之后,
如果只访问了主对象的属性,则只会执行主对象的SQL语句而不会执行关联对象的SQL语句
如果访问了关联对象的属性,则执行完主对象的SQL语句后执行关联对象的SQL语句
侵入式延迟加载:
lazyLoadingEnabled=true,aggressiveLazyLoading=true
执行完主对象的SQL语句之后,
如果访问了主对象的属性,则执行完主对象的SQL语句后执行关联对象的SQL语句
如果没有访问主对象的属性,则只会执行主对象的SQL语句而不会执行关联对象的SQL语句
-->
</settings>
properties
<!-- 配置properties
resource属性:常用
用于指定配置文件的位置,是按照类路径的写法来写,且必须存在于类路径下。
url属性:
是要求按照Url的写法来写地址
URL:Uniform Resource Locator统一资源定位符,唯一标识一个资源的位置
写法:http://localhost:8080/mybatisserver/demo1Servlet
协议 主机 端口 URI
URI:Uniform Resource Identifier 统一资源标识符。它是在应用中可以唯一定位一个资源的。
-->
<properties resource="jdbcConfig.properties"/>
映射配置文件
占位符
#{}:解析传递进来的参数数据
${}:对传递进来的参数原样拼接在SQL中
主键生成策略
UUID生成主键
<insert id="insertUser" parameterType="blog.mybatis.domain.User">
<selectKey keyProperty="id" resultType="string" order="BEFORE">
select uuid()
</selectKey>
INSERT INTO USER(id,username,password) VALUES(#{id},#{username},#{password})
</insert>
主键返回
<!-- 保存用户 -->
<insert id="saveUser" parameterType="blog.mybatis.domain.User">
<!-- 配置插入操作后,获取插入数据的id -->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
INSERT INTO USER(id,username,password) VALUES(#{id},#{username},#{password})
</insert>
resultType和resultMap
resultType
指定返回结果的类型(实体类、基础类型、List、Map等...),将SQL查询结果映射为JAVA对象,相当于自动创建了一个属性一一对应resultMap
作用:将查询接口按照SQL列名实体类属性名一致性映射到实体类中
注意:SQL查询列名需要与指定实体类中的属性名相同
<!-- 查询所有 -->
<select id="findAll" resultType="blog.mybatis.domain.User">
select * from user;
</select>
resultMap(更常用)
将SQL查询结果映射为JAVA对象
SQL查询的列名和实体类属性名不一致,使用resultMap将数据表中列名和实体类的属性作对应关系
<resultMap id="userMap" type="User" >
<!-- 数据表的列名:id,username,password
id:要映射结果集的唯一标识,称为主键
column:结果集的列名
property:
-->
<!-- id为主键的映射配置 -->
<id column="id" property="id"/>
<!-- result为普通列的映射配置 -->
<result column="username" property="username"/>
<result column="password" property="password"/>
</resultMap>
resultMap中的association和collection
association
使用场景:通常一对一的时候使用association,例如一个账户对应一个用户
<!-- 定义封装account和user的resultMap -->
<resultMap id="accountUserMap" type="blog.mybatis.domain.Account">
<id column="aid" property="id"></id>
<result column="uid" property="uid"></result>
<result column="money" property="money"></result>
<!-- 一对一的关系映射,配置封装user的内容-->
<association property="user" column="uid" javaType="blog.mybatis.domain.User">
<id column="id" property="id" ></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
</association>
</resultMap>
<!-- 查询所有 -->
<select id="findAll" resultMap="accountUserMap">
select a.*,u.* from account a, user u where u.id = a.uid
</select>
collection
使用场景:通常一对多的时候使用collection,例如一个用户有多个账户
<!-- 定义User的resultMap -->
<resultMap id="userAccountMap" type="User">
<id column="id" property="id"></id>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<!-- 配置user对象中accounts集合的映射 -->
<collection property="accounts" ofType="Account">
<id column="aid" property="id"></id>
<result column="uid" property="uid"></result>
<result column="money" property="money"></result>
</collection>
</resultMap>
<!-- 查询所有 -->
<select id="findAll" resultMap="userAccountMap">
select u.*,a.id as aid,a.uid,a.money from user u left outer join account a on u.id = a.uid
</select>
以上是关于MyBatis03配置文件中的常用标签及属性的主要内容,如果未能解决你的问题,请参考以下文章
MyBatis配置文件中的标签mappers的子标签mapper的url属性
mybatis源码配置文件解析之五:解析mappers标签(解析class属性)
Mybatis配置文件SqlMapConfig.xml中的标签
Mybatis中mapper配置文件的resultMap标签中的子元素idresultassociationcollectiondiscriminator的用法