天天看點

Mybatis(二)映射檔案一、檔案的限制二、主配置引入三、元素節點四、常見屬性五、常見屬性分析六、resultMap标簽詳解七、#{}和${}

Mybatis映射檔案

    Mapper映射檔案是Java實體類與資料庫對象之間的橋梁,使用過程中一個Mapper檔案對應一個資料庫操作Dao接口

一、檔案的限制

   加載映射檔案

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

二、主配置引入

mybatis架構需要加載Mapper.xml映射檔案,在主配置檔案中添加映射

<mappers>
    <mapper resource="com/fyl/mapper/NewsMapping.xml"/>
    <mapper resource="com/fyl/mapper/UserMapping.xml"/>
</mappers>
           

三、元素節點

mapper 為元素的根節點

namespace:命名空間,一個namespace對應一個dao接口

        <mapper namespace="com.fyl.mapper.UserMapping">

以<mapper>作為根節點,在根節點中支援9個元素,分别為

cache-給定命名空間的緩存配置。

cache-ref:其他命名空間緩存配置的引用

resultMap:是最複雜最強大的元素,用來描述如何從資料庫結果集中來加載

requestMap:

sql:可被其他語句引用的可重用語句塊

insert:映射插入語句

update:映射更新語句

delete:映射删除語句

select:映射查詢語句

四、常見屬性

<select id="find" parameterType="int" resultType="com.fyl.entity.User">
  	select * from user where uid=#{uid}
</select>
           

    1.id (必須配置)

          id是命名空間的唯一辨別符,可被用來代替這條語句,一個命名空間對應一個dao層接口,這個id相當與對應dao裡面的某個方法,相當于某個方法的實作,是以id應該與方法名一緻

    2.parameterType(可選配置,預設為mybatis自動選擇處理)

          将要傳入語句的參數的完全限定類名或别名,如果不配置,mybatis會通過ParameterType根據參數類型預設選擇何時的typeHandler進行處理。ParameterType主要指定參數類型,可以是int,short,long,亦可以是複雜類型如類,集合等

    3.resultType(傳回資料類型)

         傳回期望類别類型的完全限定名或别名,集合的情況,是集合包含的類型,而不是集合本身。使用resultMap或resultType。

    4.resultMap(複雜傳回)

         傳回資料類型,命名引用外部的resultMap。傳回map是MyBatis最具力量的特性,對其有一個很好的了解的話,許多複雜映射的情形就能被解決了。使用resultMap或resultType,但不能同時使用

    5. flushCache

        若将其設定為true,不論語句什麼時候被調用,都會導緻緩存被清空,預設值:false

    6.statementType(可選配置,預設為PREPARED) 

        STATEMENT<PREPARED或CALLABLE的一個,這會讓MyBatis分别使用Statement,PreparedStatement或CallableStatement

    7.KeyProperty(僅對insert有用, 預設:unset,)

       唯一辨別一個屬性,MyBatis會通過getGenerateKeys的傳回值後者通過insert語句selectKey子元素設定它的鍵值,如果希望得到多個生成的列,也可以是逗号分隔的屬性名稱清單

    8.KeyColumn(僅對insert和update有用)

       通過生成的鍵值設定表中的列名,這個設定盡在某些資料庫是必須多的,當主鍵列不是表中的第一列的時候需要設定,如果希望得到過個生成的列,也可以是逗号分割的屬性名稱清單。

    9.userGeneratekeys(預設為false)

       僅對insert有用,令Mybatis使用jdbc的getGeneratedkeys方法來取出由資料庫内部生成的主鍵(如mysql)管理資料庫系統的自動遞增字段。

    10.Timeout(預設值為unset,依賴驅動)

      這設定是在抛出異常之前,驅動程式等待資料庫傳回請求結果的描述,預設為unset(依賴驅動)

五、常見屬性分析

     (1)parameterType使用

      Mybatis的傳入參數parameterType類型分為:

          基本資料類型:int,string,long,data

          複雜資料類型:實體類和Map

      如何擷取參數中的值:

         基本資料類型:#{參數}擷取參數中的值

         複雜資料類型:類是#{屬性名},map中則是#{key}

       注:傳入多個參數如何寫:

            無論傳入的參數是什麼,最後mybatis都會将傳入的轉換為map的,既然這樣,當傳入多個參數是,直接map類型,然後mapper.xml通過#{map.key}來擷取值即可,實作動态搜尋,或多個參數查詢

       I :Dao層的函數方法

        public User selectUser(String username,String password);  

<select id=”selectUser”resultType=”User”>
     Select * from user where username=#{0} and password=#{1}>
</select>
注:#{0}代表接收的是dao層的第一個參數,#{1}代表的是dao層的第二個參數
           

     II: Map傳多參數

      DAO:    public User selectUser(Map paramMap);

<select id=”selectUser” resultType=”User”>
Select * from user where username=#{username} and password=#{password}
</select>
           

     Service:

Private User selectUser(){
Mao paramMap=new hashMap();
 paramMap.put(“username”,”對應具體的參數值”);
 paramMap.put(“password”,”對應具體的參數值“);
User user=xx.selectUser(paramMap);
           

    III:基于注解(推薦)

        public List<User> selectUser(@Param(“username”)String username, @Param(“password”)String password)

<select id=”selectUser” resultMap=”usermap”>
   <select * from user where username=#{username} and password=#{password}
</select>
           

    (2) resultType:

        用于指定傳回類型,指定的類型可以是基本類型,可以是類,注意類要寫全名,并且如果傳回是集合,傳回類型為集合中泛型的類型

    (3)resultMap:

        resultMap和resultType作用類似,用于引導通過resultMap标簽定義的映射類型,查詢複雜資料,查詢多個表資料映射到一個結果集當中。如果需要查詢的隻是一個表。可以簡單定義實體類,實體代表資料庫表中的一條記錄,可以使用resultType;如果遇到一對多的問題,查詢是需要查詢多個表的列資訊,那麼便要使用resultMap

       使用resultMap 裡面的值為:resultMap标簽的id

六、resultMap标簽詳解

      配置resultMap标簽

<!--column不做限制,可以為任意表的字段,而property須為type 定義的pojo屬性-->
<resultMap id=" " type=" ">
     id :唯一的辨別 type:映射的pojo對象
  <id column=" "  jdbcType=" "  property=" " />
  <result column=" "  jdbcType=" "  property=" "/>
  <association property=" "  javaType=" ">
           <!--Property: pojo的一個對象屬性-->
           <!--javaType: pojo關聯的pojo對象-->
      <id column=" "  jdbcType=" "  property=" "/>
           <!--Column: 關聯pojo對象對應表的主鍵字段-->
           <!--JdbcType:字段類型-->
           <!--Property: 關聯pojo對象的主鍵屬性-->
     <result column=" " jdbcType=" " property=" "/>
  </association>
  <!-- 集合中的property須為oftype定義的pojo對象的屬性-->
  <collection property=" " ofType=" ">
           <!--Property: pojo的集合屬性-->
           <!--ofType: 集合中的pojo對象-->
       <id column=" " jdbcType=" " property=" " />
           <!--Column: 集合中pojo對象對應的表的主鍵字段-->
           <!--jdbcType: 字段類型-->
           <!--property: 集合中pojo對象的主鍵屬性-->
       <result column=" " jdbcType="字段類型" property=" " />  
           <!--Column: 可以為任意表的字段-->
           <!-- Property: 集合中的pojo對象的屬性-->
  </collection>
</resultMap>
           

     注:resultMap中對象屬性類中的字段和前面的字段名字最好别重複,否則查詢時會顯示前面的值;

            對象屬性類中的字段要在sql語句中列出

七、#{}和${}

         #{}表示一個占位符号,通過#{}可以實作preparedStatement向占位符中設定值,自動進行java類型和jdbc類型轉換,#{}可以有效防止sql注入。#{}可以接收簡單類型或pojo屬性值,如果parameterType傳輸單個簡單類型值,#{}括号中可以是value或其他名稱。

        ${}表示拼接sql,通過${}可以将parameterType傳入的内容拼接在sql中且不進行jdbc類型轉換,${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,${}括号中隻能是value

 例:實作模糊查詢:

      第一種使用#{}完成

     <select id=”queryUser” parameterType=”string”

        resultType=”com.fyl.User”>

        select * from user where username LIKE #{username}

    </select>

     測試:List<Object> list=sqlSession.selectList(“queryUser”,”%張%”);

     第二種:使用${}完成

    <select id=”queryUser” parameterType=”string”

         resultType=”com.fyl.User”>

         select * from user where username LIKE ‘%${value}%’

    <select>

    測試:List<Object> list=sqlSession.selectList(“queryUser”,”張”);

注:Mybatis使用order by 動态傳參問題?  

      mybatis在使用order by 時,要使用$符号,而不是#符号。

#将傳入的資料都當成一個字元串,會對自動傳入的資料加一個雙引号,如

      order by #{id} 傳入為id,解析為 order by ‘id’;

$将傳入的值直接顯示生成在sql中,如order by ${id}傳入為id,解析為order by id;

繼續閱讀