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

执行结果如下:

相关推荐
i***22076 分钟前
springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice
spring boot·后端·docker
e***877036 分钟前
windows配置永久路由
android·前端·后端
代码or搬砖42 分钟前
SpringMVC的执行流程
java·spring boot·后端
极光代码工作室2 小时前
基于SpringBoot的流浪狗管理系统的设计与实现
java·spring boot·后端
Rust语言中文社区2 小时前
【Rust日报】Dioxus 用起来有趣吗?
开发语言·后端·rust
小灰灰搞电子2 小时前
Rust Slint实现颜色选择器源码分享
开发语言·后端·rust
boolean的主人2 小时前
mac电脑安装nginx+php
后端
boolean的主人2 小时前
mac电脑安装运行多个php版本
后端
oouy3 小时前
Java的三大特性:从懵圈到通透的实战指南
后端
狂炫冰美式3 小时前
3天,1人,从0到付费产品:AI时代个人开发者的生存指南
前端·人工智能·后端