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

执行结果如下:

相关推荐
bobz9657 小时前
小语言模型是真正的未来
后端
DevYK8 小时前
企业级 Agent 开发实战(一) LangGraph 快速入门
后端·llm·agent
一只叫煤球的猫9 小时前
🕰 一个案例带你彻底搞懂延迟双删
java·后端·面试
冒泡的肥皂9 小时前
MVCC初学demo(一
数据库·后端·mysql
颜如玉10 小时前
ElasticSearch关键参数备忘
后端·elasticsearch·搜索引擎
卡拉叽里呱啦11 小时前
缓存-变更事件捕捉、更新策略、本地缓存和热key问题
分布式·后端·缓存
David爱编程11 小时前
线程调度策略详解:时间片轮转 vs 优先级机制,面试常考!
java·后端
码事漫谈12 小时前
C++继承中的虚函数机制:从单继承到多继承的深度解析
后端
阿冲Runner12 小时前
创建一个生产可用的线程池
java·后端
写bug写bug12 小时前
你真的会用枚举吗
java·后端·设计模式