MyBatis③MyBatis配置文件和ResultMap结果映射

MyBatis③MyBatis配置文件和ResultMap结果映射

 

5、MyBatis配置文件

configuration配置

  1. properties:属性
  2. settings:设置
  3. typeAliases:类型别名
  4. typeHandlers:类型处理器
  5. objectFactory:对象工厂
  6. plugins:插件
  7. environments:环境配置
    • environment:环境变量
      • transactionManager:事务管理器
      • dataSource(数据源
  8. databaseIdProvider:数据库厂商标识
  9. 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的加载顺序是:

  1. 读取properties标签内的属性
  2. 读取properties标签引入的外部配置文件,覆盖之前读取的同名属性
  3. 读取作为方法参数传递的属性,覆盖之前读取的同名参数

即可以理解为,如果不考虑方法参数,优先读取外部配置文件中的属性。

<!-- 引入外部配置文件 -->
<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 属性指定。

  1. 此时MyBatis会隐式创建一个ResultMap,将数据库列映射到实体类属性上。
  2. 如果列名和属性名匹配不上,可以在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>
 
 
posted @ 2022-02-24 22:52  扬帆起航$  阅读(82)  评论(0)    收藏  举报