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>

猜你喜欢

转载自www.cnblogs.com/Elaina/p/13383551.html