1. 程式人生 > >SpringBoot中關於Mybatis使用的三個問題

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

封裝 valueof 源地址 bat sele 元素周期表 list rate 配置文件

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 各位晚上好技術分享圖片

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