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 各位晚上好