Mybatis使用动态sql时,注意避免以下两个坑!!!

 坑一:

使用mybatis时,经常会判断属性是否为空。

domain

private Integer status; //状态, 0,1,2。

 Mapper.xml

 <where>
     <if test="status != null and status !=''"> and status = #{status }</if>
 </where>

 当status的值为0的时候,where条件中的sql未正常拼接,即if test中的条件不成立(false),导致查询结果异常,显然Integer status = 0, 0  != ' ',应该为true才对。

sql拼接失效原因:mybatis在预编译sql时,使用OGNL表达式来解析if标签,对于Integer类型属性,在判断不等于' '时,会返回' '的长度。

源码:

String s = stringValue(value, true);
return (s.length() == 0) ? 0.0 : Double.parseDouble(s);

所以表达式status != ' '会被当做status != 0 来判断,即当status = 0的时候,if条件判断不通过,导致动态sql失效。

 为了避免这个问题,可以改写成下面这样,去掉对空字符的判断,即可解决问题。

<where>
     <if test="status != null"> and status = #{status }</if>
</where>

坑二:

如果你的字段中存在:String str = "A";
动态sql中写法如:<if test="str != null and str == 'A'"> and status = #{status }</if>时

这样写由于单引号内,如果是单个字符的话,OGNL将会识别为java的char类型,而导致str的string类型与char类型做==运算会返回false,导致表达式不成立。

解决如下:

动态sql修改为:
<if test='str != null and str == "A"'> and status = #{status }</if>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
压力测试 服务器是学生服务器,就是腾讯那个10元的服务器,在本地利用jmeter压测工具设置5000个线程、10000个请求,首页的QPS为1024,而秒杀接口则为1678,可能服务器的问题,我感觉QPS不应该这么低。 <img src="https://github.com/suyeq/steamMall/blob/master/TestResult.png" width=350px height=200px> # 项目的运行 在数据库中创建steam库,然后导入sql文件,修改相应的的配置,关于主从配置请自行百度啦,运行起项目,然后需要把`GameService`类以及`CommentService`类里面的`afterPropertiesSet`方法里面的代码注释掉,这是第一次启动加载缓存的代码。 # 架构以及详细实现 ## 1.登录注册 * 两次md5,对密码加密 * 分布式session,将用户的登录信息缓存在redis中 * 权限检查,每次操作在权限允许下才能进行 * 注册,需要邮箱验证码,邮箱验证码会在缓存中存在90s的间 ## 2.页面数据 * 首页及其他页面因为读多写少,利用Mysql主从复制实现读写分离,写入在主Mysql下进行,读取在从Mysql进行 * 关于数据的不一致性,可以在写入的候先写入缓存,读取的候也先在缓存中读取,这样就可以避免数据的不一致性 * 缓存利用Redis,内存满的情况下,键的删除策略采用volatile-lru * 热卖榜以及排序功能依据Redis的zset实现,缓存间为30s * 为了减少网络延的影响,引入了redis的管道技术,实行批处理 * 为了更好地加快性能,在redis缓存层之上加了加了一层本地的缓存 ## 3.秒杀功能 原理:尽量减少Mysql的访问 * 将先将需要秒杀的数据缓存在Redis中,在秒杀接口里做预减少库存 * 判断秒杀订单里有无对应的信息,有则秒杀重复 * 将user信息与秒杀资源信息加入消息队列中 * 消息接受者减少库存,新增秒杀订单 * 客户端不断轮询缓存,查询到对应的秒杀订单,则秒杀成功<br> 秒杀的一些优化(借鉴了网上的思路): * 增加了秒杀的随机路径,防刷 * 在秒杀开始前需要验证码输入,延缓压力 * 利用redis的缓存,限制每个用户的每分钟的秒杀次数 ## 4.页面的渲染 * 页面的渲染采取了jquery加ajax技术的字符串拼接以及thymleaf模板的渲染 * 大部分是用的字符串拼接,只有少部分采用的模板渲染 * 前端主要是由字符串拼接,后台主要是模板渲染 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值