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

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

     开发人员:1111

     开发软件:Myeclipse

     用到的框架技术:Mybatis

     数据库:MySql

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

 

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

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

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><typeAliases><!-- 动态查询房屋信息的条件类 --><typeAlias type="cn.bdqn.mhouse.entity.HouseCondition" alias="houseC"/><typeAlias type="cn.bdqn.mhouse.util.Page" alias="page"/><!-- 区县别名 --><typeAlias type="cn.bdqn.mhouse.entity.District" alias="district"/><typeAlias type="cn.bdqn.mhouse.dao.IDistrictDao" alias="districtDao"/><!-- 房屋信息的别名 --><typeAlias type="cn.bdqn.mhouse.entity.House" alias="house"/><typeAlias type="cn.bdqn.mhouse.dao.IHouseDao" alias="houseDao"/><!-- 街道信息的别名 --><typeAlias type="cn.bdqn.mhouse.entity.Street" alias="street"/><typeAlias type="cn.bdqn.mhouse.dao.IStreetDao" alias="streetDao"/><!-- 房屋类型的别名 --><typeAlias type="cn.bdqn.mhouse.entity.Types" alias="types"/><typeAlias type="cn.bdqn.mhouse.dao.ITypesDao" alias="typesDao"/><!-- 用户信息的别名 --><typeAlias type="cn.bdqn.mhouse.entity.Users" alias="users"/><typeAlias type="cn.bdqn.mhouse.dao.IUsersDao" alias="usersDao"/></typeAliases><environments default="Mysqldevelopment"><!-- oracle的数据库配置  --><environment id="Oracledevelopment"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="oracle.jdbc.OracleDriver"/><property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/><property name="username" value="scott"/><property name="password" value="123"/></dataSource></environment><!-- mysql的数据库配置 --><environment id="Mysqldevelopment"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://192.168.1.128:3306/house"/><property name="username" value="root"/><property name="password" value="171268"/></dataSource></environment></environments><mappers><mapper resource="cn/bdqn/mhouse/dao/DistrictDaoMapper.xml"/><mapper resource="cn/bdqn/mhouse/dao/HouseDaoMapper.xml"/><mapper resource="cn/bdqn/mhouse/dao/StreetDaoMapper.xml"/><mapper resource="cn/bdqn/mhouse/dao/TypesDaoMapper.xml"/><mapper resource="cn/bdqn/mhouse/dao/UsersDaoMapper.xml"/></mappers>
</configuration>


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

 

      动态查询数据的impl代码:

 

/*** (非 Javadoc)* <p>Title: reCount</p>* <p>Description(描述):动态查询总计录数</p>* @param housec* @return* @see cn.bdqn.mhouse.dao.IHouseDao#reCount(cn.bdqn.mhouse.entity.HouseCondition)*/@Overridepublic int reCount(HouseCondition housec) {SqlSession session=MybatisUtil.getSession();Integer count=(Integer)session.selectOne("houseDao.reCount",housec);return count;}


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

 

 

 <!-- 动态查询房屋信息的总记录数 --><select id="reCount" parameterType="houseC" resultType="Integer">select count(0) from house h<where><if test="priceBegin!=null">and h.price > #{priceBegin}</if><if test="priceEnd!=null">and h.price   <![CDATA[<]]>  #{priceEnd}</if><!-- h.street_id是数据库的字段名 --><if test="street!=null">and h.street_id = #{street.id}</if><!-- h.type_id是数据库的字段名 --><if test="types!=null">and h.type_id = #{types.id}  </if> <if test="floorageBegin!=null">and h.floorage > #{floorageBegin}  </if><if test="floorageEnd!=null">and h.floorage <![CDATA[<]]>  #{floorageEnd}</if></where></select>


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

 

 

  <resultMap id="BaseResultMap" type="house" ><id column="ID" property="id" jdbcType="INTEGER" /><result column="TITLE" property="title" jdbcType="VARCHAR" /><result column="DESCRIPTION" property="description" jdbcType="VARCHAR" /><result column="PRICE" property="price" jdbcType="REAL" /><result column="PUBDATE" property="pubdate" jdbcType="DATE" /><result column="FLOORAGE" property="floorage" jdbcType="INTEGER" /><result column="CONTACT" property="contact" jdbcType="VARCHAR" /><!-- 开始映射外键 --><!-- 映射用户表 --><association property="users" column="user_id" select="selectUsers"/><!-- 映射类型表 --><association property="types" column="type_id" select="selectTypes"/><!-- 映射街道表 --><association property="street" column="street_id" select="selectStreet"/></resultMap><!-- 关联用户表 --><resultMap id="usersMapper" type="users" ><id column="ID" property="id" jdbcType="INTEGER" /><result column="NAME" property="name" jdbcType="VARCHAR" /><result column="PASSWORD" property="password" jdbcType="VARCHAR" /><result column="TELEPHONE" property="telephone" jdbcType="VARCHAR" /><result column="USERNAME" property="username" jdbcType="VARCHAR" /><result column="ISADMIN" property="isadmin" jdbcType="VARCHAR" /></resultMap><!-- 关联街道表 --><resultMap id="streetMapper" type="street" ><id column="ID" property="id" /><result column="NAME" property="name" jdbcType="VARCHAR" /><association property="district" column="district_id" select ="selectDirstrict"/></resultMap><!-- 关联区县表 --><resultMap id="districtDaoMapper" type="district" ><id column="ID" property="id"/><result column="NAME" property="name"/></resultMap><!-- 在根据区县id查询一遍区县表 --><select id="selectDirstrict" resultMap="districtDaoMapper">select * form district where id=#{district_id}	</select><!--关联类型表  --><resultMap id="typeMapper" type="types" ><id column="ID" property="id"/><result column="NAME" property="name" jdbcType="VARCHAR" /></resultMap><!-- 用户表 --><select id="selectUsers" resultMap="usersMapper">select * from users where id=#{user_id}</select><!-- 街道表 --><select id="selectStreet" resultMap="streetMapper">select * from street where id=#{street_id}</select><!-- 类型表 --><select id="selectTypes" resultMap="typeMapper">select * from types where id=#{type_id}</select><sql id="Base_Column_List" >ID, USER_ID, TYPE_ID, TITLE, DESCRIPTION, PRICE, PUBDATE, FLOORAGE, CONTACT, STREET_ID</sql>


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

 

             总记录数现在查询出来了,就开始动态分页查询数据了,首先得用到一个分页类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<House> houseList=new ArrayList<House>();     //房屋信息的集合/**    * @author Mu Xiongxiong       * @created 2017-3-17 下午10:04:41 * @return type */public List<House> getHouseList() {return houseList;}/**     * @author Mu Xiongxiong      * @created 2017-3-17 下午10:04:41         * @param houseList   */public void setHouseList(List<House> 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)* <p>Title: getHouseInfoByDymanic</p>* <p>Description:‘动态分页查询房屋信息</p>* @param housec* @param pageIndex* @return* @see cn.bdqn.mhouse.dao.IHouseDao#getHouseInfoByDymanic(cn.bdqn.mhouse.entity.HouseCondition, int)*/@Overridepublic Page getHouseInfoByDymanic(HouseCondition housec,int pageIndex) {Page page=new Page();page.setPageIndex(pageIndex);      //当前页int reCount=reCount(housec);       page.setRecord(reCount);           //总记录数List<House> houseList=new ArrayList<House>();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 id="getHouseInfoByDymanic" parameterType="hashmap" resultMap="BaseResultMap">select * from house h<where><if test="priceBegin!=null">and h.price > #{priceBegin}</if><if test="priceEnd!=null">and h.price   <![CDATA[<]]>  #{priceEnd}</if><if test="street!=null">and h.street_id = #{street.id}</if><if test="types!=null||!types==null">and h.type_id = #{types.id}  </if><if test="floorageBegin!=null">and h.floorage > #{floorageBegin}  </if><if test="floorageEnd!=null">and h.floorage <![CDATA[<]]>  #{floorageEnd}</if></where>limit #{stratRow},#{endRow}</select>


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

 

 

	/*** * @Title: reCount* @Description: 该方法的主要作用:分页查询房屋信息* @param   设定文件  * @return  返回类型:void   * @throws*/@Testpublic 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<House> houselist=page.getHouseList();for (House house : houselist) {System.out.println("房屋标题:"+house.getTitle());}}


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

 

     集合里面是空的!!!

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

 

      但是还很纳闷,于是各种假设各种调试,还是不行,当我吧问题发在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'

 

 

 

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

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

       错误代码:

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

       正确的代码如下:

 

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

      还有其他的好多细节错误来着,这里就不具体详细说了,要想查看完整的分页动态查询代码,请移步到 1111的博客 这里去看,希望对大家有帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

细说ASP.NET Core静态文件的缓存方式

一、前言 我们在优化Web服务的时候&#xff0c;对于静态的资源文件&#xff0c;通常都是通过客户端缓存、服务器缓存、CDN缓存&#xff0c;这三种方式来缓解客户端对于Web服务器的连接请求压力的。 本文指在这三个方面&#xff0c;在ASP.NET Core中静态文件的实现过程和使用方法…

金田项目的总结

一个搜索框对手机、姓名、内容进行搜索 <select id"list" parameterType"java.lang.String" resultMap"BaseResultMap">select<include refid"Base_Column_List"/>from user_backstagewhere 11 and is_deletedN<if te…

文章中文字乱码问题解决办法集合

乱码问题 测试步骤&#xff1a; 1、我们可以在首页编写一个提交的表单 <form action"/e/t" method"post"><input type"text" name"name"><input type"submit"> </form>2、后台编写对应的处理类 …

.NET开源两年之后社区贡献如何

微软在 2014 年开源了 .NET 核心框架&#xff0c;欢迎社区贡献代码。2015 年&#xff0c;一位 .NET 开发者分析了开源一年之后的社区贡献。2016 年年底又到了&#xff0c;这位开发者再次发表文章&#xff0c;分析了 .NET 开源两年之后的情况。 这一次他分析了 15 个 .NET 开源项…

java把控件跑挂了_Java代码动态修改 ConstraintLayout 内控件布局的辅助类

##上图ConstraintUtil.javaimport android.support.annotation.IdRes;import android.support.constraint.ConstraintLayout;import android.support.constraint.ConstraintSet;import android.transition.TransitionManager;/*** Created by xiaolei on 2017/9/8.*/public cla…

Vue动态组件

转载自 Vue动态组件 在动态组件上使用 keep-alive 我们之前曾经在一个多标签的界面中使用 is 特性来切换不同的组件&#xff1a; <component v-bind:is"currentTabComponent"></component> 当在这些组件之间切换的时候&#xff0c;你有时会想保持这些组…

ASP.NET Core Kestrel部署HTTPS

ASP.NET Core配置 Kestrel部署HTTPS。现在大部分网站已经部署HTTPS&#xff0c;大家对于安全越来越重视。 今天简单介绍一下ASP.NET Core 部署HTTPS&#xff0c;直接通过配置Kestrel。大家也可以通过前置Nginx来部署HTTPS。 下面直接进入正题。 新建项目并添加引用 新建一个ASP…

配置phython环境

参考资料 https://www.runoob.com/python/python-install.html https://www.cnblogs.com/huangbiquan/p/7784533.html Python下载 Python最新源码&#xff0c;二进制文档&#xff0c;新闻资讯等可以在Python的官网查看到&#xff1a; Python官网&#xff1a;https://www.py…

ASP.NET Core 之 Identity 入门(三)

前言 在上一篇文章中&#xff0c;我们学习了 CookieAuthentication 中间件&#xff0c;本篇的话主要看一下 Identity 本身。 最早2005年 ASP.NET 2.0 的时候开始&#xff0c; Web 应用程序在处理身份验证和授权有了很多的变化&#xff0c;多了比如手机端&#xff0c;平板等&…

玩物得志Java笔试题_代码规范利器-CheckStyle

本期内容分为五个部分&#xff0c;阅读时长预估7分钟&#xff1a;使用背景CheckStyle使用意义CheckStyle安装与使用CheckStyle检查配置示例落地使用情况及效果使用背景玩物得志目前还处在一个狂奔业务的时期&#xff0c;开发一般都全力支撑业务的快速奔跑&#xff0c;没有太多的…

Json交互处理

Json交互处理 JSON简介 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式&#xff0c;目前使用特别广泛。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写&#xff0…

利用 async amp; await 的异步编程

一、异步编程的简介 通过使用异步编程&#xff0c;你可以避免性能瓶颈并增强应用程序的总体响应能力。 Visual Studio 2012 引入了一个简化的方法&#xff0c;异步编程&#xff0c;在 .NET Framework 4.5 和 Windows 运行时利用异步支持。编译器可执行开发人员曾进行的高难度工…

xml配置文件显示为文本文件问题

idea 新建的xml文件显示为文本问题 原因: 由于新建不带后缀名的文件的时候 idea会相对智能的让你选择 文件规则 解决: settings->File types 中找到对应的文件类型显示 ,把 你不小心添加的 正则 给去除就好了, 我这里的配置如下图 可以自己进行设置&#xff08;&…

.NET应用迁移到.NET Core--调查案例

上周已经发过三篇文章讲述做.NET 应用迁移到.NET Core的一般方法&#xff0c;具体内容请看&#xff1a; .NET应用迁移到.NET Core&#xff08;一&#xff09; .NET应用迁移到.NET Core&#xff08;二&#xff09;风险评估 .NET应用迁移到.NET Core&#xff08;三&#xff09;从…

Ajax前后端对接---Springmvc

Springmvc实现 实体类user Data AllArgsConstructor NoArgsConstructor public class User {private String name;private int age;private String sex;}我们来获取一个集合对象&#xff0c;展示到前端页面 RequestMapping("/a2") public List<User> ajax2(…

缓存在大型网站架构中的应用

缓存的基本知识 在整个计算机体系构造中&#xff08;无论是硬件层面还是软件层面&#xff09;&#xff0c;缓存都是无处不在的。 在计算机硬件构造中&#xff0c;由于两种介质的速度不匹配&#xff0c;高速介质在和低速介质交互时速度趋向低速方&#xff0c;这就导致了高速介质…

win10安装dockerx docker的常见命令 可以子腾讯云上做做练习

参考资料 https://www.jianshu.com/p/e8427d12b3e0 百度搜索 docker hub 可以查找 你需要的镜像 https://hub.docker.com/?utm_sourcegetting_started_guide&utm_mediumembedded_Windows&utm_campaignfind_whalesay https://blog.csdn.net/zzq060143/article/de…

Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持

Jexus 是一款运行于 Linux 平台&#xff0c;以支持 ASP.NET、PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器。最新版 5.8.2 已经发布&#xff0c;有如下更新&#xff1a; 1&#xff0c;现在大部分网站已经部署HTTPS&#xff0c;大家对于安全越来越重视&…

php移动代码,移动专区周级收录如何提交 复制这段php代码即可

今天我们来讲解下“移动专区的周级提交”很多朋友都在使用移动专区(之前的熊掌号)进行提交&#xff0c;但是天级提交只给10个额度&#xff0c;需要我们不断提交10个才会有所增长&#xff0c;但是我们可以使用“周级提交”可以直接享受5万的数据提交&#xff0c;对于我们站点的收…