mybatis總概覽(4)(resultType,動態sql(where,if,foreach))


1,輸出映射

1.1,resultType

輸出pojo或者list(上面都有見過了):

使用resultType進行輸出映射,只有查詢出來的數據列名和pojo中的屬性名一致,該列才可以映射成功。
如果查詢出來的列名和pojo中的屬性名全部不一致,沒有創建pojo對象。
只要查詢出來的列名和pojo中的屬性有一個一致,就會創建pojo對象。
比如:本該返回一個pojo對象的list的,但是pojo屬性和數據庫返回數據的字段不匹配,那么list長度會是實際返回個數,但是列表的元素都是null.

輸出簡單類型:

Mapper.xml文件
<!-- 獲取用戶列表總數 -->
    <select id="findUserCount" parameterType="user" resultType="int"> select count(1) from user </select>
Mapper接口
public int findUserCount(User user) throws Exception;
調用:
Public void testFindUserCount() throws Exception{ //獲取session SqlSession session = sqlSessionFactory.openSession(); //獲取mapper接口實例 UserMapper userMapper = session.getMapper(UserMapper.class); User user = new User(); user.setUsername("管理員"); //傳遞Hashmap對象查詢用戶列表 int count = userMapper.findUserCount(user); //關閉session  session.close(); }

查詢出來的結果集只有一行且一列,可以使用簡單類型進行輸出映射。

輸出hashmap

輸出pojo對象可以改用hashmap輸出類型,將輸出的字段名稱作為map的key,value為字段值。

1.2,resultMap使用方法

resultType可以指定pojo將查詢結果映射為pojo,但需要pojo的屬性名和sql查詢的列名一致方可映射成功。
    
如果sql查詢字段名和pojo的屬性名不一致,可以通過resultMap將字段名和屬性名作一個對應關系 ,resultMap實質上還需要將查詢結果映射到pojo對象中。 resultMap可以實現將查詢結果映射為復雜類型的pojo,比如在查詢結果映射對象中包括pojo和list實現一對一查詢和一對多查詢。

即:可以將數據放入任何想要的一個對象中(對象屬性和數據列不需要一致)。

 

如果查詢出來的列名和pojo的屬性名不一致,通過定義一個resultMap對列名和pojo屬性名之間作一個映射關系:

1、定義resultMap
2、使用resultMap作為statement的輸出映射類型

 定義reusltMap

<id />:此屬性表示查詢結果集的唯一標識,非常重要。如果是多個字段為復合唯一約束則定義多個<id />。
Property:表示person類的屬性。
Column:表示sql查詢出來的字段名。
Column和property放在一塊兒表示將sql查詢出來的字段映射到指定的pojo類屬性上。

<result />:普通結果,即pojo的屬性。

使用resultMap作為statement的輸出映射類型

 

mapper.java

測試

小結

使用resultType進行輸出映射,只有查詢出來的列名和pojo中的屬性名一致,該列才可以映射成功。
如果查詢出來的列名和pojo的屬性名不一致,通過定義一個resultMap對列名和pojo屬性名之間作一個映射關系。

 2, 動態sql

mybatis核心 對sql語句進行靈活操作,通過表達式進行判斷,對sql進行靈活拼接、組裝。

(ps:即傳入數據的正確驗證在sql中進行)

需求:

用戶信息綜合查詢列表和用戶信息查詢列表總數這兩個statement的定義使用動態sql。

對查詢條件進行判斷,如果輸入參數不為空才進行查詢條件拼接。

mapper.xml

測試代碼

 

3,sql片段

 需求:

將上邊實現的動態sql判斷代碼塊抽取出來,組成一個sql片段。其它的statement中就可以引用sql片段。方便程序員進行開發。

定義sql片段

 

引用sql片段

在mapper.xml中定義的statement中引用sql片段:

4,foreach

向sql傳遞數組或List,mybatis使用foreach解析

補充:傳入參數為list、數組、map寫法

需求:

在用戶查詢列表和查詢總數的statement中增加多個id輸入查詢。sql語句如下:

兩種方法:
1,SELECT * FROM USER WHERE id=1 OR id=10 OR id=16 2,SELECT * FROM USER WHERE id IN(1,10,16)

 在輸入參數類型中添加List<Integer> ids傳入多個id

修改mapper.xml

WHERE id=1 OR id=10 OR id=16
在查詢條件中,查詢條件定義成一個sql片段,需要修改sql片段。

(ps:其中item的值可以隨便取,但是需要和占位符中字段一致。)

測試:

另外一個sql的實現:

 

 總結:

mybatis是什么?

mybatis是一人持久層框架,mybatis是一個不完全的ORM框架。sql語句需要程序員自己去編寫,但是mybatis也有映射(輸入參數映射、輸出結果映射)。
mybatis入門門檻不高,學習成本低,讓程序員把精力放在sql語句上,對sql語句優化非常方便,適用與需求變化較多項目,比如互聯網項目。

mybatis框架執行過程:

1、配置mybatis的配置文件,SqlMapConfig.xml(名稱不固定)

2、通過配置文件,加載mybatis運行環境,創建SqlSessionFactory會話工廠 SqlSessionFactory在實際使用時按單例方式。 3、通過SqlSessionFactory創建SqlSession SqlSession是一個面向用戶接口(提供操作數據庫方法),實現對象是線程不安全的,建議sqlSession應用場合在方法體內。 4、調用sqlSession的方法去操作數據。 如果需要提交事務,需要執行SqlSession的commit()方法。 5、釋放資源,關閉SqlSession

mybatis開發dao的方法:

1、原始dao 的方法
         需要程序員編寫dao接口和實現類
         需要在dao實現類中注入一個SqlSessionFactory工廠。
 
2、mapper代理開發方法(建議使用) 只需要程序員編寫mapper接口(就是dao接口) 程序員在編寫mapper.xml(映射文件)和mapper.java需要遵循一個開發規范: 1、mapper.xml中namespace就是mapper.java的類全路徑。 2、mapper.xml中statement的id和mapper.java中方法名一致。 3、mapper.xml中statement的parameterType指定輸入參數的類型和mapper.java的方法輸入 參數類型一致。 4、mapper.xml中statement的resultType指定輸出結果的類型和mapper.java的方法返回值類型一致。

SqlMapConfig.xml配置文件:可以配置properties屬性、別名、mapper加載。。。

輸入映射:

 parameterType:指定輸入參數類型可以簡單類型、pojo、hashmap。。
 對於綜合查詢,建議parameterType使用包裝的pojo,有利於系統 擴展。

輸出映射:

        resultType:
                   查詢到的列名和resultType指定的pojo的屬性名一致,才能映射成功。

         reusltMap:
                   可以通過resultMap 完成一些高級映射。
                如果查詢到的列名和映射的pojo的屬性名不一致時,通過resultMap設置列名和屬性名之間的對應關系(映射關系)。可以完成映射。
                   高級映射:
                            將關聯查詢的列映射到一個pojo屬性中。(一對一)
                            將關聯查詢的列映射到一個List<pojo>中。(一對多)

動態sql:(重點)

        if判斷(掌握)
         where
         foreach
         sql片段(掌握)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM