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());
    }
}

执行结果如下:

相关推荐
yyycqupt1 小时前
多路转接之poll
服务器·c++·后端·网络协议
泰山小张只吃荷园2 小时前
通过SpringTask模拟打印机定时向数据库传入模拟数据
java·开发语言·后端·spring·mybatis
小技与小术3 小时前
go环境搭建
开发语言·后端·golang
伍肆伍柒3 小时前
SpringBoot 2.2.10 无法执行Test单元测试
spring boot·后端·单元测试
hummhumm3 小时前
第 14 章 -Go语言 错误处理
java·开发语言·前端·后端·python·sql·golang
Yanbin_Q4 小时前
从 Rust 官方文档理解 Ownership
开发语言·后端·rust
jooLs薯薯熹4 小时前
项目测试 - 哪些工具可以实现测试 Mock?
java·后端
徐寿春4 小时前
SpringBoot -- 自动化装配源码
spring boot·后端·自动化
摆烂工程师4 小时前
GPT4变笨了?教你解决GPT4降智问题!同时封装了个Chrome扩展程序进行检查GPT
前端·后端·程序员
yanessa_yu4 小时前
Maven项目报错:Blocked mirror for repositories
后端·maven