1. 准备

请先完成Mybatis基本配置(一)的基本内容

2. 疑问

我们再Mybatis基本配置(一)中实现了按照商品ID进行查询商品信息,可是在实际应用中却很少出现根据ID来查询商品的情况。因为我们的用户或许并不知道这个商品的ID是什么,他们只能记住商品编码或者商品的部分名称,更甚至是他们只记得这个商品的大致售价。如果这个时候他们想找到自己想要的那个商品该怎么办么?所以我们的系统还必须提供另外一些功能。

3. 解决

现在我们拟定我们的用户需要根据商品编码、商品名称及价格等信息来查询自己想要的商品,所以我们要做如下更改:

1) 定义查询条件实体类

  1. package com.mybatis.entity;
  2.  
  3. public class QryPartParam {
  4.  
  5. private String partCode; //要查询的商品编码
  6. private String partName; //要查询的商品名称
  7. private float salePriceLow; //价格区间--起始价格
  8. private float salePriceHigh; //价格区间--结束价格
  9.  
  10. public String getPartCode() {
  11. return partCode;
  12. }
  13. public void setPartCode(String partCode) {
  14. this.partCode=partCode;
  15. }
  16.  
  17. public String getPartName() {
  18. return partName;
  19. }
  20. public void setPartName(String partName) {
  21. this.partName=partName;
  22. }
  23.  
  24. public String getSalePriceLow() {
  25. return salePriceLow;
  26. }
  27. public void setSalePriceLow(String salePriceLow) {
  28. this.salePriceLow=salePriceLow;
  29. }
  30.  
  31. public String getSalePriceHigh() {
  32. return salePriceHigh;
  33. }
  34. public void setSalePriceHigh(String SalePriceHigh) {
  35. this.SalePriceHigh=SalePriceHigh;
  36. }
  37.  
  38. }

2)在com.mybatis.dao.PartDao中增加接口函数

  1. public List<PartInfo> getPartInfoByUser(QryPartParam qryPartParam);

3)在com.mybatis.dao.mapper.PartMapper中增加其实现方法。

  1. <select id="getPartInfoByUser" parameterType="com.mybatis.entity.QryPartParam" resultType="com.mybatis.entity.PartInfo">
  2. SELECT * FROM tbInfoPart
  3. WHERE PartCode = #{partCode}
  4. AND PartName LIKE '%'+#{partName}+'%'
  5. AND SalePrice <![CDATA[>=]]> #{salePriceLow}
  6. AND SalePrice <![CDATA[<=]]> #{salePriceHigh}
  7. </select>

需要注意的是:

(1)需要模糊查询的时候,可参考PartName LIKE '%'+#{partName}+'%'这种的写法,当然还有其他写法就待读者自行摸索

(2)当我们的查询语句中出现>或者<等此类符号时,因为这两种符号为xml的关键字符,

"<" 会产生错误,因为解析器会把该字符解释为新元素的开始。

">" 会产生错误,因为解析器会把该字符解释为新元素的结束。

所以需要特殊处理成<![CDATA[>=]]>。术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据。

当然我们也可以用转义字符。xml的转义字符列表如下:

&lt; < 小于
&gt; > 大于
&amp; & 和号
&apos; ' 省略号
&quot; " 引号

4)测试下效果

  1. public static List<PartInfo> selectPartByUser(QryPartParam qryPartParam){
  2. InputStream iStream = TestMain.class.getClassLoader().getResourceAsStream("mybatis.xml");
  3. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(iStream);
  4. SqlSession session = sessionFactory.openSession();
  5. String statement = "com.mybatis.dao.PartDao.getPartInfoByUser";
  6. List<PartInfo> partInfos = session.selectList(statement, qryPartParam);
  7. session.close();
  8. return partInfos;
  9. }
  1. public static void main(String[] args) {
  2. QryPartParam qryPartParam = new QryPartParam();
  3. qryPartParam.setPartCode("001-0001");
  4. qryPartParam.setPartName("TCL");
  5. qryPartParam.setSalePriceLow(0f);
  6. qryPartParam.setSalePriceHigh(10000f);
  7.  
  8. List<PartInfo> partInfos = selectPartByUser(qryPartParam);
  9. for (PartInfo partInfo : partInfos) {
  10. System.out.println("ID:"+partInfo.getId()+" 商品:["+
  11. partInfo.getPartCode()+"] "+
  12. partInfo.getPartName()+" ,售价:"+
  13. partInfo.getSalePrice()+"元/"+
  14. partInfo.getUnit());
  15. }

打印结果为

  1. ID: 商品:[-] TCL D32E161 32英寸 内置wifi 在线影视 窄边LED网络液晶电视 ,售价:.9元/台

可以看到我们已经成功查询到了该条商品

4.有关参数问题

有人可能会问,按照现在参数定义方式(com.mybatis.entity.QryPartParam),那是不是说我以后每增加一个查询,就需要定义相对应的参数类?为了解决这个问题,笔者提供其他两种参数定义方式

1)通过@Param注解来标识多参数:

  1. public List<PartInfo> getPartInfoByUser(@Param("partCode") String partCode,
    @Param("partName") String partName,
    @Param("salePriceLow") float salePriceLow,
    @Param("salePriceHigh") float salePriceHigh);

在Mapper中则不再需要parameterType赋值:

  1. <select id="getPartInfoByUser" resultType="com.mybatis.entity.PartInfo">
  2. SELECT * FROM tbInfoPart
  3. WHERE PartCode = #{partCode}
  4. AND PartName LIKE '%'+#{partName}+'%'
  5. AND SalePrice <![CDATA[>=]]> #{salePriceLow}
  6. AND SalePrice <![CDATA[<=]]> #{salePriceHigh}
  7. </select>

此种传参方式适用于参数个数比较少的情况。

2)通过Map传参:

  1. public List<PartInfo> getPartInfoByUser(Map<String, Object> map);

在Mapper中对应的parameterType应赋值为(其中#{}种的取值应和Map中的键名是一致的):

  1. <select id="getPartInfoByUser" parameterType="java.util.Map" resultType="com.mybatis.entity.PartInfo">
  2. SELECT * FROM tbInfoPart
  3. WHERE PartCode = #{partCode}
  4. AND PartName LIKE '%'+#{partName}+'%'
  5. AND SalePrice <![CDATA[>=]]> #{salePriceLow}
  6. AND SalePrice <![CDATA[<=]]> #{salePriceHigh}
  7. </select>

此种传参方式优点在于易扩展。

5. 目录结构

Mybatis实现条件查询(三)的更多相关文章

  1. Mybatis多条件查询

    在Mybatis多条件查询中: 1.参数如果是多条件,则需要将将添加到Map集合中进行传入. 2.就是将其参数用有序数字进行代替. Mybatis单个String类型参数传递 mysql文如下,传入参 ...

  2. mybatis 按照条件查询

    mybatis 按照条件查询 @Autowired private StudentMapper studentMapper; @Override public Map getStudentList(i ...

  3. MyBatis参数条件查询传入的值为0时的判断

    MyBatis条件查询对字段判断是否为空一般为: <if test="testValue!=null and testValue != ''"> and test_va ...

  4. SSM整合 mybatis多条件查询与分页

    多条件查询与分页: 通过页面的houseName.floorage获取值传到前端视图(HouseSearchVO)实体类中的houseName,floorage建立houseSearchVO对象. 通 ...

  5. mybatis if条件查询 及<号的问题

    摘录自:http://flt95.blog.163.com/blog/static/12736128920136185841551/ <if test="p=='1'"> ...

  6. mybatis中条件查询大于等于和小于等于写法

    原符号 < <= > >= & ' "替换符号 < <= > >= & &apos; " createDat ...

  7. MyBatis学习总结(三)——多表关联查询与动态SQL

    在上一章中我们学习了<MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射>,这一章主要是介绍一对一关联查询.一对多关联查询与动态SQL等内容. 一.多表关联查询 表与 ...

  8. MyBatis动态SQL第一篇之实现多条件查询(if、where、trim标签)

    一.动态SQL概述 以前在使用JDBC操作数据时,如果查询条件特别多,将条件串联成SQL字符串是一件痛苦的事情.通常的解决方法是写很多的if-else条件语句对字符串进行拼接,并确保不能忘了空格或在字 ...

  9. SSM-MyBatis-13:Mybatis中多条件查询

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 实体类 public class Book { private Integer bookID; private ...

随机推荐

  1. springboot启动不能加载数据库驱动Failed to determine a suitable driver class

    SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/G:/sharp/repo ...

  2. 用JS写一个网站树形菜单

    先上效果图: 主体内容就是侧边展示的一二三级菜单,树形结构的. 前端页面布局内容,页面内容简单用ul li 来完成所有的罗列项.用先后顺序来区分一级二级三级: <body> <b&g ...

  3. ACM-小偷的背包

    题目描述:小偷的背包   设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,...,wn.问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S.如果有满足条 ...

  4. poj 2376 Cleaning Shifts 最小区间覆盖

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 40751   Accepted: 9871 ...

  5. STL语句表跳转指令学习

    打开语句表程序状态监控 发现 被跳过的指令用普通字体显示 被执行的指令用加粗的字体表示 录制成视频 如果除数是0 发生了溢出 用 JUO 跳转指令,跳转到 M001 例程已经录制成视频 上传到百度网盘 ...

  6. POJ 1458:Common Subsequence

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 41957   Accepted: 16 ...

  7. 安装部署及升级到Exchange Server 2010

    本文档详细的描述了,如何在Windows Server 2008 R2的环境下安装Exchange Server 2010,包括的内容有:   先检查组织环境: 1.请确保林的功能级别至少为 Wind ...

  8. WIN10打开资源管理器显示该文件没有与之关联的程序来执行该操作.请安装应用,请在“默认应用设置”..关联 —— 解决方案

    win+R,输入regedit,分别在HKEY_CLASSES_ROOT\piffileHKEY_CLASSES_ROOT\InternetShortcutHKEY_CLASSES_ROOT\lnkf ...

  9. JS的数据类型、常量、变量、以及基本对象的知识总结

    第一部分.JS的常见数据类型,特别要注意的是JS中大小写要求很严格,一定要注意字段大小写. 1.字符串(String) 举例: var cellname = "Bill Gate" ...

  10. css画布

    绘制基本图形 绘制直线 <style> .canvas{ } </style> <canvas id="myCanvas1" style=" ...