Mybatis - tk.mybatis deleteByPrimaryKey无法正确识别主键

    为了给项目其他人提供模块的swagger服务,在本地window里安装了ubuntu子系统,将模块服务运行在Tomcat中,奇怪的是,每天晚上下班时启动服务,早上上班来就会看到日志catalina.out文件都会暴增到10G左右,今天刚好有空,来查一查这个问题。。。 

org.springframework.dao.DataIntegrityViolationException:
### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1' for column 'created' at row 1
### The error may involve com.xxx.xxx.repository.xxx.deleteByPrimaryKey-Inline
### The error occurred while setting parameters
### SQL: DELETE FROM xxxx WHERE  id = ? AND cid = ? AND xxx_id = ? AND xxx_num = ? AND created = ? AND xxx = ?
### Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1' for column 'created' at row 1
; Data truncation: Incorrect datetime value: '1' for column 'created' at row 1; nested exception is com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1' for column 'created' at row 1
        at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
        at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
        at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
        at com.sun.proxy.$Proxy45.delete(Unknown Source)
        at org.mybatis.spring.SqlSessionTemplate.delete(SqlSessionTemplate.java:310)
        at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:68)
        at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
        at com.sun.proxy.$Proxy96.deleteByPrimaryKey(Unknown Source)

    首先日志中出现大量DELETE FROM 的SQL语句,但是参数却有点怪怪的。。。

JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@3cd9a44f] will not be managed by Spring
==>  Preparing: DELETE FROM xxx WHERE id = ? AND cid = ? AND xxx_id = ? AND xxx_num = ? AND created = ? AND xxx = ?
==> Parameters: 1(Long), 1(Long), 1(Long), 1(Long), 1(Long), 1(Long)

    对应的代码部分是: 

xxxxMapper.deleteByPrimaryKey(v.getId());

    这个是Mybatis自带的根据主键ID删除表数据的方法啊,怎么会出现问题???

package tk.mybatis.mapper.common.base.delete;

import org.apache.ibatis.annotations.DeleteProvider;
import tk.mybatis.mapper.annotation.RegisterMapper;
import tk.mybatis.mapper.provider.base.BaseDeleteProvider;

/**
 * 通用Mapper接口,删除
 *
 * @param <T> 不能为空
 * @author liuzh
 */
@RegisterMapper
public interface DeleteByPrimaryKeyMapper<T> {

    /**
     * 根据主键字段进行删除,方法参数必须包含完整的主键属性
     *
     * @param key
     * @return
     */
    @DeleteProvider(type = BaseDeleteProvider.class, method = "dynamicSQL")
    int deleteByPrimaryKey(Object key);

}

    经过排查,发现是因为在实体类的id参数,没有配置主键ID的注解,导致mybatis找不到这条删除语句的主键,所以才会出现这个问题。

    需,加上@Id注解,表明该id是主键ID,才能保证删除逻辑执行正常。

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    ps:当然,也可以直接手写SQL语句,进行删除(不推荐)

    @Delete("DELETE FROM xxxx WHERE id=#{id}")
    void deleteInfoById(@Param("id") Long id);

 

posted @   zhangdaopin  阅读(296)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示