MyBatis-plus+达梦数据库出现的坑

学海无涯,旅“途”漫漫,“途”中小记,如有错误,敬请指出,在此拜谢!

前情提要

今日,公司的项目使用的是达梦数据库7+jdk1.8+麒麟系统+SpringBoot+Mybatis-plus。走过了很多坑,特此记录,供给同胞们警醒。

问题汇总

1.Mybatis-plus的支持性

根据官网上的提供,mybatis-plus的generator自动生成器,在3.3.0以上的版本才能支持,所以如果想使用自动生成器的小伙伴,建议使用3.3.0以上的版本。

3.3.0以上的版本对达梦的支持性更强,建议直接使用3.3.0

2.Mybatis-plus的save&saveBatch

作为超级好用的Mybatis-plus,里面封装了好多方法供开发人员使用。但是有些方法是不兼容达梦数据库的。比如博主现在发现的save和saveBatch方法。所以此处建议使用自己手写的insert的sql来实现。

save和saveBatch方法,经过排查,发现是因为mp的save和saveBatch方法,生成的sql是有换行符的,这个换行符达梦数据库的部分版本是无法解析的。(可能是因为部分配置原因,也可能是因为版本原因。跟mp的研发人员交流说是达梦的问题,询问达梦的支持人员,没有解决,所以不了了之了。)

3.保存方法返回数据库id

一般在保存的方法的xml中,会加入一下语句,来确保方法会返回id。

useGeneratedKeys="true" keyProperty="id"

但是经过博主验证发现,使用批量插入的sql时,是无法传回id的,原因未知。(同样的版本,同样的方法,在mysql是可以回传的)

<insert id="insertBatchDm" useGeneratedKeys="true" keyProperty="id">
        insert into tables (column1,column2) values
        <foreach collection="list" item="item" separator=",">
            (#{item.1},#{item.2})
        </foreach>
    </insert>

4.保存方法后查询问题

发现了一个问题:在同一个事务中,如果先保存,再根据selectById查询该数据,无法查询出来。

public void a(){
	ClassA a = new ClassA();
	this.baseMapper.save(a);
	this.baseMapper.selectById(a.getId());//此处a.getId()能取出数据,但是selectById取出的数据为null
}

最终经过测试发现,博主的项目使用的是dmjdbc17+达梦7+jdk1.8。发现这个问题是必现的。经过跟达梦的巡视人员沟通,将dmjdbc的版本更新到了18之后,此问题解决。

5.达梦数据库建表之后再添加TEXT字段

在数据库设计完之后,发现一张表需要加一个大字段,使用如下语句执行后报错

alter table 表 add column 字段 TEXT;

执行失败
第一行附近出现错误(-3243)
表XXX中不能同时包含聚集KEY和大字段

在于达梦的技术人员沟通后,他们解释”在达梦7.15版本之后聚集主键和大字段不能共存,需要修改达梦数据库的配置文件,将默认主键创建为普通主键,即非聚集,修改./data/数据库实例/dm.ini中的参数PK_WITH_CLUSTER改为0即可“。 但是有个问题,生产的库甲方在用着,没法修改配置重启啊。 最后通过查询百度得知方案: 方法1.删了表,然后再重新创建表,建表的时候不会有这样的问题 方法2.建表的时候

不要用
CLUSTER PRIMARY KEY("ID")

直接写成
NOT CLUSTER PRIMARY KEY("ID")
经验分享 程序员 微信小程序 职场和发展