1. 程式人生 > >MyBatis 筆記(三)——優化配置

MyBatis 筆記(三)——優化配置

在之前的講解中,不難發現 MyBatis 的配置有些笨重,這一節就講 MyBatis 的配置優化。毫無疑問,主要是兩方面:
1. 優化 MyBatis 基礎配置檔案。
2. 優化 MyBatis 對映檔案。

優化 MyBatis 基礎配置檔案

在 MyBatis 基礎配置檔案中,之前的資料庫配置都是在這個檔案中完成的。實際上,資料庫配置是可以抽出去的,如 db.properties:

DRIVER=com.mysql.cj.jdbc.Driver
URL=jdbc:mysql://127.0.0.1:3306/test?useSSL=true
USERNAME=root
PASSWORD=123456

然後,在 MyBatis 的基礎配置檔案中的 configuration 標籤裡配置如下:

<!-- 引用db.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
>

優化 MyBatis 對映檔案

在 MyBatis 對映檔案中,之前對於資料庫實體類的引用都是通過全類名(包名+類名)對映,這無疑產生了很多的冗餘。為了解決這個問題,可以在 MyBatis 基礎配置檔案中,為每個實體類起一個別名。例如給實體類 edu.wzm.mybatis.domain.Person 別名為 Person,然後在對映檔案中就可以直接用 Person 映射了:

<!-- 為實體類edu.wzm.mybatis.domain.Person配置一個別名_User -->
<typeAlias type="edu.wzm.mybatis.domain.Person" alias="Person"/>

當然,如果為每一個實體類都起別名顯然也是很費事的,所以,可以以包為單位為每個類起一個別名,其中類的別名就是類名。這樣就需要在 MyBatis 基礎配置檔案中,配置如下:

<!--
    為edu.wzm.mybatis.domain包下的所有實體類配置別名,MyBatis預設的設定別名的方式就是去除類所在的包後的簡單的類名。
    例如:edu.wzm.mybatis.domain.Person這個實體類的別名就會被設定成Person
-->
<typeAliases>
    <package name="edu.wzm.mybatis.domain"/>
</typeAliases>

完整的 MyBatis 基礎配置檔案:

<?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>

    <!-- 引用db.properties配置檔案 -->
    <properties resource="db.properties"/>

    <!-- 為實體類edu.wzm.mybatis.domain.Person配置一個別名_User -->
    <!-- <typeAlias type="edu.wzm.mybatis.domain.Person" alias="Person"/> -->

    <!--
        為edu.wzm.mybatis.domain包下的所有實體類配置別名,MyBatis預設的設定別名的方式就是去除類所在的包後的簡單的類名。
        例如:edu.wzm.mybatis.domain.Person這個實體類的別名就會被設定成Person
    -->
    <typeAliases>
        <package name="edu.wzm.mybatis.domain"/>
    </typeAliases>

    <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>
        <!-- 基於XML配置檔案 -->
        <mapper resource="edu/wzm/mybatis/mapping/PersonMapper.xml"/>
        <!-- 基於註解 -->
        <!--<mapper class="edu.wzm.mybatis.mapper.PersonMapper"/>-->
    </mappers>
</configuration>

完整的 MyBatis 對映檔案:

<?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,namespace的值習慣上設定成包名+sql對映檔名,這樣就能夠保證namespace的值是唯一的
  例如:namespace="edu.wzm.mybatis.mapping.PersonMapper"(userMapper.xml檔案去除字尾)
-->
<mapper namespace="edu.wzm.mybatis.mapping.PersonMapper">
  <!--
    在select、insert、update、delete標籤中編寫查詢的SQL語句, 設定標籤的id屬性值必須是唯一的,不能夠重複。使用parameterType屬性
    指明查詢時,使用的引數型別。resultType屬性指明查詢返回的結果集型別,resultType="edu.wzm.mybatis.domain.Person"就表示將查詢
    結果封裝成一個Person類的物件返回,Person類就是person表所對應的實體類。
  -->

  <insert id="insert" parameterType="Person">
    insert into person(name, age) values(#{name}, #{age})
  </insert>

  <select id="getById" resultType="Person">
    select *
    from person
    where id = #{id}
  </select>

  <select id="getAll" resultType="Person">
    select * from person;
  </select>

  <update id="update" parameterType="edu.wzm.mybatis.domain.Person">
    update person set age = #{age} where id = #{id}
  </update>

  <delete id="delete" parameterType="int">
    delete from person where id = #{id}
  </delete>
</mapper>