多条件分页查询,需要两个sql,一个多条件分页查询,一个带条件的分页查询返回总页数。
我们需要准备一个vo类,用来保存多条件的‘多’,这里的例子是:商品名称,最大,最小价格。
private String goodsName;
private String minPrice;
private String maxPrice;
接下来我们的controller层,需要接收的参数(商品vo类,第几页,每页展示多少条)
GoodsQueryVo vo,Integer pageNo,Integer pageSize,HttpServletRequest request
初始化分页条件
看第几页的商品
pageNo如果等于null就看第一页,不等于就是他本身
pageNo=pageNo==null?1:pageNo;
同理
pageSize=pageSize==null?10:pageSize;
mybatis提供了分页插件,底层是通过动态代理和aop来实现的,pagehelper分页助手。
需要在pom.xml中
<!-- mybatis的分页助手 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.6</version>
</dependency>
然后在spring-mybatis中
<!-- 配置分页插件 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageHelper">
<property name="properties">
<value>
dialect=mysql
reasonable=true
</value>
</property>
</bean>
</array>
</property>
好了配置完了就可以使用了
PageHelper.startPage(第几页,每页多少条)
接下来在mybatis(分页和总条数不用管)
mybatis中,写查询语句,参数为 VO类,返回 resultMap
<resultMap id="GoodsMap" type="com.oracle.ssm.vo.GoodsVo" >
<result property="avaliableCount" column="avaliable_count"/>
<association property="goods" javaType="goods">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="good_name" property="goodName" jdbcType="VARCHAR" />
<result column="good_price" property="goodPrice" jdbcType="VARCHAR" />
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP" />
<result column="img_url" property="imgUrl" jdbcType="VARCHAR" />
<result column="good_desc" property="goodDesc" jdbcType="VARCHAR" />
</association>
</resultMap>
<select id="findGoodsByQueryVo" parameterType="goodsQueryVo" resultMap="GoodsMap">
select goods.*,goods_store.avaliable_count from goods,goods_store
<where>
goods.id = goods_store.goods_id
<if test="goodsName!=null and goodsName!=''">
and good_name like '%${goodsName}%'
</if>
<if test="minPrice!=null and minPrice!=''">
and good_price >= ${minPrice}
</if>
<if test="maxPrice!=null and maxPrice!=''">
and good_price <= ${maxPrice}
</if>
</where>
order by update_time desc
</select>
使用pageInfo对象,封装一下上面的sql
pageInfo(goodsList);
pageinfo底层会进行动态代理,会进行两次查询保存当前的查询信息用request
放demo
//初始化分页条件
pageNo=pageNo==null?1:pageNo;
pageSize=pageSize==null?10:pageSize;
//怎么分页? select * from goods where ..... limit index,pagesize
//select count(*) from goods where....
//mybatis提供了分页插件,底层原理是通过动态代理和aop来实现的
PageHelper.startPage(pageNo, pageSize);
//只需要写一条查询全部的sql就可以了 select * from goods where ...
List<GoodsVo> goodsList=goodsService.findGoodsByQueryVo(vo);
//使用pageInfo对象,封装一下上面这条sql
PageInfo<GoodsVo> page=new PageInfo<GoodsVo>(goodsList);
//page对象底层会进行动态代理,去进行两次查询
request.setAttribute("page", page);
byte[] bytes=(byte[]) jedis.boundValueOps("session:"+request.getRemoteAddr()).get();
User user=(User)jedis.getHashValueSerializer().deserialize(bytes);
//回填查询条件
request.setAttribute("vo", vo);
request.setAttribute("user", user);