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")