Mybatis逆向工程Mapper.xml中字段与数据库中字段名字不一致

### Cause: java.sql.SQLSyntaxErrorException: Unknown column 'create_time' in 'field list'
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column 'create_time' in 'field list'] with root cause
java.sql.SQLSyntaxErrorException: Unknown column 'create_time' in 'field list'

数据库中t_emp表中字段名称为并没有create_time,并且在映射文件EmpMapper.xml有一些字段名称都没有生成.
我的数据库版本用的是
在这里插入图片描述
原因:
逆向工程生成代码的过程中,不光会根据我们指定数据库mybatis中的表生成了代码,而且还根据系统自带的同名数据库表又生成了代码,两张表名称相同,生成的代码都合并到了一起,导致了错误(推测:或者你其他自定义数据库中有同名的表,可能也会出错,因为我出现过这种问题)

解放方法一:修改逆向工程的jdbc配置(推荐)
在generatorConfig.xml的数据库连接信息处添加一条标签

<!--解决mysql驱动升级到8.0后不生成指定数据库代码的问题-->
 <property 
<think>我们已知用户之前的问题是关于MyBatis批量插入数据,并且我们给出了三种方法。现在用户的新问题是:“我想了解Java如何基于MyBatis并通过mapper.xml文件批量给数据库表格插入数据”,并且特别强调通过mapper.xml文件。 根据用户的问题,我们重点介绍使用mapper.xml实现批量插入的两种主要方式(即使用<foreach>标签的两种形式),并简要提及第三种方式(批处理)虽然直接写在mapper.xml中,但之相关。 同时,我们注意到用户提供的引用内容中,引用[4]提到了一个Mapper接口方法,用于多表批量插入,但参数是多个列表。这可以作为一个扩展点,但用户的问题主要是单表批量插入,所以我们主要讲单表。 我们将按照以下结构回答: 1. 使用<foreach>生成单条INSERT语句(VALUES多个值) 2. 使用<foreach>生成多条INSERT语句(用分号分隔) 3. 简要说明批处理模式(ExecutorType.BATCH)虽然mapper.xml中写循环,但是通常也需要在mapper.xml中定义单条插入语句,然后在Java代码中循环调用。 注意:由于用户特别要求通过mapper.xml文件,因此重点在前两种。 同时,我们根据引用[1][2]提到的MyBatis自动映射特性,说明在批量插入时,我们传入一个对象列表,MyBatis可以自动映射。 最后,生成相关问题。 </think> ### Java基于MyBatis通过mapper.xml批量插入数据的方法 在MyBatis中通过mapper.xml实现批量插入主要有两种核心方式,均利用`<foreach>`标签处理集合数据: #### 1. 单INSERT语句+多VALUES(推荐) **原理**:生成单条SQL包含多个`VALUES`子句 ```xml <!-- 在mapper.xml中定义 --> <insert id="batchInsertUsers" parameterType="java.util.List"> INSERT INTO users (name, email, create_time) VALUES <foreach collection="list" item="user" separator=","> (#{user.name}, #{user.email}, #{user.createTime}) </foreach> </insert> ``` **特点**: - 生成SQL示例:`INSERT ... VALUES (...), (...), ...` - 仅1次数据库交互,效率最高 - 自动映射对象属性到SQL参数(如`#{user.name}`)[^1][^2] - 需监控SQL长度(避免超过`max_allowed_packet`限制) #### 2. 多INSERT语句+分号分隔 **原理**:生成多条独立INSERT语句 ```xml <insert id="batchInsertUsers" parameterType="java.util.List"> <foreach collection="list" item="user" separator=";"> INSERT INTO users (name, email) VALUES (#{user.name}, #{user.email}) </foreach> </insert> ``` **特点**: - 生成SQL示例:`INSERT ...; INSERT ...; ...` - 需数据库支持多语句执行(MySQL需在JDBC url添加`allowMultiQueries=true`) - 网络开销大于单语句方式 #### Java调用示例 ```java // 注入Mapper @Autowired private UserMapper userMapper; public void insertUsers(List<User> users) { // 分批处理避免超长SQL List<List<User>> chunks = ListUtils.partition(users, 1000); for (List<User> chunk : chunks) { userMapper.batchInsertUsers(chunk); // 调用XML映射 } } ``` > **最佳实践**: > - 结合分页提交(如每1000条一次)避免内存溢出 > - MySQL中单条SQL超过4MB需调整`max_allowed_packet` > - 复杂对象映射可使用`<resultMap>`定义字段关系
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值