SpringBoot中關於Mybatis使用的三個問題

funnyZpC發表於2018-03-03

SpringBoot中關於Mybatis使用的三個問題

   轉載請註明源地址http://www.cnblogs.com/funnyzpc/p/8495453.html

  原本是要講講PostgreSQL的一些學習總結的,不巧的是最近一段時間的進度都是一些類似於加減乘除、位移、型別轉換的稍顯小兒科的一些內容,額~(ಠ .̫.̫ ಠ),這也不是什麼問題,只是覺得這中間沒什麼終點和難點可講的,也就暫時略過了~,這裡首先說聲抱歉啊,後續如有什麼使用難點或有趣的地方一定拿出來講講◠‿◠)ノ;額,每次開篇總要講一堆看似沒啥用的內容,有啥用,有啥用,?,想了許久,倒覺得有些用->就是一種習慣,總能記錄最近一段的心情。心情這東西捉摸不定,其實對開發也至關重要,比如元素週期表的誕生哈。。。

  由於年初才開始使用SpringBoot,這裡一般的問題均是SpringBoot框架下的問題,這次我講三點,也是我實際開發中碰到的哦( ̄﹏ ̄) =>

    1>按主鍵查詢時報dao型別不能轉換

    2>連表查詢時的mapper和dao方法

    3>插入資料返回主鍵的配置方法

  第一個問題:“按主鍵查詢時報dao型別不能轉換”。

  嗯~,可以看做是Mybatis的一個bug,目前只在tk版的mybatis中出現過,這裡先曬出程式碼和報錯資訊(◑‿◐ ):

1     @RequestMapping({"dao","dao2"})
2     public ZwPayLog dao(HttpServletRequest request){
3         ZwPayLog pl=zwPayLogMapper.selectByPrimaryKey(Long.valueOf(-1));
4         LOG.info("TestPay->get=>"+ JSON.toJSONString(pl));
5         return  pl;
6     }

程式碼其實就一行(以上紅色著重部分),這裡的“selectByPrimaryKey”方法是tk版Mybatis實現的,我只是借用;一開始使用Mybatis的時並沒有報過這種錯誤,有點兒摸不到頭腦,當時排查了好一會兒以為是自己的程式碼的有問題呢,後搜尋在StackOverflow中有人簡述了這個問題,大致的意思是tk版與SpringBoot1.5的相容問題,個人覺得是tk版Mybatis與SpringBoot沒整好的問題,且就當是一個bug吧,這裡為造福廣大入坑的盆友,貼出一個最簡單的解決方式=>

先在專案(或模組)的resources目錄下新建一個META-INF的資料夾,資料夾裡面放入一個spring-devtools.properties的檔案,for example:

然後這個配置檔案裡面新增這麼一句:“restart.include.companycommonlibs=tk/mybatis.*”,只有一句,這裡我就不截圖了,好了,問題解決(。◕ˇ∀ˇ◕)。

  接下來,第二個問題總結:“連表查詢時的mapper和dao方法”。

  這個問題本以為很簡單的,事實卻不是,一開始看老大或網上的樣例是這樣做的->在dao介面裡面直接繼承Mapper<entity>這樣一個通用的Mapper就可以了,簡潔到甚至不用在裡面宣告方法的,就像這樣( ͡° ͜ʖ ͡°)✧

1 public interface ZwCisReportMapper extends Mapper<ZwCisReport> {
2 }

但實際需求並不是一個單獨的表增刪改查,而是一個連表查詢,可能是對TK版Mybatis見識少,一時暈頭轉向,瘋狂在google中檢索相關內容,未遂。。。,最後,我使用原生的方法來解決的。

在這裡我演示下主要程式碼,首先在mapper的xml檔案裡面寫對應的連表查詢語句,比如這裡有兩個查詢語句宣告(getProject和getOrder)=>

(p2pEyeMapper.sql.xml)

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 3 <mapper namespace="*.security.admin.mapper.P2pEyeDao">
 4     <select id="getProject" resultType="*.security.admin.po.p2pEye.P2PeyeProject" parameterType="java.util.Map">
 5     <!-- 這裡具體SQL省略 -->
 6     </select>
 7     <select id="getOrder" resultType="*.security.admin.po.p2pEye.P2PeyeOrder" parameterType="java.util.Map">
 8         <!-- 這裡具體SQL省略 -->
 9     </select>
10 </mapper>

在對映的dao中宣告這兩個sql查詢的id名稱即可,記得namespace也要對應哦,嗯,繼續展示下 P2pEyeDao.java (dao)中的程式碼吧=>

1 @Mapper
2 public interface P2pEyeDao {
3     //獲取專案資訊(標)
4     List<P2PeyeProject> getProject(Map<String,Object> params);
5 
6     //獲取投標資訊
7     List<P2PeyeOrder> getOrder(Map<String,Object> params);
8 }

 額,這裡需要注意三點:

  1>比如在getProject方法中放置>1個引數的時候建議使用Map來傳參,嗯,如果可以的話可以寫一個po來封裝引數,這樣最好,如果想簡單點兒,比如這樣getProject(param,param2)的話很容易報引數找不到(params is not fund)錯誤

  2>如果通過封裝的引數體來傳參的話,需要在對應的select(xml中)的標籤中宣告“parameterType”這個引數值

  3>resultType這個返回值必填,且需要和dao中宣告的方法一致才可

至於怎麼用,這裡不再贅述了吧,讀者懂得( ื▿ ื)。

  講講第三個問題:“插入資料返回主鍵的配置方法”。

  這個問題本不是問題,在這裡我只是提供一個tk版的簡潔解決方法。先說說網民們給的一般解決思路是什麼吧,在原生mybatis中大概是這樣子的:

<insert id="insertProduct" parameterType="domain.model.ProductBean" >
       <selectKey resultType="java.lang.Long" order="AFTER" keyProperty="productId">
          SELECT LAST_INSERT_ID()
      </selectKey>
        INSERT INTO t_product(productName,productDesrcible,merchantId)values(#{productName},#{productDesrcible},#{merchantId});
    </insert>

dao中是這樣子的:

1 @Mapper
2 public interface XXDao{
3     Integer insertProduct(ProductBean pb);
4 }

嗯,我想這裡唯一需要注意的一點兒是呼叫“insertProduct”這個方法之後返回的Integer不是主鍵,不是主鍵,不是主鍵!!!,二是在執行這個插入後的“ProductBean”型別的pb物件中,就是呼叫插入後已經自動寫入了主鍵。

以上是一般解決辦法,如果用我大TK的方式(這裡說的是隻在單表Mapper下),可就簡單多了。

由於tk用的是通用mapper來實現dao與xml對應的,xml裡面只用宣告對應的實體與表的對映引數就可以了,具體的sql實現是不用寫的(這裡需要通用Mapper的泛型),這時候dao就如下這麼簡單:

1 public interface ZwCisReportMapper extends Mapper<ZwCisReport> {
2 }

但是實際使用的時候自動生成id的那個欄位一定要這樣宣告->

1     /**
2      * 主鍵ID
3      */
4     @Id
5     @GeneratedValue(strategy = GenerationType.IDENTITY)//設定為主鍵自增以回寫主鍵
6     private Long id;

額,其實重點就是一個“@GeneratedValue”註解●ω●,這個是框架提供的方式,需要一看究竟的請自行搜尋,至於生成的主鍵也是在呼叫後再傳入的實體裡面。

  OK,本章完結!

現在是:2018-03-03 20:19:54 各位晚上好

 

相關文章