关于mybatis查询大数据量表速度很慢的问题

不知道你们有没有遇到过在数据库工具中的SQL很快就执行出来了,但是在放入spring+mybatis的框架中查询经常报错,或者速度变得非常慢。

上面是我开发中遇到的一个实际的问题
经过多次实验发现是索引没用上,那么为什么在数据库工具中就能很快的查询出来,但是在mybatis插件中却要用掉十几秒的时间!!!!
最后发现是我传参的问题
比如mybatis中我用#{}来作传参,这会导致查询变得很慢,最后用${}来查询就快了,虽然第二种方式容易发生SQL注入的问题,那么一定要在service层对这个参数经行判断,防止sql注入

至于原因,如果有研究过mybatis底层的同学,不妨看一下井号和美元符号的区别,这两个最后执行的方法方式是不一样的,第一种应该是参数直接带入,第二种是属于直接注入,直接执行的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MyBatis插入大数据可以使用Batch方式,即批插入。Batch方式是将多条SQL语句一次提交到数据库执行,可以有效地减少与数据库的交互次数,提高性能。 以下是使用MyBatis的Batch方式插入大数据的步骤: 1. 开启MyBatis的Batch模式 在MyBatis的配置文件中添加如下配置: ``` <configuration> <settings> <setting name="defaultExecutorType" value="BATCH"/> </settings> ... </configuration> ``` 2. 创建Mapper接口方法 创建Mapper接口方法,使用注解@InsertProvider指定SQL语句。 ``` @InsertProvider(type = LargeDataSqlProvider.class, method = "insertBatch") void insertBatch(List<LargeData> dataList); ``` 3. 创建SQL语句提供者类 创建SQL语句提供者类LargeDataSqlProvider,实现insertBatch方法,生成批插入的SQL语句。 ``` public class LargeDataSqlProvider { public String insertBatch(Map<String, Object> map) { List<LargeData> dataList = (List<LargeData>) map.get("list"); StringBuilder sb = new StringBuilder(); sb.append("INSERT INTO large_data (id, name, value) VALUES "); for (int i = 0; i < dataList.size(); i++) { sb.append("("); sb.append(dataList.get(i).getId()).append(", "); sb.append("'").append(dataList.get(i).getName()).append("', "); sb.append(dataList.get(i).getValue()).append(")"); if (i != dataList.size() - 1) { sb.append(","); } } return sb.toString(); } } ``` 4. 调用Mapper接口方法 调用Mapper接口方法insertBatch,传入大数据。 ``` List<LargeData> dataList = generateLargeDataList(); // 生成大数据 largeDataMapper.insertBatch(dataList); // 批插入 ``` 以上就是使用MyBatis插入大数据的方法。需要注意的是,在使用Batch方式插入数据时,需要注意数据库的限制,例如MySQL默认的max_allowed_packet值为4M,如果插入的数据过大,可能会出现插入失败的情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值