Mybatis(二)映射文件

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;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章