map mybatis 的字段返回0_Mybatis 你踩过坑吗?

(给ImportNew加星标,提高Java技能)

作者:似水的流年

yq.aliyun.com/roundtable/49835

大多数开发者应该都使用过Hibernate或者Mybatis的框架,或多或少都踩过一些坑!

如在MyBatis/Ibatis中#和$的区别,#方式能够很大程度防止sql注入,$方式无法防止Sql注入。所以,老司机 对新手说,最好用#。简单的说#{}是经过预编译的,是安全的,而是未经过预编译的,仅仅是取变量的值,是非安全的,存在sql注入。有些特例是需要关注的,有的时候需要用 解决解决一些实际问题。

如在执行sql语句时你有时并不希望让变量进行处理,而是直接赋值执行,这时就要用到(${a})了,在使用时还要这样赋值 @Param(value="a") String a

如日期问题:

可能会遇到日期格式的时间段问题,当数据库的时间为DATE类型时,MyBatis的jdbcType应该使用DATE 

jdbcType=DATE,

而不是使用

jdbcType=TIMESTAMP

如在使用resultMap的时候,要把ID写在第一行,否则的话,就会报错。

又如最近在做的项目,遇到myBatis的大坑,Mybatis一直报异常:

Java.lang.ArrayIndexOutOfBoundsException,

于是开始代码查错,代码中有存储过程,然后开发使用ROOT用户执行SQL跑出来的数据结果集是正常的,在测试环境程序运行也正常,但是在正式环境就其他用户不行,最后发现是因为数据库没有给该用户授权出了问题。

案例一:

作为新手,在此记下刚踩的一个坑,(踩踩更健康= =踩过痛过才不会再次错),写了一个sql语句用到两张表,两张表中有两个字段名字是一样的都是Time和Content,然后要查询这两张表的这两个字段都要查出来放到一个dto中,dto如下图所示,

63c0089150df8ca11669cd9ffabe1e07.png

sql语句如下,

272ef75afee0cc0a5b7037c5bdce09a2.png

然而运行后却发现后几个在数据库表里同名的字段取出来都是null,

09dc9e58630e53eb6bcf7246a648d902.png

但是放到数据库那边执行是没有取出空数据的,

4d0041685c42332e1c8c61b08c20160e.png

真是苦恼= =,后来经大神指点,sql语句查询出来的这个字段名必须和dto的参数名一致,改成这样就通过了,

1176a10ac898ba9a2d42d2b292522e52.png

数据都取出来了。。。。。。。。。。还记得在hibernate里用hql时放到dto里,select new dto名()参数顺序和类型一致就可以取出来。。。这应该算一个不同点吧,,感觉还是hql用起来舒服,,,求大神科普两者的差别优缺点

当实体类中的属性名和表中的字段名不一致时,使用MyBatis进行查询操作时无法查询出相应的结果的问题,当时上网查了很多才知道,看到的一个解决方法分享给大家,通过来映射字段名和实体类属性名的一一对应关系。这种方式是使用MyBatis提供的解决方式来解决字段名和属性名的映射关系的!

案例二:

数据库表使用了联合主键,逆向生成的时候生成了两个实体类。看起来别扭。但还是可以用。后来就先取消主键,生成完后再将主键加上。还有就是,tinyint本来以为用来表示比较小的整数,结果生成了布尔型的属性。后来就表示是和否才用tinyint了。逆向生成的sql语句绝对不能人为改动,否则再次生成的时候会重复生成。但是,尽管踩过坑,我还是觉得mybatis超级好用,比hibernate好多了。虽然hibernate我只试过一点之后就完全转向了mybatis了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值