mysql+动态分页查询_Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)...

本文介绍如何使用Mybatis和MySQL进行动态分页查询,通过实例代码展示Mybatis配置、Mapper接口及XML配置、分页工具类的实现,并提供测试用例。在实现过程中,作者遇到并解决了关于结果类型映射和属性访问的错误。
摘要由CSDN通过智能技术生成

最近在用Mybatis做项目的时候遇到了不少问题,今天我就在这和大家分享一下,稀稀拉拉的研究了两天,终于搞好了!

开发人员:1111

开发软件:Myeclipse

用到的框架技术:Mybatis

数据库:MySql

主要内容:动态分页查询数据

好了,现在开始演示,我先把代码贴上来以便大家的理解:

mybatis-config.xml的主要配置内容:

/p>

"http://mybatis.org/dtd/mybatis-3-config.dtd">

由于分页查询得用到总记录数,所以我写了两个方法来实现的,第一个是动态查询数据总记录数,接下来大家看看impl类和相对应的Mapper.xml配置信息吧,由于dao接口是由impl实现类来实现的,所以在这我就不给大家放dao层接口的代码了:

动态查询数据的impl代码:

/**

* (非 Javadoc)

*

Title: reCount

*

Description(描述):动态查询总计录数

* @param housec

* @return

* @see cn.bdqn.mhouse.dao.IHouseDao#reCount(cn.bdqn.mhouse.entity.HouseCondition)

*/

@Override

public int reCount(HouseCondition housec) {

SqlSession session=MybatisUtil.getSession();

Integer count=(Integer)session.selectOne("houseDao.reCount",housec);

return count;

}

代码中的MybatisUtils是mybatis的工具类,动态查询数据方法在Mapper.xml里面的配置详情代码:

select count(0) from house h

and h.price > #{priceBegin}

and h.price #{priceEnd}

and h.street_id = #{street.id}

and h.type_id = #{types.id}

and h.floorage > #{floorageBegin}

and h.floorage #{floorageEnd}

然后我把表与表之间的关联映射在放上来供大家看看:

select * form district where id=#{district_id}

select * from users where id=#{user_id}

select * from street where id=#{street_id}

select * from types where id=#{type_id}

ID, USER_ID, TYPE_ID, TITLE, DESCRIPTION, PRICE, PUBDATE, FLOORAGE, CONTACT, STREET_ID

上面都有相对应的注释,在这就不多做解释了,

总记录数现在查询出来了,就开始动态分页查询数据了,首先得用到一个分页类Page,分页类的代码:

package cn.bdqn.mhouse.util;

import java.util.ArrayList;

import java.util.List;

import cn.bdqn.mhouse.entity.House;

/**

*

*

* 项目名称:mhouse

* 类名称:Page

* 类描述: 分页的工具类

* 创建人:Mu Xiongxiong

* 创建时间:2017-3-17 下午1:04:02

* 修改人:Mu Xiongxiong

* 修改时间:2017-3-17 下午1:04:02

* 修改备注:

* @version

*

*/

public class Page {

private int pageSize=3; //页大小

private int pageIndex=0; //当前页号

private int totalPageCount=0; //总页数

private int record=0; //记录总数

private Integer nextPage; //下一页

private Integer prePage; //上一页

private List houseList=new ArrayList(); //房屋信息的集合

/**

* @author Mu Xiongxiong

* @created 2017-3-17 下午10:04:41

* @return type

*/

public List getHouseList() {

return houseList;

}

/**

* @author Mu Xiongxiong

* @created 2017-3-17 下午10:04:41

* @param houseList

*/

public void setHouseList(List houseList) {

this.houseList = houseList;

}

//得到开始记录数

public int getSartRow(){

return (pageIndex-1)*pageSize;

}

//得到结束记录数

public int getEndRow(){

return pageSize;

}

public int getPageSize() {

return pageSize;

}

public void setPageSize(int pageSize) {

this.pageSize = pageSize;

}

public int getPageIndex() {

return pageIndex;

}

//得到当前页

public void setPageIndex(int pageIndex) {

this.pageIndex = pageIndex;

//下一页

setNextPage();

//上一页

setPrePage();

}

public int getTotalPageCount() {

return totalPageCount;

}

//总页数

public void setTotalPageCount() {

int totalP = record % getPageSize() == 0 ? record / getPageSize() :

record/ getPageSize() + 1;

this.totalPageCount = totalP;

}

public int getRecord() {

return record;

}

//总记录数

public void setRecord(int record) {

this.record = record;

//设置总页数

setTotalPageCount();

}

public Integer getNextPage() {

return nextPage;

}

//设置下一页

public void setNextPage() {

this.nextPage = this.pageIndex+1;

}

public Integer getPrePage() {

return prePage;

}

//设置上一页

public void setPrePage() {

this.prePage =this.pageIndex-1;

if(this.prePage<1){

this.prePage=1;

}

}

}

现在分页的工具类也出来了,就差分页查询数据了,先看impl里面的方法:

/**

* (非 Javadoc)

*

Title: getHouseInfoByDymanic

*

Description:‘动态分页查询房屋信息

* @param housec

* @param pageIndex

* @return

* @see cn.bdqn.mhouse.dao.IHouseDao#getHouseInfoByDymanic(cn.bdqn.mhouse.entity.HouseCondition, int)

*/

@Override

public Page getHouseInfoByDymanic(HouseCondition housec,int pageIndex) {

Page page=new Page();

page.setPageIndex(pageIndex); //当前页

int reCount=reCount(housec);

page.setRecord(reCount); //总记录数

List houseList=new ArrayList();

HashMap parMap=new HashMap();

parMap.put("priceBegin",housec.getPriceBegin());

parMap.put("priceEnd",housec.getPriceEnd());

if(housec.getStreet()!=null){

parMap.put("street",housec.getStreet());

}

if(housec.getTypes()!=null){

parMap.put("types",housec.getTypes());

}

parMap.put("floorageBegin", housec.getFloorageBegin());

parMap.put("floorageEnd",housec.getFloorageEnd());

parMap.put("stratRow",page.getSartRow());

parMap.put("endRow",page.getEndRow());

SqlSession session=MybatisUtil.getSession();

try {

houseList=session.selectList("houseDao.getHouseInfoByDymanic",parMap);

page.setHouseList(houseList);

} catch (Exception e) {

e.printStackTrace();

}finally{

MybatisUtil.closeSession();

}

return page;

}

对应的Mapper.xml配置信息:

select * from house h

and h.price > #{priceBegin}

and h.price #{priceEnd}

and h.street_id = #{street.id}

and h.type_id = #{types.id}

and h.floorage > #{floorageBegin}

and h.floorage #{floorageEnd}

limit #{stratRow},#{endRow}

最后我写了test测试,看看能不能正常执行:test测试类的方法如下:

/**

*

* @Title: reCount

* @Description: 该方法的主要作用:分页查询房屋信息

* @param 设定文件

* @return 返回类型:void

* @throws

*/

@Test

public void getHouseInfoByDymanic(){

Page page=new Page();

//houseC.setPriceBegin(50); //起始价格

//houseC.setPriceEnd(4000); //结束价格

//houseC.setFloorageBegin(10); //起始面积

//houseC.setFloorageEnd(6000); //最终面积

types.setId(1003); //房屋类型

houseC.setTypes(types);

street.setId(1003); //所在的街道

street.setDistrict(district);

houseC.setStreet(street);

int pageIndex=3;

page=houseDao.getHouseInfoByDymanic(houseC, pageIndex);

System.out.println("当前页是:"+page.getPageIndex());

System.out.println("下一页是:"+page.getNextPage());

System.out.println("上一页是:"+page.getPrePage());

System.out.println("总记录数:"+page.getRecord());

System.out.println("总页数是:"+page.getTotalPageCount());

System.out.println("页大小是:"+page.getPageSize());

List houselist=page.getHouseList();

for (House house : houselist) {

System.out.println("房屋标题:"+house.getTitle());

}

}

执行完成之后,分页的信息,上一页,下一页,总页数等等都可以正常显示出来,但是,只有数据库里面的数据没有显示出来(调试如图所示):

14137fe6f44ae16beb9319493daebb13.png

集合里面是空的!!!

出现错误之后我就开始解决,于是写了个测试查询全部的房屋信息的方法,测试了一遍之后,果然不出所料,查出来的都是null,更为奇怪的是:数据库中有34条记录,而程序运行后查询出来的是34个null,对没错,就是34个null,一个也不多,一个也不少!!!

d210877df93eb9e3e74544741308ad91.png

但是还很纳闷,于是各种假设各种调试,还是不行,当我吧问题发在csdn上面问的时候,忽然想起来了,原来是映射的resultType错了,我查询的是house,应该映射的是house实体类的权限定名,我写的是Page的全限定名,我写成page也不足为奇,因为我的返回类型就是page, 哎 ,就这个错,我弄了两小时才解决掉!!!实现是累的不行了!

这个问题解决了之后,我就继续测试其他的功能,现在是数据数来了,但是正儿八经最主要的测试还没进行呢,汗,于是我就开始测试动态查询数据,一步一步的测试的时候,错又来了,我把错误信息贴上来大家看看:

org.apache.ibatis.exceptions.PersistenceException:

### Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException:

There is no getter for property named 'id' in 'class java.lang.Integer'

### Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'id' in 'class java.lang.Integer'

cdb657ccf4bf2248eeb73e2fd86f2cf6.png

,嘴里骂了一句之后,拿起水杯干了一杯普利斯,挽起袖子就开始调试!我就不信还解决不了你了,

慢慢的。。。慢慢的,时间过来20分钟之后终于找出来了,原来是类型错了!我给大家看看错误代码和正确代码:

错误代码:

f64a761c68bd2aaa294bfac411b133b1.png

大家注意红色框中的代码,我取的是对象,而后面赋值的却是id,怪不得报错!!!

正确的代码如下:

6f21ffe12b3cb90ce0c9a0c69821429f.png

还是老规矩,看红框中的代码,去掉getId()就可以正常运行了!!!

还有其他的好多细节错误来着,这里就不具体详细说了,要想查看完整的分页动态查询代码,请移步到

1111的博客 这里去看,希望对大家有帮助!

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2017-03-18 22:43

浏览 94

评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值