MyBatis的使用(二):配置優化與高級使用

配置優化

  1. 將數據源的配置放在properties文件中
    在mybatis的配置文件中使用properties引入數據庫的配置文件
    在數據源指定屬性的位置使用類似el表達式替換數據 ${}

  2. 批量註冊dao層
    在mapper標籤中指定package 會自動掃描包下面的所有接口

  3. 實體類別名
    typeAliases中配置實體類的別名
    mybatis具有內置的別名
    統一起別名 指定某一個包下面的實體類都支持別名

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/emp
username=root
password=123456

mybatis-config.xml

<?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 resource="db.properties"></properties>


    <!--相關的設置-->
    <settings>
        <!--mybatis log4j的日誌 -->
        <setting name="logImpl" value="LOG4J" />
    </settings>
    <!--給實體類定義別名-->
    <typeAliases>
    	<!--別名的規則是類名-->
    	<!--單獨定義別名-->
        <!--<typeAlias type="com.igeek.entity.Dept" alias="Dept"></typeAlias>
        <typeAlias type="com.igeek.entity.Emp" alias="Emp"></typeAlias>-->
        <!--統一定義類名-->
        <package name="com.igeek.entity"></package>
    </typeAliases>

    <!--所有的數據源
        default指定默認的數據源 填入數據源的ID
    -->
    <environments default="mysqlDataSource">
        <!--單個數據源-->
        <environment id="mysqlDataSource">
            <!--事務類型  -->
            <transactionManager type="JDBC"></transactionManager>
            <!--數據連接池-->
            <dataSource type="POOLED">
                <!--數據源的4個配置 驅動,地址,用戶名,密碼-->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 註冊dao層 -->
    <mappers>
        <!--掃描dao層-->
        <package name="com.igeek.dao"></package>
    </mappers>
</configuration>

高級使用

實體類映射

resultMap

  1. 配置resultMap
    a.id代表當前表的ID(不是必須的)
    b.result指定 column代表表的列字段 property代表需要映射的java的屬性

  2. 應用resultMap
    指定查詢的結果集的resultMap屬性,匹配resultMap的ID

  3. resultMap如果表中的列名和java中的字段名是同名,支持直接映射,可以不寫映射,如果不一樣一定要寫映射

  4. resultMap一旦使用了就可以不用resultType

一對多和多對一(二次查詢,連表映射)

  • 不帶外鍵查詢
    1.改造javabean,將外鍵字段改造成實體對象
    2.映射集如果bean中是實體對象的話,可以採用 對象.屬性 的方式映射到對象內部

  • 多對一 使用 association 二次映射
    1.改造javabean,將外鍵字段改造成實體對象
    2.使用標籤association 標籤一定要放在result的後面 collection的前面
    3.property 代表javabean中的 複合Bean的名稱 column代表二次查詢的條件 select代表二次查詢語句(全路徑) javaType 二次查詢返回的結果類型
    4.二次查詢參數一定要統一,類型一定要匹配(只能要覆蓋就可以)

  • 一對多 一方查詢多條記錄 使用collection
    1.改造bean,在bean中增加多條記錄的字段 一定是List
    2.collection 放在最後面(association的後面)
    3.property 代表javabean中的 List集合的名稱 column代表二次查詢的條件(無外鍵,一般都是當前表的主鍵) select代表二次查詢語句(全路徑) ofType 二次查詢返回的List中的泛型

  • 注意點
    1.避免遞歸出現 儘量不要使用association 自身查詢別的對象可以使用
    2.不能濫用association和collection,會降低查詢效率 根據實際情況自己選擇(association,left join)

CURD注意點

  1. DML沒有返回值 void 不需要配置resultMap或者resultType
  2. 多參數 當參數類型無法確定的時候 統一使用map 參數匹配使用 @Param(“匹配參數的key”)
  3. 設置自動提交事務爲true sessionFactory.openSession(true)
  4. 參數是複雜類型,要保證匹配類型中的字段的get set方法
  5. mybatis不支持複雜加簡單
  6. 當數據庫有自增主鍵,insert 可以通過設置 useGeneratedKeys=“true” keyProperty=“接收自增主鍵的名稱” 回填自增主鍵
  7. mybatis在insert update 的時候如果你插入null值有可能會出現錯誤 要使用jdbcType指定數據庫類型

示例

IEmpDao.xml

<?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">
<!-- 指定當前配置文件的接口文件 namespace來指定 全路徑-->
<mapper namespace="com.dao.IEmpDao">

    <!--mybatis的映射集-->
    <resultMap id="empIDMap" type="Emp">
        <result column="HIREDATE" property="hie"></result>
        <!--不帶二次查詢映射實體關係 -->
        <result column="MGR" property="mgr.empno"></result>
        <result column="DEPTNO" property="dept.deptno"></result>
    </resultMap>

    <resultMap id="empFKMap" type="Emp">
        <result column="HIREDATE" property="hie"></result>
        <!--映射二次查詢 (映射實體bean) 多對一關係 -->
        <association property="dept" column="deptno"
                     select="com.dao.IDeptDao.findByID" javaType="Dept">
        </association>
        <association property="mgr" column="mgr"
                     select="com.dao.IEmpDao.findByID" javaType="Emp">
        </association>
    </resultMap>


    <!--指定我的sql語句
        id 代碼接口中方法名
        resultType 返回值的類型(泛型)
        parameterType  參數類型
    -->
    <select id="findAllEmp" resultType="Emp">
        select * from  emp
    </select>
    
    <select id="findByID"  parameterType="int" resultMap="empIDMap">
        SELECT  * FROM emp where EMPNO = #{empno}
    </select>

    <select id="findByFK"  parameterType="int" resultMap="empFKMap">
        SELECT  * FROM emp where EMPNO = #{empno}
    </select>

    <select id="findEmpByDept"  parameterType="int" resultMap="empIDMap">
        SELECT  * FROM emp where DEPTNO = #{deptno}
    </select>

</mapper>

IDeptDao.xml

<?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">
<!-- 指定當前配置文件的接口文件 namespace來指定 全路徑-->
<mapper namespace="com.dao.IDeptDao">

    <resultMap id="deptFKMap" type="Dept">
        <collection property="emps" column="deptno"
                    select="com.dao.IEmpDao.findEmpByDept" ofType="Emp"></collection>
    </resultMap>
    <resultMap id="deptIDMap" type="Dept">
    </resultMap>

    <select id="findAllDept" resultType="Dept">
        select  * from dept
    </select>

    <select id="findByID" parameterType="int" resultMap="deptFKMap">
      select  * from dept where DEPTNO = #{deptno}
    </select>

    <insert id="insert" parameterType="map">
  insert into dept (DEPTNO, DNAME, LOC)values (#{deptno,jdbcType=INTEGER},#{dname,jdbcType=VARCHAR},#{loc,jdbcType=VARCHAR})
</insert>


<insert id="insertDept" parameterType="Dept">
   insert into dept (DEPTNO, DNAME, LOC)values (#{deptno,jdbcType=INTEGER},#{dname,jdbcType=VARCHAR},#{loc,jdbcType=VARCHAR})
</insert>

</mapper>

IStudentDao.xml

<?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">
<!-- 指定當前配置文件的接口文件 namespace來指定 全路徑-->
<mapper namespace="com.dao.IStudentDao">
    
    <insert id="insert" parameterType="com.igeek.entity.Student" useGeneratedKeys="true" keyProperty="id">
      INSERT INTO student (name, age)VALUES(#{name},#{age})
    </insert>
    
</mapper>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章