Mybatis(三):配置XML、ResultMap

Mybatis(三):配置文件

一、核心配置文件

核心配置文件属性罗列

configuration(配置)
    properties(属性)
    settings(设置)
    typeAliases(类型别名)
    typeHandlers(类型处理器)
    objectFactory(对象工厂)
    plugins(插件)
    environments(环境配置)
        environment(环境变量)
            transactionManager(事务管理器)
            dataSource(数据源)
    databaseIdProvider(数据库厂商标识)
    mappers(映射器)

environments元素

<environments default="development">
  <environment id="development">
   
  </environment>
</environments>
  • 配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,必须指定其中一个为默认运行环境(通过default指定)
  • 子元素节点(environment)是具体的一套环境,通过设置id进行区别,id保证唯一!

mappers元素

  • 映射器:定义映射sql语句文件

  • 引用资源方式

    • <!-- 使用相对于类路径的资源引用 -->
      <mappers>
        <mapper resource="org/mybatis/builder/PostMapper.xml"/>
      </mappers>
      
    • <!-- 使用完全限定资源定位符(URL) -->
      <mappers>
        <mapper url="file:///var/mappers/AuthorMapper.xml"/>
      </mappers>
      
    • <!-- 
      使用映射器接口实现类的完全限定类名
      需要配置文件名称和接口名称一致,并且位于同一目录下
      -->
      <mappers>
        <mapper class="org.mybatis.builder.AuthorMapper"/>
      </mappers>
      
    • <!-- 
      将包内的映射器接口实现全部注册为映射器
      但是需要配置文件名称和接口名称一致,并且位于同一目录下
      -->
      <mappers>
        <package name="org.mybatis.builder"/>
      </mappers>
      

mapper元素

  • namespace(命名空间)作用

    • namespace和子元素的id联合保证唯一 , 区别不同的mapper
    • 绑定DAO接口,namespace的命名必须跟某个接口同名
    • 接口中的方法与映射文件中sql语句id应该一一对应
  • 设置sql片段

    <!--定义Sql片段 -->
    	<sql id="cust">
    		cust_id,cust_name,cust_source
    	</sql>
    
    	<!-- 引用sql片段 -->
    	<select id="selectCustomer"
    		resultType="com.ruanyuan.pojo.Customer">
    		select <include refid="cust"/> from customer
    	</select>
    

二、Properties优化

  • 在资源目录下创建db.properties文件

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
    username=root
    password=
    
  • 将db.properties文件导入核心配置xml中

<configuration>
    <!--导入properties文件-->
    <properties resource="db.properties"/>

    <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>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

三、设置settings

作用:可以根据需求,设置不同的功能(如:懒加载,缓存,自动映射等)

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="autoMappingBehavior" value="PARTIAL"/>
</settings>

四、类型别名(typeAliases)

1.区别名的方法有三种

//第一种方法:通过类名
<typeAliases>
	<typeAlias alias="Author" type="domain.blog.Author"/>
</typeAliases>
//第二种方法:通过包名
<typeAliases>
  <package name="domain.blog"/> //应用:批量设置别名
</typeAliases>
//第三种方法:注解
@Alias("author")
public class Author {
    ...
}

五、typeHandler(类型处理器)元素

  • 类型处理器,将从传入的参数从JAVA转化为数据库(JDBC)类型
  • 可以自定义类型转换器,创建一个class,实现TypeHandler接口

六、事物管理器

  • JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
  • MANAGED –让容器来管理事务的整个生命周期。 默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为。

七、数据源(dataSource)

  1. 三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”)

    UNPOOLED:只是每次被请求时打开和关闭连接

    POOLED:利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间,使得并发 Web 应用快速响应请求的流行处理方式

    JNDI:这个数据源的实现是为了能在如 EJB(如spring)或应用服务器这类容器中使用

  2. 数据源也有很多第三方的实现,比如dbcp,c3p0,druid

八、XML映射文件

1.SQL映射文件

  1. cache – 对给定命名空间的缓存配置。
  2. cache-ref – 对其他命名空间缓存配置的引用。
  3. resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
  4. sql – 可被其他语句引用的可重用语句块。

九、ResultMap

解决的问题:属性名和字段名不一致

mybatis会根据查询的列名(会将列名转化为小写,数据库不区分大小写) , 去对应的实体类中查找相应列名的set方法设值 , 所以返回的结果可能为null【自动映射】

数据库字段:user{id,name,pwd}

实体类:user

  • 方案一:为列名指定别名 , 别名和java实体类的属性名一致 .
<select id="selectUserById" resultType="User">    
    select id , name , pwd as password from user where id = #{id} 
</select>
  • 方案二:使用结果集映射->ResultMap 【推荐】

自动映射

<resultMap id="UserMap" type="User">
    <!-- id为主键 -->
    <id column="id" property="id"/>
    <!-- column是数据库表的列名 , property是对应实体类的属性名 -->
    <result column="name" property="name"/>
    <result column="pwd" property="password"/>
</resultMap>

<select id="selectUserById" resultType="map">
    select id , name , pwd from user where id = #{id}
</select>

手动映射:

<resultMap id="UserMap" type="User">
<!-- id为主键 -->
<id column="id" property="id"/>
<!-- column是数据库表的列名 , property是对应实体类的属性名 -->
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>

<select id="selectUserById" resultMap="UserMap">
select id , name , pwd from user where id = #{id}
</select>

十、mybatis插入数据时,自动获取主键的自增id

在Mapper文件中设置useGeneratedKeys和keyProperty两个属性,其中“keyProperty”值为主键的属性

posted @ 2020-02-19 13:19  梦想与爱  阅读(828)  评论(0编辑  收藏  举报