2 jingguo vip jingguo_vip 于 2017.09.14 00:32 提问

关于mybatis的一个问题

最近在看一个项目,看到购物车模块的时候,有个批量删除购物车商品的方法。
有点搞不懂,数据库里商品ID是int类型,而人家dao层代码里却传入String
泛型的List集合,还能从数据库操作成功。(不是应该传一个int数组,遍历删除的吗?)
为什么啊?这样做有什么好处?请大牛们指点迷津

5个回答

baidu_26611019
baidu_26611019   2017.09.14 08:56
已采纳

图片说明

表设计如下:
图片说明

分析:如果是主键则使用String来查询是不成功的,如果不是主键则使用String来查询时会自动做类型转换,可以操作成功。这应该是数据库的容错机制吧,
最好数据类型还是与数据库的一一对应。你们公司这么做的话可能处于:1、以前的代码就是这样,运行无误便无需改了;2、将String改成int会设计到较多
代码的改动;3、处于特殊的设计需求...直接问老员工啦!!!

jingguo_vip
jingguo_vip 嗯,不是主键,当时没仔细看!谢谢~
大约 2 个月之前 回复
Himly_Zhang
Himly_Zhang   2017.09.14 08:31

你可以自己试试把他执行的sql扔数据库里面看看执行不执行啊。。当然这个写法肯定是有问题的。原则上拼接sql的参数类型必须要和数据库保持一致。
举例说明为啥不一致也能执行成功。
比如delete from taba where id = '123';
和 delte from taba where id = 123;
如果id本身是varchar也就是string 类型,第一个执行效率高,第二个他会试着把id转换成数字然后再比较,就增加了一个转换过程,效率就低,而且不再走
主键索引。反过来意思也一样。所以尽量保持一致。

jingguo_vip
jingguo_vip 谢谢~
大约 2 个月之前 回复
u011781616
u011781616   2017.09.14 08:54

自动强转,int 能转换成string 但是执行效率非常低,如果这是主键的话,这样转换之后 就是去主键的这个伟大的索引特性

huang931027
huang931027   2017.09.14 08:38

数据库会进行强转的,这种写法当然是不规范的。

jdz199409
jdz199409   2017.09.14 09:14

一楼的那个自动转换是可以的,因为如果没有配置强制的格式约束,数据库会自动转换,但是问题有很多。看看Mapper中是不是对字符串进行了处理,要么就是用mybatis插件自动生成的Mapper.java 和Mapper.xml中,有什么地方做了处理。

jingguo_vip
jingguo_vip mapper是我用插件自动生成的。里面对jdbcType,javaType做了规定,没进行其他处理。应该是数据库的设计
大约 2 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片