最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis注解開發(fā)-@Insert和@InsertProvider的使用

 更新時間:2022年07月04日 10:29:53   作者:哈夫熱曼  
這篇文章主要介紹了MyBatis注解開發(fā)-@Insert和@InsertProvider的使用,具有很好的參考價值,希望對大家有所幫助。

@Insert和@InsertProvider的使用

首先,在mybatis-generator.xml中配置返回主鍵

UserMapper中的

  • @SelectKey:返回主鍵,具體解釋見下面說明
  • @InsertProvider:type指明SQL工廠類,method是工廠類里對應的方法

@SelectKey注解源碼

  • statement是要運行的SQL語句,它的返回值通過resultType來指定before表示查詢語句statement運行的時機
  • keyProperty表示查詢結(jié)果賦值給代碼中的哪個對象,keyColumn表示將查詢結(jié)果賦值給數(shù)據(jù)庫表中哪一列
  • keyProperty和keyColumn都不是必需的,有沒有都可以
  • before=true,插入之前進行查詢,可以將查詢結(jié)果賦給keyProperty和-keyColumn,賦給keyColumn相當于更改數(shù)據(jù)庫
  • befaore=false,先插入,再查詢,這時只能將結(jié)果賦給keyProperty
  • 賦值給keyProperty用來“讀”數(shù)據(jù)庫,賦值給keyColumn用來寫數(shù)據(jù)庫

selectKey的兩大作用:

  • 1、生成主鍵;
  • 2、獲取剛剛插入數(shù)據(jù)的主鍵。

注意:在MYSQL 中 , order是AFTER , 因為當前及記錄的主鍵值在insert語句執(zhí)行成功之后才能拿到 , 而在ORACLE中 ,oder是BEFORE , 因為ORACLE需要先從序列取到值 , 再將其作為主鍵插入到數(shù)據(jù)庫

另外,附上UserMapper.xml形式的返回主鍵方法

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
實體類的映射文件
namespace 指定接口的類全名
-->
<mapper namespace="com.wzl.dao.UserMapper">
       <!--
            方案一: 這表的主鍵必須是自增長的 auto_increment
                 useGeneratedKeys="true" 讓自增長的主鍵開啟返回功能
                 keyColumn="id"  user表中主鍵列
                 keyProperty="id" user實體主鍵屬性
                 注意:支持主鍵自增類型的數(shù)據(jù)庫 MySQL 和 SqlServer , oracle不支持
       -->
    <insert id="addUser" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
         insert into user values(null,#{user.username},#{user.birthday},#{user.sex},#{user.address})
    </insert>
    <!--
            方案二: <selectKey>
             keyColumn="id" user表中主鍵列
             keyProperty="id" user實體主鍵屬性
             resultType="int" user實體主鍵屬性類型
             order="AFTER"  表示此標簽內(nèi)部sql語句在insert執(zhí)行之前(執(zhí)行),還是之后執(zhí)行(執(zhí)行)
                AFTER 之后執(zhí)行【在自增主鍵時】
                BEFORE 之前執(zhí)行【使用指定主鍵時】
在MYSQL 中 , order是AFTER , 因為當前及記錄的主鍵值在insert語句執(zhí)行成功之后才能拿到 , 而在ORACLE中 ,oder是BEFORE , 因為ORACLE需要先從序列取到值 , 再將其作為主鍵插入到數(shù)據(jù)庫
    -->
    <insert id="addUser2">
        <selectKey keyColumn="id" keyProperty="id" resultType="int" order="AFTER">
            SELECT LAST_INSERT_ID()
        </selectKey>
        insert into user values(null, #{username},#{birthday},#{sex},#{address})
    </insert>
</mapper>

使用InsertProvider注解報錯解決過程

目前項目在使用mybatis,并且是使用注解的方式。

在使用InsertProvider注解的時候報了一下的錯誤:

org.apache.ibatis.builder.BuilderException: Could not find value method on SQL annotation.  Cause: org.apache.ibatis.builder.BuilderException: Error creating SqlSource for SqlProvider. Method........

注解是如下這個樣子的

@InsertProvider(method = "insertlist",type=SqlProvider.class)
?public int insertInnerTable(List list,String dbTable);

思路是要寫一個通用的插入一個集合的方法,但是在執(zhí)行的時候就報了上面的錯誤。在網(wǎng)上查資料未果。

于是只能自己動手,豐衣足食了。

一步步跟斷點,跟到mybatis了報錯的方法中,發(fā)現(xiàn)了如下的代碼

try {
? ? ? this.sqlSourceParser = new SqlSourceBuilder(config);
? ? ? this.providerType = (Class<?>) provider.getClass().getMethod("type").invoke(provider);
? ? ? providerMethodName = (String) provider.getClass().getMethod("method").invoke(provider);
? ? ? for (Method m : this.providerType.getMethods()) {
? ? ? ? if (providerMethodName.equals(m.getName())) {
? ? ? ? ? if (m.getParameterTypes().length < 2
? ? ? ? ? ? ? && m.getReturnType() == String.class) {
? ? ? ? ? ? this.providerMethod = m;
? ? ? ? ? ? this.providerTakesParameterObject = m.getParameterTypes().length == 1;
? ? ? ? ? }
? ? ? ? }
? ? ? }
? ? } catch (Exception e) {
? ? ? throw new BuilderException("Error creating SqlSource for SqlProvider. ?Cause: " + e, e);
? ? }

注意標黃的位置,終于發(fā)現(xiàn)導致錯誤的罪魁禍首了,原來是這里限制了參數(shù)的個數(shù),不能操作兩個參數(shù)的啊。

于是將方法以及注解改為如下形式

@InsertProvider(method = "insert",type=SqlProvider.class)
?public int insert(SqlContext sqlContext);

在SqlProvider中對應的方法為

public String insert(SqlContext sqlContext){
? ? ? ........
}

至此問題解決!

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。 

相關文章

  • mybatis多對多關聯(lián)實戰(zhàn)教程(推薦)

    mybatis多對多關聯(lián)實戰(zhàn)教程(推薦)

    下面小編就為大家?guī)硪黄猰ybatis多對多關聯(lián)實戰(zhàn)教程(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • SpringFramework應用接入Apollo配置中心過程解析

    SpringFramework應用接入Apollo配置中心過程解析

    這篇文章主要介紹了SpringFramework應用接入Apollo配置中心過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • 解決FastJson中

    解決FastJson中"$ref重復引用"的問題方法

    這篇文章主要介紹了解決FastJson中"$ref重復引用"的問題方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • SSM框架+Plupload實現(xiàn)分塊上傳大文件示例

    SSM框架+Plupload實現(xiàn)分塊上傳大文件示例

    這篇文章主要介紹了SSM框架+Plupload實現(xiàn)分塊上傳示例(Spring+SpringMVC+MyBatis+Plupload),將用戶選中的文件(可多個)分隔成一個個小塊,依次向服務器上傳,有興趣的可以了解一下。
    2017-03-03
  • 關于兩個BeanUtils.copyProperties()的用法及區(qū)別

    關于兩個BeanUtils.copyProperties()的用法及區(qū)別

    這篇文章主要介紹了關于兩個BeanUtils.copyProperties()的用法及區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 關于maven項目引入maven庫沒有的jar處理辦法

    關于maven項目引入maven庫沒有的jar處理辦法

    這篇文章主要介紹了關于maven項目引入maven庫沒有的jar處理辦法,在平時開發(fā)中,有些jar包是不存在maven中央庫中的,那么此時該如何解決才能方便后續(xù)處理呢,需要的朋友可以參考下本文
    2023-03-03
  • linux下用renameTo方法修改java web項目中文件夾名稱的實例

    linux下用renameTo方法修改java web項目中文件夾名稱的實例

    下面小編就為大家?guī)硪黄猯inux下用renameTo方法修改java web項目中文件夾名稱的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java 實戰(zhàn)練手項目之酒店管理系統(tǒng)的實現(xiàn)流程

    Java 實戰(zhàn)練手項目之酒店管理系統(tǒng)的實現(xiàn)流程

    讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實現(xiàn)一個酒店管理系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • MyBatis Generator 自定義生成注釋的方法

    MyBatis Generator 自定義生成注釋的方法

    這篇文章主要介紹了MyBatis Generator 自定義生成注釋的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • SpringCloud微服務開發(fā)基于RocketMQ實現(xiàn)分布式事務管理詳解

    SpringCloud微服務開發(fā)基于RocketMQ實現(xiàn)分布式事務管理詳解

    分布式事務是在微服務開發(fā)中經(jīng)常會遇到的一個問題,之前的文章中我們已經(jīng)實現(xiàn)了利用Seata來實現(xiàn)強一致性事務,其實還有一種廣為人知的方案就是利用消息隊列來實現(xiàn)分布式事務,保證數(shù)據(jù)的最終一致性,也就是我們常說的柔性事務
    2022-09-09

最新評論

襄垣县| 景谷| 康定县| 精河县| 宜川县| 镇平县| 临澧县| 平泉县| 惠州市| 朔州市| 利辛县| 北碚区| 乳山市| 若羌县| 营口市| 奉化市| 宁都县| 安徽省| 临邑县| 开封市| 襄城县| 盖州市| 永济市| 贵德县| 阿图什市| 万州区| 田阳县| 双桥区| 彭泽县| 黄骅市| 内乡县| 司法| 靖远县| 土默特左旗| 南华县| 枣庄市| 乐亭县| 汝州市| 佛坪县| 台中县| 娄底市|