使用注意哪些問題,SpringBoot中關于Mybatis使用的三個問題

 2023-11-05 阅读 35 评论 0

摘要:SpringBoot中關于Mybatis使用的三個問題 ? ?轉載請注明源地址:http://www.cnblogs.com/funnyzpc/p/8495453.html   原本是要講講PostgreSQL的一些學習總結的,不巧的是最近一段時間的進度都是一些類似于加減乘除、位移、類型轉換的稍顯小兒科的一些內容࿰

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     }

maven java?

代碼其實就一行(以上紅色著重部分),這里的“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.*”,只有一句,這里我就不截圖了,好了,問題解決(。?ˇ?ˇ?)。

Springboot注解?  接下來,第二個問題總結:“連表查詢時的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>

MybatisPlus。在映射的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對象中,就是調用插入后已經自動寫入了主鍵。

Mybatis框架,以上是一般解決辦法,如果用我大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,本章完結!

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

?

轉載于:https://www.cnblogs.com/funnyzpc/p/8495453.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/166721.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息