使用myabatis + postgreSql 中遇到的问题

问题一:字段名不存在

执行如下语句的时候出现了问题:

Test entity = new Test();
entity.setName(new RandomString().nextString());
entity.setFatherTestId(new RandomString().nextString());

Integer insNum = testMapper.insert(entity);

这里运用了mapper自带的insert方法向数据库中插入数据。

在用mapper进行插入的时候后,报了这样的错误: 字段名不存在。

使用myabatis + postgreSql 中遇到的问题_第1张图片

但是去数据表中查看,实际上是有fatherId这个字段的

就疑惑为什么后台会找不到这个字段


并仔细看红色的的报错,后台说fatherid这个字段找不到。
这里我发现了端倪,数据库中表定义的是fatherId, i这个字母是大写的。

猜测是由于数据库字段大小写的问题

之后去谷歌之后找到了答案:

原因:在于PostgreSQL对表名、字段名都是区分大小写的。在执行SQL时,那么不管你的SQL中字段是大写还是小写,最后都会默认转为小写去执行。

解决:

1. 数据库字段名改为小写。或者用下划线_分割。
后来改为下划线后运行正常

2. 写sql语句的时候,对表名或者字段名加上双引号

定义SQL的时候,对表名及字段名加上双引号,可以防止大写字段被转为小写去执行。

因为在PGSQL中,默认对SQL语句进行抹去双引号和大写转小写的其中一个且抹去双引号优先级比较高,因此当大写字段被加上双引号,只进行了抹去双引号的处理而不会再被转为小写了。

image.png

例如这样, 加上双引号。


最后由于我这里使用的是mapper自带的insert函数来进行数据插入,并没有自己写sql语句。
所以最后采用了第一种方式解决。

问题二:char(32)类型字段,查询出来的数据带有空格

Integer insNum = testMapper.insert(entity);
Assert.isTrue(insNum.equals(1), "insert success");

String id = entity.getId();
Test getEntity = testMapper.selectById(id);;
Assert.isTrue(getEntity.getName().equals(entity.getName()), "name not equal");

在后台单元测试的时候,进行了断言:插入的数据和查询出来的数据相同。

也就是说,将一条数据插入到数据库中,再将其查询出来,判断这两个数据的属性都相同。

但是单元测试一直没通过

在代码中打断点测试中发现,发现从数据库中查询出来的数据都带有空格。如下图。

使用myabatis + postgreSql 中遇到的问题_第2张图片

猜测是因为postgresql在保存的时候会,自动将数据长度用空格补充至32位。

结果用testMapper自带的selectById方法查询出数据的时候,就会带有空格。

如果是这样的话,用mapper查询数据出来之后,还需要用trim()函数将空格逐个去除。

你可能感兴趣的:(springboot)