MyBatis异常记录 - java.sql.SQLSyntaxErrorException

1.问题描述

pojo类:

java 复制代码
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class User {
    private Integer id;
    private String name;
    private Integer age;
    private String email;

    public User(String name, Integer age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
}

Dao类:

java 复制代码
@Mapper
public interface UserDao {
    void insertBatch(@Param("users") List<User> users);
}

Mapper文件:

xml 复制代码
<insert id="insertBatch" useGeneratedKeys="true" 
        keyProperty="id" parameterType="User">
    INSERT INTO user (`name`, age, email) values
    <foreach collection="users" item="item" separator="," >
        (#{item.name,jdbcType=VARCHAR}, #{item.age,jdbcType=INTEGER}, #{item.email,jdbcType=VARCHAR})
    </foreach>
</insert>

测试代码:

java 复制代码
@Test
public void test_insertBatch(){
    List<User> users = new ArrayList<User>(){{
        User user = new User("sumAll",22,"sumAll@163.com");
        User user2 = new User("sumAll2",20,"sumAll2@163.com");
    }};
    userDao.insertBatch(users);
    logger.info(users.toString());
}

执行测试代码后,报以下错误:

org.springframework.jdbc.BadSqlGrammarException:

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 '' at line 1

The error may exist in file xxx

The error may involve com.sumAll.dao.UserDao.insertBatch-Inline

The error occurred while setting parameters

SQL: INSERT INTO user (name, age, email) values

大伙儿,发现哪里的问题导致了这个异常吗?

2.问题分析

观察测试代码发现,实例化的 user 并未添加进入 List 容器,导致 List 容器为空。

由于 List 为空, 最终生成的 SQL 语句变为 INSERT INTO user (name, age, email) values,这就产生了 SQL 语法错误异常。

因此在使用批量插入语句之前,应当对集合进行判空处理。修改后的测试代码如下:

java 复制代码
@Test
public void test_insertBatch(){
    List<User> users = new ArrayList<User>(){{
        User user = new User("sumAll",22,"sumAll@163.com");
        User user2 = new User("sumAll2",20,"sumAll2@163.com");
        add(user);
        add(user2);
    }};
    if(!users.isEmpty()){
        userDao.insertBatch(users);
        logger.info(users.toString());
    }
}

执行结果如下:

相关推荐
葫芦和十三3 小时前
图解 MongoDB 05|文档模型设计:内嵌 vs 引用,反范式不是免费午餐
后端·mongodb·agent
不能放弃治疗7 小时前
单 Agent 实现模式
后端
IT_陈寒9 小时前
Redis内存爆了,原来我漏掉了这个致命配置
前端·人工智能·后端
fliter10 小时前
最后一块拼图:用 bitvec 构造 IPv4 包,真正做出自己的 Ping
后端
fliter11 小时前
用 Rust 解析并生成 ICMP 包:checksum、nom 与 cookie-factory
后端
蝎子莱莱爱打怪11 小时前
XZLL-IM干货系列 03|消息 ID 设计:一个 UUID 搞不定的事,我用两个 ID 解决了
后端·面试·开源
fliter11 小时前
从 panic 到 Result:用 Rust 重新整理一个 ping 项目的错误处理
后端
森蓝情丶11 小时前
我给 AI 搭了个法庭:一个前端仔的 LangGraph 实战全记录
前端·后端
JensCS猿12 小时前
从 Spring Boot 回看 SSM 框架:手动挡与自动挡的驾驶哲学
后端
爱勇宝12 小时前
干了近 8 年,一夜之间被裁:AI 时代,程序员最该害怕的不是 AI
前端·后端·程序员