当前位置: 首页 > 知识库问答 >
问题:

java - sql insert语法报错?

计均
2024-08-06

写了一个简单的插入语句,但是一直报错:

### Error updating database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')values( 'hello' at line 11 ### The error may exist in file [D:\mes-master\mes-master\ruoyi-system\target\classes\mapper\system\pnMapperRuKu.xml] ### The error may involve com.ruoyi.system.mapper.pnMapperRuKu.insertPnAssertRukuDetails-Inline ### The error occurred while setting parameters ### SQL: insert into pnAssertRukuDetails ( storageRoom, )values( ?, ) ### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')values( 'hello' at line 11 ; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')values( 'hello' at line 11

调用方法:

@Override
    public int insertPnCode(PnModelInOutInventory pnModelInOutInventory) {
//        pnMapperRuKu.insertPnAssertRuku(pnModelInOutInventory);
        return pnMapperRuKu.insertPnAssertRukuDetails(pnModelInOutInventory);
    }


mapper.xml----
<insert id="insertPnAssertRukuDetails" parameterType="com.ruoyi.system.domain.PnModelInOutInventory">
        insert into pnAssertRukuDetails (
     <if test="parentPnAssertRukuId != null and parentPnAssertRukuId != '' ">parent_pnAssertRuku_id,</if>
     <if test="materialInformation != null and materialInformation != '' ">materialInformation,</if>
     <if test="numbersRuKu != null and numbersRuKu != '' ">numbersRuKu,</if>
     <if test="qualified != null and qualified != '' ">qualified,</if>
     <if test="unit != null and unit != '' ">unit,</if>
     <if test="storageRoom != null and storageRoom != ''">storageRoom,</if>
     <if test="sn != null and sn != ''">sn,</if>
     <if test="remark != null and remark != ''">remark,</if>
     <if test="batchNumber != null and batchNumber != ''">batchNumber,</if>
    )values(
     <if test="parentPnAssertRukuId != null and parentPnAssertRukuId != '' ">#{parentPnAssertRukuId},</if>
     <if test="materialInformation != null and materialInformation != '' ">#{materialInformation},</if>
     <if test="numbersRuKu != null and numbersRuKu != '' ">#{numbersRuKu},</if>
     <if test="qualified != null and qualified != '' ">#{qualified},</if>
     <if test="unit != null and unit != '' ">#{unit},</if>
     <if test="storageRoom != null and storageRoom != ''">#{storageRoom},</if>
     <if test="sn != null and sn != ''">#{sn},</if>
     <if test="remark != null and remark != ''">#{remark},</if>
     <if test="batchNumber != null and batchNumber != ''">#{batchNumber},</if>
    )
</insert>

我对比了Mapper.xml中的语法,包括调整英文符号,调整英文的括号;都没有作用;

有么有大佬帮忙看下,问题出在哪里??

共有2个答案

傅越
2024-08-06

问题点在于: 类似如下示例SQL

name后面的 --> , <--

insert newschema.new_table (name,) values ('hello',);
鞠修雅
2024-08-06

问题出在你的 SQL 插入语句中,特别是在字段列表和值列表的结尾处。由于你使用了 <if> 标签来动态添加字段和值,如果所有的 <if> 条件都不满足(即所有字段都为空或未设置),那么 SQL 语句的字段列表和值列表的末尾将会包含多余的逗号,这会导致 SQL 语法错误。

为了解决这个问题,你可以使用 MyBatis 的 <trim> 标签来自动去除多余的逗号和可能的空白。<trim> 标签提供了 prefixsuffixprefixOverridessuffixOverrides 属性,可以帮助你更好地控制 SQL 语句的生成。

下面是修改后的 mapper.xml 中的 <insert> 语句:

<insert id="insertPnAssertRukuDetails" parameterType="com.ruoyi.system.domain.PnModelInOutInventory">
    INSERT INTO pnAssertRukuDetails 
    <trim prefix="(" suffix=")" suffixOverrides=",">
        <if test="parentPnAssertRukuId != null and parentPnAssertRukuId != ''">parent_pnAssertRuku_id,</if>
        <if test="materialInformation != null and materialInformation != ''">materialInformation,</if>
        <if test="numbersRuKu != null and numbersRuKu != ''">numbersRuKu,</if>
        <if test="qualified != null and qualified != ''">qualified,</if>
        <if test="unit != null and unit != ''">unit,</if>
        <if test="storageRoom != null and storageRoom != ''">storageRoom,</if>
        <if test="sn != null and sn != ''">sn,</if>
        <if test="remark != null and remark != ''">remark,</if>
        <if test="batchNumber != null and batchNumber != ''">batchNumber,</if>
    </trim>
    <trim prefix="VALUES (" suffix=")" suffixOverrides=",">
        <if test="parentPnAssertRukuId != null and parentPnAssertRukuId != ''">#{parentPnAssertRukuId},</if>
        <if test="materialInformation != null and materialInformation != ''">#{materialInformation},</if>
        <if test="numbersRuKu != null and numbersRuKu != ''">#{numbersRuKu},</if>
        <if test="qualified != null and qualified != ''">#{qualified},</if>
        <if test="unit != null and unit != ''">#{unit},</if>
        <if test="storageRoom != null and storageRoom != ''">#{storageRoom},</if>
        <if test="sn != null and sn != ''">#{sn},</if>
        <if test="remark != null and remark != ''">#{remark},</if>
        <if test="batchNumber != null and batchNumber != ''">#{batchNumber},</if>
    </trim>
</insert>

这里,<trim> 标签的 prefixsuffix 属性分别用于在字段列表和值列表的开头和结尾添加括号。suffixOverrides="," 属性则用于去除字段列表和值列表末尾的逗号。这样,无论哪些 <if> 条件满足,生成的 SQL 语句都会是正确的。

 类似资料:
  • 我的问题:三个线程的ID分别是A,B,C;,每个线程将自己的ID值在屏幕上打印5遍,打印顺序是ABCABC。 我编写的代码: 但是出现了错误 哪个地方出现了问题呢?

  • 问题内容: 这可以返回一个整数列表: 但是,如果我想让调用者指定通用类型怎么办?像这样的东西,尽管在语法上我不确定如何去做: 用法是: 问题答案: 关于参数化类型的通用工厂方法 看来您想编写方便的工厂方法来实例化通用集合。 您可以编写如下通用方法: 然后,您可以简单地编写: 请注意,在某些情况下,上述方法不必须的,你可以选择离开了实施的名字出来的方法和只使用名称(例如,)。 有效Java 2nd

  • 问题内容: 嗨,我在Grid视图中的android文档中遇到了以下代码。 在此 < ?>(作为stackoverflow添加的空间不允许没有空间)指示/做什么? 问题答案: <?>是通用类型的通配符,这意味着AdapterView的通用类型可以是任何东西。 更具体地说,在这种情况下,方法上的参数可能会接收带有绝对任何泛型类型的AdapterView。请注意,如果您想限制泛型类型,可以执行以下操作:

  • 问题内容: 这是我的解释,它是类模板,但是类?表示该类的名称不确定,并且扩展了Something类。 如果我的解释有问题,请告诉我。 问题答案: 你说的差不多。基本上,Java没有模板的概念(C ++有)。这称为泛型。这就定义了一个通用类,其通用属性是的任何子类。 如果您想了解模板和泛型之间的区别,建议阅读“ C++和Java中“泛型”类型之间有什么区别? ”。

  • 最近我在查看http://winterbe.com/posts/2015/04/07/java8-concurrency-tutorial-thread-executor-examples/tutorial,他使用了以下语法。

  • 如果我想用java编写而不是按常规编写的话,如何在BPMN Gateway diverge约束中使用varaible myTicket:(m:Ticket(status==Ticket.create))。

  • 本小节我们将介绍 Java 语言的基础语法,包括我们在编写第一个 Java 程序时已接触过的类、主方法的概念,以及在编程中给源代码文件和类起名字的时候应该注意什么,什么样的名字是可以使用的,什么样的名字是不可以使用的,还有如何为代码添加注释等内容。 只有掌握了这些最基础的知识,才能减少后续学习中的困扰,避免踩坑。 1. 基本语法 我们在前面完成了第一个 Java 程序,我们现在来回顾一下: 案例演

  • 根据antlr4书(第159页),并使用语法Ambig. g4,语法歧义可以通过以下方式报告: 或等效代码形式: grun命令使用antlr-4.5.3为我正确报告歧义。但是当我使用代码表单时,我没有收到歧义报告。这是命令跟踪: TestA_Listener.java代码如下: 有人能指出应该如何修改上述java代码以打印歧义报告吗? 为了完整起见,下面是代码 Ambig.g4 : 语法阿姆比格;