Mybatis的这些坑

本文详细列举了在使用Mybatis过程中遇到的各种坑,包括时间戳处理、多参数使用、动态SQL等问题,以及如何避免这些问题。还分享了一些Mybatis的使用技巧,如尽可能使用`#{}`而非`${}`,利用XML注释代替SQL注释,以及在Service层处理特殊参数。文章总结了Mybatis的优缺点,强调其易用性和SQL灵活性,但也指出在大型项目中可能存在效率和维护性问题。
摘要由CSDN通过智能技术生成

大多数开发者应该都使用过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如下图所示,

sql语句如下,

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

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

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值