day20-MyBatis高级查询与分页_第1页
day20-MyBatis高级查询与分页_第2页
day20-MyBatis高级查询与分页_第3页
day20-MyBatis高级查询与分页_第4页
day20-MyBatis高级查询与分页_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MyBatis高级查询与分页一 课程介绍l 高级查询1 高级查询的概念2 #与$的区别3 使用代码完成高极查询4 使用MyBatis完成高级查询5 Web页面完成高级查询l 分页功能1 真分页与假分页2 分页的设计原理3 后台完成分页功能4 前台完成分页l 高级查询与分页的集成(难点)二 高级查询2.1 高级查询的概念什么叫高级查询? 为什么我们需要高级查询?在我们的课程系统中,高级查询就是多条件查询。大家在上网的时候一定遇到很多这种相应 的查询功能。它可以帮我们更快更好的找到需要的信息与资源。试想一下,以后咱们做一个客户管理系统。 一张表中有10000多个客户,我们是让用户从10000多个人

2、中去找,还是根据一些条件(如名称,性别等)过一次过滤查询就找到。下面为一些经常看到的高级查询:以咱们的Product这个货品为例:如果我们现在要根据这个货品的名称与价格做高级查询应该是怎么样的呢? 下图分析:根据上面的分析我们可以得出以下结论:1 高级查询就是在查询基础上添加后面的where条件2 根据不同的情况,where后面的条件都不同的3 提供的过滤条件越多,我们查询的排列组合也就越多综上可以看到,我们需要提供相应的查询字段,但是会不会用到,就看客户自己。但是由于这么多排列组合,我们不可能把所有的Sql全部准备好。因此,咱们必需要能生成动态SQL(说白了就是根据用户选择条件来拼接字符串(

3、where语句))怎么拼接呢?用户选择了,这个字段就不为空,当这个字段不为空的时候,我们就在where后的查询加上这个条件过滤2.2 使用代码完成高级查询在完成高级查询之前,我们要准备一个Query对象。为什么要准备这个Query对象呢?1 查询的条件是有很多的,如果我们不封装成对象,传多个参数的话很麻烦,也不利于以后的修改与扩展2 调用MyBatis中配置的sql的时候,只能传一个参数,那咱们只有把所有参数都封装到一个对象中,然后把这个对象传递过去Query对象就是咱们的查询对象,创建Query对象是有一定的规范的:它应该在一个query包中,这个包与domain同级,名称为XxxQuery

4、-Xxx表示实体的名称如:StudentQuery/ProductQuery在Query中我们准备好相应的查询条件字段与属性(Query就是一个JavaBean)根据上面的分析,咱们为Product准备相应的Query对象:public class ProductQuery private String name; /商品名称private BigDecimal maxPrice; /最高价格private BigDecimal minPrice; /最低价格 /提供相应的getter与setter方法 /提供一个方法来返回拼接的Sql语句public String getWhereSql()

5、 . 然后咱们在dao层准备一个高级查询的方法直接传入ProductQuery,如下:List<Product> queryAll(ProductQuery query);我们接着完成这个queryAll的功能,包含xml中也搞定相应的代码。但是在使用的时候咱们会遇到问题,而解决的方案居然是把#号改成$。 讲到这里,我们得先来研究一下#与$的区别。再来完成其它的功能。讲完#现$的区别后,咱们就来完成相应的代码。也就是拼接字符串的方案(课堂中完成):第一种:使用where 1=1 (影响查询的效率)public String getWhereSql()String sql = &qu

6、ot; where 1=1 "if(productName!=null && !"".equals(productName)sql += " and productName like '%"+productName+"%'"if(maxSalePrice!=null)sql += " and salePrice <="+maxSalePrice;if(minSalePrice!=null)sql += " and salePrice >="+

7、minSalePrice;return sql;第二种方式:用一个集合来保存,第一个用where,其它的用and 好处:解决了1=1的问题,代码稍显复杂public String getWhereSql()String sql = ""List<String> sqlList= new ArrayList<String>();if(productName!=null && !"".equals(productName)sqlList.add(" productName like '%"+

8、productName+"%'");if(maxSalePrice!=null)sqlList.add(" salePrice <="+maxSalePrice);if(minSalePrice!=null)sqlList.add(" salePrice >="+minSalePrice);for(int i=0;i<sqlList.size();i+)if(i=0)sql += " where "elsesql += " and "sql += sqlList.get

9、(i);return sql;第三种方式:使用JDK自带的功能来替换第一个字符串/* * 在这里拼接我们的条件字符串 * 我们想达成的目标:如果没有条件,就没有where以及的后面的代码 * 如果有条件,第一个条件前面是where,后面的条件才是and * 我们可以加一个功能,把sql字符串中的第一个and修改成 where * return */public String getWhereSql()String sql = ""if(productName!=null && !"".equals(productName)sql += &

10、quot; and productName like '%"+productName+"%'"if(maxSalePrice!=null)sql += " and salePrice <="+maxSalePrice;if(minSalePrice!=null)sql += " and salePrice >="+minSalePrice;sql = sql.replaceFirst("and", "where");return sql;2.3 #与$的区别

11、在拼接字符串之前,咱们先说一个在MyBatis的映射文件,一个占位使用#与$的区别,我们了解了这个后,才能去完成字符串的拼接。select * from product $whereSqlselect * from product where productName like '%小米%'$:直接从javaBean中拿属性值,可以用于拼接SQL字符串(不安全)$:只能从对象中拿到数据select * from product #whereSql - 报错select * from product ? #:只是代表 ?占位符(安全),设置值时值和设置的数据库字段名有关,和#xxx

12、里面的xxx无关。2.4 使用MyBatis完成高级查询刚才咱们已经讲解了在Java代码中拼接字符串的方案。有的复杂,有的简单。这确实也是一种解决方案。不过MyBatis也为我们提供了一种完成高级查询的解决方案,而且这个方式用起来还非常简单(那就开始吧)。在MyBatis中,它提供了一个where标签,然后在它里面加上if标签,所有的条件咱们都加上and,由于在where中,它会把第一个and替换成where。从而自动帮我们完成高级查询的字符串拼接。代码如下:2.5 Web中完成高级查询1 完成页面上的查询条件先看我们要做的效果:当我们点提交的时候就应该根据过滤条件得到相应的产品那么我们页面上

13、就需要一个form表单: 写页面时要使用placeholder,必须是的结构<form action="/product" method="post"><input type="text" name="productName" value="$ductName" placeholder="商品名称" /><input type="number" name="minSalePrice" va

14、lue="$query.minSalePrice " placeholder="最低价格" /><input type="number" name="maxSalePrice" value="$query.maxSalePrice " placeholder="最高价格" /><input type="submit" value=".我要的." /></form>2 完成servlet中的代码2

15、.1 得到form表单中的数据,将它封装到ProductQuery里面2.2 通过Query里面的查询数据到dao层去拿到过滤后的所有产品三 分页功能分页是我们开发中很常见的功能。试想一下,如果一张表有20万条数据,我们一次读取出来,对整个程序的性能是非常大的负担,而且也要影响到查询的速度。对用户来说,一下看到这么多数据估计也是醉了。因此:分页功能必不可少!3.1 真分页与假分页分页有两种:真分页与假分页。这个只是我们对两种分页方式的取名而已,两种分页方式没有孰优孰劣。他们只是方式与特性不同,于是选择上有不同,咱们B/S结构的软件可能更多的会使用真分页来完成功能。下面,我们就对真分页与假分页进

16、行介绍假分页(前端分页)比如说现有数据库有300条数据。它先把300要数据全部读取到我们的内存里面。Select * from product; -> List<Product> 300条1-30如果我每页30条,那么我们都从内存里面(List) 里面来读取好处:翻页快,功能实现简单,不匀速(第一次非常慢,后面快)劣势:占用内存大c/s真分页(后端分页)比如说现有数据库有300条数据。如果我每页30条,那么每次到数据库里去读取当前的30条数据select * from product LIMIT 0,29select * from product LIMIT 30,59sel

17、ect * from product LIMIT 60,89好处:占用内存小劣势:翻页慢它查询数据是匀速的3.2 分页的设计原理分页前咱们要研究的几个问题:查询的数据一共多少条? 通过Sql直接查询每页要显示多少条数据? 自己决定的(或者客户前台选择)我们如何计算一共多少页? 需要知道共多少条?每页多少条? 共多少条/每页多少条 (可以除尽) 共多少条/每页多少条+1 (不可以除尽的情况)怎么拿到某一页的所有数据? SELECT * FROM product LIMIT (当前页数-1)*每一页的条数 从哪一条数据开始不是由客户来直接输入的。而是由他传过来的当前页面算出来的。 计算的公式:(当

18、前页数-1)*每一页的条数 解决了上面四个问题,咱们就可以完成后台的分页功能!3.3 后台完成分页功能第一步:在xml中添加分页的sql第二步:在query对象中加上分页的查询条件注:对咱们来说,分页的的条件也是属性查询的过滤条件。-第三步:直接在dao层里面实现分页查询3.4 Web中完成分页功能在写代码之前,咱们先说一下。完成分页功能,我们需要在前端做一个什么样的展示。3.4.1 分页功能的分析研究一些数据:.每页多少条数据 .一共多少条数据 .当前第几页 首页 上一页下一页 尾页 我们要考虑的是,这些数据应该是从何而来的分析与计算过程:1 totalCount :一共多少条数据 从数据库

19、中直接查询 select count(*) from product2 pageSize:每页多少条数据:由我们自己决定3 currentPage:当前每几页:由客户决定(客户在前台选择)当客户点击上一页,下一页,首页,尾页就代表它在做选择 也就是不管他点的是哪一个:-下面的所有数据都可以通过上面的条件计算出来:4 totalPage 一共多少页分析:总共50条数据,每页10条 -> 5页 totalCount/pageSize分析:总共52条数据,每页10条 -> 6页 totalCount/pageSize + 1也就是说:不能除尽,就需要加1totalCount%pageSi

20、ze=0?totalCount/pageSize:totalCount/pageSize + 15 firstPage :首页就是第一页6 lastPage : 最后一页就是一共多少页(等于totalPage)7 prevPage : 上一页(判断,如果是第1页,不会变化)currentPage<=1?1:currentPage-18 nextPage : 下一页(判断,如果是最后一页,不会变化)currentPage>=totalPage?currentPage:currentPage+1-9 List这个查询到的数据3.4.2 封装分页对象当我们点分页的每一个分页元素(如上一页

21、,下一页)的时候,都会修改我们的当前页。而我们又怎么知道上一页要到第几页,而下一页又是到第几页呢? 难道每次到了这个页面我们再进行计算嘛?当然不是,在这个地方,我们的最佳实践就是把我当前显示的分页信息与展示的所有数据封装成一个分页对象. 对于我们之前所分析研究出来的分页字段与数据全部封装到这个对象中。之后,咱们直接从后台返回这个分页对象,就可以拿到所有数据了。注意:前面咱们学了一个Query对象,是前台传给后台,用于做查询的。现在这个叫做分页对象,是后台传给前台,是用于展示了。 这个点一定要清楚。分页对象的基础字段分页数据的计算(可以查看上页的分析部分理解)3.4.3 dao层的改动思考:咱们准备好的分页对象怎么用?分页对象是需要我们在后台(dao层)组装好,然后返回到前台。我们在dao层准备一个返回分页对象的方法即可:注意了:在分页对象中我们需要拿到一共多少条数据,因为需要加上这条SQL:3.4.3 Jsp的修改(根据PageList显示数据)3.4.4 Servlet层的修改调用拿到PageList的方法,并根据情况在前台提供currentPage这个参数四 高级查询与分页的集成完成分页后我们可以去

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论