Marco's Java【Mybatis入门(四) 模糊查询和分页的实现】

前言

在介绍了前面的CRUD操作之后,我们在此基础之上来一点提升,不知道大家第一次写分页查询的时候,是不是写的想哭,反正我是很难受的,当时一个分页花了我一晚上才摸透,神奇的Mybatis当然是不会放过分页的,如果说Layui框架让我们在前端的分页列表释放了双手,那么Mybatis就让我们在后端释放了双手!

模糊查询

老规矩,柿子先拿软的捏,模糊查询相对于分页已经是非常简单了,那我就直接上配置了,相信大家现在都能懂
虽然说它简单,但是模糊查询的方式却有多种,这里我列举三种

<!-- 方式一 -->
<select id="fuzzyQuery" parameterType="String"  resultMap="userResultMap">
	select * from u_user where real_name like '%${value}%'
</select>
<!-- 方式二 -->
<select id="fuzzyQuery" parameterType="String"  resultMap="userResultMap">
	select * from u_user where real_name like concat('%',#{value},'%')
</select>
<!-- 方式三 -->
<select id="fuzzyQuery" parameterType="String"  resultMap="userResultMap">
	<bind name="keywords" value="'%' + new String(value) + '%'"/>
	select * from u_user where real_name like #{keywords}
</select>

我个人是比较推荐第二种的,为什么呢?因为第一种方式可能会被sql注入,关于这一点我们后面会讲到,最后一种看着都麻烦对吧?配置完成后,我们再来测试一下

List<User> users = mapper.fuzzyQuery("mar");
for (User user : users) {
	System.out.println(user);
}

在这里插入图片描述
结果没有问题,挺简单对吧~


分页查询

这里我们选择使用三种分页查询来做,一种是我们通过配置文件生成Sql来完成,第二种是通过Mybatis内置RowBounds来实现,最后一种我们选择使用开源中国上阿里巴巴分页插件,那么我们就开始吧

原生分页

首先,我们还是配置mapper文件

<select id="queryPage" parameterType="Map" resultMap="userResultMap" >
	select * from u_user limit #{startPage},#{limit}
</select>

大家应该发现了,这一次的分页中的parameterType和之前的有所区别对吧?没错,在Mybatis中,不仅仅是支持基本类型,自定义类型,也可以支持Map集合,光这一点,我又对Mybatis加分了!真的非常便利。
为什么在这里要使用Map集合呢?
原因是如果我们这里传入的是一个User对象的话,那么我们的User对象是不是又要平白无故的加上startPage和limit属性呢?或者说需要额外的定义一个新的类呢?
因此使用Map的优点就体现出来了。接下来上测试代码

Map<String, Object> params = new HashMap<String, Object>();
int page = 1;//起始页
int limit = 5;//每页行数
params.put("startPage", (page - 1) * limit);
params.put("limit", limit);
List<User> users = mapper.queryPage(params);
for (User user : users) {
	System.out.println(user);
}

非常顺利的,查询出来5条结果
在这里插入图片描述

RowBounds分页

使用Mybatis内置RowBounds方法实现分页也特别的简单,我们不需要额外的再进行配置,只用在接口中定义一个方法,叫public List<User> selectAll(RowBounds rowBounds);,接下来我们直接上测试代码,大家应该都看得懂

int page = 2;//起始页
int limit = 5;//每页行数
//新建RowBounds对象,offset参数就是从哪一行开始
RowBounds rowBounds = new RowBounds((page - 1) * limit, limit);
List<User> users = mapper.selectAll(rowBounds);
for (User user : users) {
	System.out.println(user);
}
阿里分页插件PageHelper

这一款开源分页插件的下载地址先分享给大家 [分页插件PageHelper],大家下载好之后打开可以看到下面两个jar包(http://www.oschina.net/news/80614/pagehelper-5-0-0)
在这里插入图片描述
将以上两个jar包导入并Add Path,然后不用配置mapper映射和接口,直接上代码啦

//startPage左边的参数是起始页,右边的参数是每页行数
Page<Object> pageHelper = PageHelper.startPage(2, 5);
mapper.selectAll();
List<Object> users = pageHelper.getResult();
for (Object user : users) {
	System.out.println(user);
}

在这里插入图片描述
欸?我们发现没有结果?阅读完 pageHelper 的API,我们发现,类似于pageHelper这种Mybatis的插件是需要单独做配置的,只是不用配置mapper映射,那我们来看看怎么配置,我们先打开pageHelper的核心jar
在这里插入图片描述
发现有一个PageInterceptor的class文件,然后我们回到mybatis.config.xml,做如下配置
在这里插入图片描述
配置完成后,我们来测试一下代码现在是不是可用了
在这里插入图片描述
很神奇对吧,从原来的分页查询写一大堆,到现在,我们分页只用写两行代码,说这是"傻瓜式"编程也不为过啦

Page<Object> pageHelper = PageHelper.startPage(2, 5);
mapper.selectAll();

彩蛋彩蛋!继续上节的讲,还记得我们上一节我们谈到了共享问题,不知道大家有没有掌握呢?
这一章节,我们依然来优化一些配置,让它成为共享配置

Sql片段

不知道大家在写sql时有没有这样的苦恼,就是当我的一张表中字段特别多,但是不能select * from xxxx 的时候,我们要一个个的把字段甚至别名写上,那一长串代码写的想死的心都有了,这还不算,可能其他的sql也要用到这么长一串sql片段,我们又要复制粘贴,特别麻烦。

贴心的Mybatis当然会想办法帮我们解决这个问题啦,既然这个片段都是重复的,那么我们能不能想想办法把这个片段给提取出来呢?
在这里插入图片描述
大家可以看到,我这边专门提取了一个sql片段,作为共享片段,那么在insert语句中就只用通过refid调用这个片段即可,增强了代码的复用性,是不是还行呢

Mybatis占位符的处理

哈哈,今天的彩蛋比较多,大家别噎着了,在上面讲模糊查询的时候我们有提到过这个问题,不知道大家发现没有,我们调用外界参数的方式不仅可以使用 #{ },还可以使用${ },那么这既然这两种都可以,我们到底该选择哪一种方式呢?

占位符一:#{xxx}

PreparedStatement预编译sql语句 xxx表达式的写法
参数类型为javabean类,xxx表达式必须和javabean中属性对应的get方法名字一样
参数类型为简单类型,xxx表达式随表写,保持和参数的名字一致

占位符二:${xxx}

Statement拼接sql语句 xxx表达式的写法
参数类型为javabean类,xxx表达式必须和javabean中属性对应的get方法名字一样
参数类型为简单类型,xxx表达式执行能写${value}

这么解释,大家应该有些明白了吧?我们当时在讲 Marco’s Java 之【JDBC基础】 时提到了使用PreparedStatement和Statement拼接sql语句的区别,使用PreparedStatement的sql预编译机制是可以防止sql注入的,如果关于sql注入不是很了解的朋友,可以复习一下这一节的内容。
那么大家现在应该知道该怎么抉择了对吧~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值