1. 程式人生 > >Mybatis 載入 Mapper配置的四種方式

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 類

第二種依據 Mapper 類所在的package包路徑 配置 Mapper
這種情況下,如果是非註解模式的話xml配置檔案必須也處於同一級 package 下,且與Mapper類同名

<configuration>
    <mappers>
        <package name="com.bestcxx.stu.springmvc.mapper"/>
    </mappers>
</configuration>
檔案結構


第三種是把 Mapper 的xml配置檔案單獨放置到 resources 中,和Mapper 類分開了
這種方式的好處是便於統一管理 xml 配置檔案,不好的的地方是無法使用註解模式了

<configuration>
    <mappers>
        <!-- 使用這個方案,可以單獨指定Mapper的位置 -->
        <mapper resource="mybatis/mappings/UserModelMapper.xml"/>
        <mapper resource="mybatis/mappings/UserModelTwoMapper.xml"/>
    </mappers>
</configuration>
然後Mapper類還是呆在該在的位置


但是mapper 的 xml檔案的位置如下

上面的配置在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>