1. 准备

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

2. 疑问

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

3. 解决

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

1) 定义查询条件实体类

package com.mybatis.entity;

public class QryPartParam {

    private String partCode; //要查询的商品编码
private String partName; //要查询的商品名称
private float salePriceLow; //价格区间--起始价格
private float salePriceHigh; //价格区间--结束价格 public String getPartCode() {
return partCode;
}
public void setPartCode(String partCode) {
this.partCode=partCode;
} public String getPartName() {
return partName;
}
public void setPartName(String partName) {
this.partName=partName;
} public String getSalePriceLow() {
return salePriceLow;
}
public void setSalePriceLow(String salePriceLow) {
this.salePriceLow=salePriceLow;
} public String getSalePriceHigh() {
return salePriceHigh;
}
public void setSalePriceHigh(String SalePriceHigh) {
this.SalePriceHigh=SalePriceHigh;
} }

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

public List<PartInfo> getPartInfoByUser(QryPartParam qryPartParam);

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

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

需要注意的是:

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

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

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

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

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

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

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

4)测试下效果

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

打印结果为

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

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

4.有关参数问题

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

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

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

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

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

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

2)通过Map传参:

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

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

<select id="getPartInfoByUser" parameterType="java.util.Map" resultType="com.mybatis.entity.PartInfo">
SELECT * FROM tbInfoPart
WHERE PartCode = #{partCode}
AND PartName LIKE '%'+#{partName}+'%'
AND SalePrice <![CDATA[>=]]> #{salePriceLow}
AND SalePrice <![CDATA[<=]]> #{salePriceHigh}
</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. Adapter之spinner

    前言: 在写代码当中有时候会用到下拉列表,下面我们讲一下spinner 正文: 因为比较简单,和之前的listView很像,所以直接上代码 <Spinner android:layout_wid ...

  2. Linux系统-----包管理器的演变

    每个电脑设备都使用某种形式的软件来执行其预定任务.在软件开发的早期,对产品进行了严格的bug和其他缺陷测试.在过去的十多年里,软件通过互联网发布,目的是通过应用新版本的软件来修复任何错误.在某些情况下 ...

  3. 苹果vs中国竞争者:瘦死的骆驼比马大?

    前不久,苹果调整2019年第一财季的营收指引,预计第一季度毛利率为38%,相关收入大约为55亿美元,全年总体营收约为840亿美元,运营开支约为87亿美元.针对2019年的运营状况,库克亲自给投资者写了 ...

  4. android的文件操作

    http://blog.csdn.net/fenghome/article/details/5668598 android的文件操作要有权限: <uses-permission android: ...

  5. 零距离初体验uboot

    一.uboot配置编译步骤 1.开发板光盘的BSP 2.复制到虚拟机,tar -jxvf qt_x210v3_130807.tar.bz2 3.配置:make x210_sd_config 4.出现C ...

  6. Day4 - H - Following Orders POJ - 1270

    Order is an important concept in mathematics and in computer science. For example, Zorn's Lemma stat ...

  7. redis数据导入与导出以及配置使用

    最近在研究redis 遇到redis requires Ruby version >= 2.2.2问题 解决办法是 先安装rvm,再把ruby版本提升至2.3.3 1.安装curl sudo y ...

  8. 012.Delphi插件之QPlugins,多实例内嵌窗口服务

    这个DEMO中主要是在DLL中建立了一个IDockableControl类,并在DLL的子类中写了具体的实现方法. 在主程序exe中,找到这个服务,然后调用DLL的内嵌方法,把DLL插件窗口内嵌到主程 ...

  9. 吴裕雄--天生自然java开发常用类库学习笔记:SortedMap类

    import java.util.Map ; import java.util.SortedMap ; import java.util.TreeMap ; public class SortedMa ...

  10. POJ 3692:Kindergarten 求补图的最大点独立集 头一次接触这样的做法

    Kindergarten Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5884   Accepted: 2877 Desc ...