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 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
狼爷4 小时前
从零用 Java 构建 AI Agent 框架:JavaManus 设计与实现深度解析
后端·langchain·aigc
郑州光合科技余经理4 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
专业程序开发源4 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
专业程序开发源4 小时前
springboot社区养老系统44071-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计
小呆呆6665 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
周杰伦fans5 小时前
8GB显存下模型量化实战指南
人工智能·后端·c#
小蒜学长6 小时前
基于SpringBoot的佳新超市管理系统设计与实现系统(代码+数据库+LW)
java·数据库·spring boot·后端·佳新超市管理系统
IT_陈寒6 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
打工仔折腾 AI7 小时前
把AI Agent托管在家用电脑:UU远程终端与端口映射实测记录
人工智能·后端·python·langchain·ai agent 实战