但行好事
莫论前程❤

MyBatis 加载 Mapper配置的五种方式

前言

​ Mybatis 的Mapper 是指Mybatis 执行数据库操作的接口类以及方法,在非注解模式下,还包含与类对应的 xml 配置文件。

第一种依据 Mapper类具体路径配置 Mapper

这种情况下,如果是非注解模式的话

xml配置文件必须和这个类在同一级目录,且与Mapper类同名

<configuration>
    <mappers>       
        <!-- class 级别的指定 -->
        <mapper class="com.bestcxx.stu.springmvc.mapper.UserModelMapper"/>
        <mapper class="com.bestcxx.stu.springmvc.mapper.UserModelTwoMapper"/>
    </mappers>
</configuration>

在存在 xml 配置文件的情况下,文件结构如下,没有 xml 配置文件的情况下,只有 Mapper 类

img

第二种依据 Mapper 类所在的package包路径配置Mapper

这种情况下,如果是非注解模式的话

xml配置文件必须也处于同一级 package 下,且与Mapper类同名

<configuration>
    <mappers>
        <package name="com.bestcxx.stu.springmvc.mapper"/>
    </mappers>
</configuration>

文件结构

img

第三种是把 Mapper 的xml配置文件单独放置到 resources 中,和Mapper类分开

这种方式的好处是便于统一管理 xml 配置文件,不好的的地方是无法使用注解模式了

<configuration>
    <mappers>
        <!-- 使用这个方案,可以单独指定Mapper的位置 -->
        <mapper resource="mybatis/mappings/UserModelMapper.xml"/>
        <mapper resource="mybatis/mappings/UserModelTwoMapper.xml"/>
    </mappers>
</configuration>

然后Mapper类还是呆在该在的位置

img

但是mapper 的 xml文件的位置如下

img

上面的配置在mybitas-config.xml(名字是可以自定义的)中集中管理,Mapper 的 xml 文件需要关联

  • 第一,是mybatis-config.xml 文件负责加载 Mapper的xml文件,即上面所说的配置是在这个mybatis-config.xml文件中
  • 第二,mapper对应的xml 配置文件内部要指定对应的Mapper类

下面是单独测试mybatis的mybatas的配置文件的内容

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 元素首次出现必须符合下面的顺序 -->
    <!-- (properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?) -->

    <!-- 加载常量配置信息 -->
    <!-- 可以覆盖重写,用于解密-http://www.mybatis.org/mybatis-3/zh/configuration.html
        ·在 properties 元素体内指定的属性首先被读取。
        ·然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
        ·最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。 -->
    <properties resource="config/jdbc.properties"/>

    <!-- 为实体类定义别名 -->
    <typeAliases>
        <typeAlias alias="userModel"  type="com.bestcxx.stu.springmvc.model.UserModel"/>
        <typeAlias alias="userModelTwo"  type="com.bestcxx.stu.springmvc.model.UserModelTwo"/>
    </typeAliases>
    <!-- 使用 spring 配置数据库的时候,下面就可以注释掉了 -->
    <!-- 定义数据库信息,默认使用 development 数据库构建环境 -->
    <environments default="development">
        <environment id="development">
            <!-- 采用 jdbc 事务管理 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据库链接信息 -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClassName}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 定义映射器 -->
    <mappers>
        <!-- 使用这个方案,可以单独指定Mapper的位置 -->
        <!-- <mapper resource="mybatis/mappings/UserModelMapper.xml"/>
        <mapper resource="mybatis/mappings/UserModelTwoMapper.xml"/> -->

        <!-- 使用下面两个方法,Mapper.xml 文件位置必须在和其内部 <mapper namespace="">的类在一起,当然,使用注解模式的话,Mapper.xml文件就没有必要存在了 -->

        <!-- 直接指定一个包去扫描-内保包含多个Mapper配置- -->
        <!-- <package name="com.bestcxx.stu.springmvc.mapper"/> -->

        <!-- class 级别的指定 -->
        <mapper class="com.bestcxx.stu.springmvc.mapper.UserModelMapper"/>
        <mapper class="com.bestcxx.stu.springmvc.mapper.UserModelTwoMapper"/>
    </mappers>
</configuration>

mapper的xml 配置文件的内容

注意

<mapper namespace="com.bestcxx.stu.springmvc.mapper.UserModelMapper">
?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bestcxx.stu.springmvc.mapper.UserModelMapper">

    <!-- 表字段显式 -->
    <sql id="userModelColumns">
        u.userName AS "userName",
        u.passWord AS "passWord",
        u.createDate AS "createDate",
        u.intNum AS "intNum",
        u.decimalNum AS "decimalNum"
    </sql>


    <!-- 根据 userName 查询 -->
    <select id="getUserModel" resultType="userModel">
        SELECT
        <include refid="userModelColumns" />
        FROM
        userModel u
        WHERE
        u.userName = #{userName}
    </select>

    <!-- 插入 -->
    <insert id="addUserModel" parameterType="userModel" useGeneratedKeys="true" keyProperty="userName">
        INSERT INTO userModel (
        passWord,
        createDate,
        intNum,
        decimalNum
        )
        VALUES (
        #{passWord},
        #{createDate},
        #{intNum},
        #{decimalNum}
        )

    </insert>

    <!-- 搜索多条,返回List<userModel>-入参为111,222,333 格式 -->
    <select id="getUserModelListByStrs" parameterType="string" resultType="userModel">
        SELECT 
        <include refid="userModelColumns" />
        FROM 
        userModel u
        WHERE
        u.userName in (${userNames})
    </select>

    <!-- 搜索多条,返回 List<HashMap<String,Object>>,入参为list-->
    <select id="getHashMapListByList" parameterType="list" resultType="map">
        SELECT 
        <include refid="userModelColumns" />
        FROM 
        userModel u
        WHERE
        u.userName in 
        <foreach item="item" collection="userNamelist" open="(" separator="," close=")" >
            #{item}
         </foreach>
    </select>

    <update id="update">
        UPDATE userModel u
        SET
        u.passWord=#{passWord},u.createDate=#{createDate}
        WHERE
        u.userName=#{userName}
    </update>

</mapper>

第四种,直接在spring中配置Mapper的路径,但是mybatis.xml还是必不可少的

在sqlSessionFactory中设定 mybitas的xml和aliases

<!-- MustConfigPoint MyBatis begin -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="typeAliasesPackage" value="实体类包路径" />
        <property name="typeAliasesSuperType" value="实体类顶级包路径" />
        <property name="mapperLocations" value="classpath:/mybatis/mappings/**/*.xml" />
        <property name="configLocation" value="classpath:/mybatis/mybatis-config.xml">
        </property>
    </bean>

设置Mapper类

<!-- MustConfigPoint 扫描basePackage下所有以@MyBatisDao注解的接口 -->
    <bean id="mapperScannerConfigurer" 
                class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="mapper类的包路径" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <property name="annotationClass" 
                value="com.msyd.framework.common.persistence.annotation.MyBatisDao" />
    </bean>

注解类

package com.msyd.framework.common.persistence.annotation;

public @interface MyBatisDao {
}

mapper接口

@MyBatisDao
public interface AccountDao {

    List<Account> findByPage(Page page);

    int findRows(Page page);

    void updateStatus(Account account);

    Account findById(int id);

    void update(Account account);

    void save(Account account);
    //根据身份证号码,查询账务账号
    Account findByIdcardNo(String idcardNo);

}

第五种 spring整合mybatis

<!-- 配置sqlSessionFactory,SqlSessionFactoryBean是用来产生sqlSessionFactory的 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 加载mybatis的全局配置文件mybatis-configuration.xml(也有叫SqlMapConfig.xml的,名字任意,在下面指定就好),放在classpath下的mybatis文件夹中 -->
        <property name="configLocation" value="mybatis/mybatis-configuration.xml" />
        <!-- 加载数据源,使用上面配置好的数据源 -->
        <property name="dataSource" ref="dataSource" />

         <!-- typeAliases -->
        <property name="typeAliasesPackage" value="vo,com.feinno.perftrace.web.alarm.vo"/>

        <!-- setting the location of mapper 在这里配置映射器的路径可以使用*指定多个配置文件 不必和mapper接口在一起 -->
        <property name="mapperLocations" value="classpath*:mapper/*Mapper.xml"/>

    </bean>
赞(2) 打赏
未经允许不得转载:刘鹏博客 » MyBatis 加载 Mapper配置的五种方式
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏