1. 程式人生 > >Mybatis(二)[SqlMapConfig檔案配置、輸入輸出引數對映解讀] 菜鳥日記--day05(上)

Mybatis(二)[SqlMapConfig檔案配置、輸入輸出引數對映解讀] 菜鳥日記--day05(上)

Mybatis(二)[SqlMapConfig檔案配置、輸入輸出引數對映解讀]–day05 上

一、SqlMapConfig配置

1.properties屬性配置

1)單條屬性配置 不建議使用

<properties  >
		<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
</properties>

2) 從配置檔案中讀取配置

優點:sqlMapConfig.xml 中配置資訊過多,單獨拆分出去便於修改
載入db.properties檔案下的引數配置

<
properties
resource="db.properties">
</properties>

db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/taotao?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

屬性名儘量用特殊寫法,不易重複如:xxx.xxx.x 在原因獲取屬性優先順序。
這裡有一個還沒解決的問題,如何載入指定的多個配置檔案,不會插個眼

3)從Mapper.xml 檔案中獲取。

<select id="findTbUserById" parameterType="long"
		resultType="com.test.mybatis.pojo.TbUser">
		select * from tb_user where id=#{id}
	</select>

select * from tb_user where id=#{id}
如果這裡的#{id} 寫成上面 1) 2) 中配置的屬性名如:jdbc.url 將會將 1) 2)中的同名屬性覆蓋

4) 配置載入優先順序

順序
    1 sqlMapConfig.xml 中定義的配置屬性引數:1)
    2 db.properties resource引入配置 2)
    3 Mapper對映檔案中的引數 3)
優先順序:
引入順序執行同時,執行的是覆蓋操作,所以優先順序排序正好相反 3)→2)→1)

2.settings 設定

 全域性引數配置(調整執行引數:開啟二級緩衝、延遲載入等 如果設定錯誤將會影像程式正常執行)
詳細配置引數表

3.typealiases 別名配置

 在statement(Mapper對映檔案 select、insert。。。 )中使用全限定名輸入費勁。。可以通過定義別名的方式來簡化這個輸入。
定義別名(單個定義)

  <typeAlias type="com.test.mybatis.pojo.TbItem" alias="tbItem"/>

批量定義,掃描包

<package name="com.test.mybatis.pojo"/>

生成的別名就是包下的各個類的類名(首字母大小寫都可以)

4.typeHandlers

 通過typeHandlers可以完成java型別和jdbc型別的轉換

<select id="findTbUserById" parameterType="long" resultType="com.test.mybatis.pojo.TbUser">

比如這裡的輸入引數 long 實際後面sql語句執行過程中使用的是轉化過的jdbc型別,這一轉化功能就由typeHandlers型別處理器來實現
預設支援很多一般情況下就夠用了

5.mappers

**單條對映配置:**resource 指定單個對映檔案的位置

<mappers>

	<mapper resource="sqlmap/TbUser.xml" />
    //
</mappers>

**單條對映配置:**class 指定Mapper介面

	<mapper class="com.test.mybatis.mapper.TbUserMapper" />

多條對映配置(掃描包形式)

 <package name="com.test.mybatis.mapper"/>

二、包裝型別輸入輸出對映

1.輸入對映

 用於複雜的高階查詢,這時候輸入簡單型別、HashMap或者pojo型別都無法實現查詢的要求。
例如: 想要查詢3天內買過指定型別商品的5位女性客戶資訊

顯然輸入簡單型別、HashMap、User類、訂單類。。都不合適
那麼可以將用到的查詢條件進行封裝:將使用者類,訂單類,商品類、商品型別類還有查詢條數這些相關資訊封裝在一個Vo類中。然後將查詢依據的屬性屬性統一起來作為搜尋條件。
**也可以將User類 寫一個擴充套件類 顧客類 封裝進Vo類中。

SQL 語句中

使用這個Vo類做為輸入引數,Vo類中的一級屬性(比如查詢數目) 可以直接通過屬性名來獲取, 獲取屬性(如User)的內部屬性(如sex(性別))依照User.sex 格式來寫,沒啥說的廢話一句。

2.輸出對映

1)簡單型別

 只有輸出結果一行一列的情況下才會使用(誰說的?(好吧視訊老師說的),看好多帖子也是這樣寫的,我按使用者名稱查詢使用者id也可以使用簡單型別啊,返回List列表也是可以的說)

2)HashMap型別

 輸出的列名作為key,每行結果作為value。同樣介面返回型別判斷如使用selectList,將會返回一個List陣列HashMap作為元素。

3) pojo型別

 pojo型別物件作為返回引數型別,有如下三種情況

1)搜尋結果列和pojo物件屬性一樣多(每行對應一個屬性)。返回型別為pojo 沒有異議
2)列不夠用來對應每條屬性。 返回的pojo型別 不全 例如 如果select 不對 name欄位進行查詢
3)列沒有能用來和任意一條屬性對應的。(不會建立pojo物件)

上面的應該沒有異議
因為看的視訊學習的,沒有介紹查詢結果列 比pojo物件屬性多的情況
我來試試

首先 :最簡單的 在查詢結果集中隨便插入一行
select A=1, * from tb_user
 這一行 (之前用sql server寫)很簡單的沙雕語句,居然也會出錯。
 經過一番實驗搜尋,看到mysql二層查詢給的靈感
正確語句閃亮登場。。。

select 1 A, tb_user.* from tb_user

 因為一句sql語句高興成這樣,我也是醉了。
 好了,有了這一行sql 語句可以去實驗了。是爆錯(pojo吃撐),還是捨棄呢

<select id="findTbUserByName" parameterType="String"
		resultType="com.test.mybatis.pojo.TbUser">
		select 1 A, tb_user.* from tb_user where username like '%${value}%'
</select>

實驗結果是捨棄,並不會報錯

4)ResultMap

 因為3)中的種種問題,使用ResultMap代替ResultType
記一下思路,只學到最簡單常用的
1.定義resultMap和相關型別的對映
具體定義

    <resultMap type="最終對映成的java物件" id="用作唯一標識">
            <!--id指定主鍵列,result 對應非主鍵列-->
        <id column="ResultMap列名" property="Type指定的Pojo中的對應屬性名" /> 
        <result。。。。。。。>
    </reultMap>

這個是引用比較完全的配置 未測試等用再看

<!--column不做限制,可以為任意表的欄位,而property須為type 定義的pojo屬性-->
<resultMap id="唯一的標識" type="對映的pojo物件">
  <id column="表的主鍵欄位,或者可以為查詢語句中的別名欄位" jdbcType="欄位型別" property="對映pojo物件的主鍵屬性" />
  <result column="表的一個欄位(可以為任意表的一個欄位)" jdbcType="欄位型別" property="對映到pojo物件的一個屬性(須為type定義的pojo物件中的一個屬性)"/>
  <association property="pojo的一個物件屬性" javaType="pojo關聯的pojo物件">
    <id column="關聯pojo物件對應表的主鍵欄位" jdbcType="欄位型別" property="關聯pojo物件的主席屬性"/>
    <result  column="任意表的欄位" jdbcType="欄位型別" property="關聯pojo物件的屬性"/>
  </association>
  <!-- 集合中的property須為oftype定義的pojo物件的屬性-->
  <collection property="pojo的集合屬性" ofType="集合中的pojo物件">
    <id column="集合中pojo物件對應的表的主鍵欄位" jdbcType="欄位型別" property="集合中pojo物件的主鍵屬性" />
    <result column="可以為任意表的欄位" jdbcType="欄位型別" property="集合中的pojo物件的屬性" />  
  </collection>
</resultMap>

然後就是後面statement的resultMap=“resultMap的id”
先到這,今天進度好慢,好像出了大問題。 ——_——。。
含著淚標題寫的上,晚上還得加把勁。。。