[一步是咫尺,一步即天涯]
接上文,由于篇幅的关系,我们继续来叙述动态变化的条件查询。上文中,我们实现了两种需求的查询:1.条件数量不可知的查询,2.集合类型条件的查询。本文,我们来介绍第三种需求的查询:在某一个限制条件下的,条件数量不可知或者集合属性的查询。即,假设我们需要查询:指定部门下的,符合某些信息的员工。明确目标之后,我们来正式开始介绍操作步骤吧
准备工作:
a.操作系统 :win7 x64
b.基本软件:MySQL,Mybatis,Spring,SQLyog
-----------------------------------------------------------------------------------------------------------------------------------------------------------【我们逐步介绍各种查询,这里还各位看官跟着步骤一步一步实现】
【第一个需求:按照固定的某一个条件进行查询。即,查询条件只能有一个】
1.借用上文的工程,复制为Mybatis07,工程结构图不变。
2.我们先移除UserInfo.java中的集合属性。如下:
@SuppressWarnings("serial")
public class UserInfo implements Serializable {
private String userid;
private String department;
private String position;
private String mobile;
private String gender;
private String email;
//set,get,构造函数,toString,请各位看官自己生成吧
}
3.在UserInfoDao中增加接口,如下:
List findUserInfoByOneParam(Map map);
4.在UserInfoMapper.xml中,增加如下内容:
【解释】
a.请注意这里的【select * from userinfo 】之后没有再写where语句
b.
if(...){
....
}else if(...){
...
}else{
....
}
c.按照官方文档给的示例,最后的d.请注意观察;这里的“searchBy”是一个自定义的字符串,读者也可以按照自己的命名习惯,重新定义
e.再特别说明一下,请注意,每一个等号后面的参数都带有单引号。这是这种用法必须必须必须有的。否则,就是直接抛异常!
f.针对d,这里有另外一种情况那就是,判断null的键值对。具体写法如下:【这段代码,各位看官也可以顺便测试一下没有
g.上面这段代码,还有一个值得注意的地方就是,两个when之间的顺序是有关系的。即,如果第一个when满足条件,第二个就不会影响查询结果,其他类似,请读者自行尝试,观察控制台输出。
h.最后,补充一点,就是
4.新增单元测试方法,如下:【这是测试步骤2种的单元测试例子。读者测试上面f步骤的话,注释map的put动作即可】
@Test
public void testSeletOne() {
Map map=new HashMap();
map.put("searchBy", "gender");
map.put("gender", "1");
map.put("position", "工程师");
map.put("department","2");
UserInfoDao userInfo = sqlSession.getMapper(UserInfoDao.class);
List UIList= userInfo.findUserInfoByOneParam(map);
for(UserInfo ui:UIList){
System.out.println(ui.toString());
}
}
5.这里其他的文件,请按照前面我们说的配置方法进行配置,防止发生错误!
6.运行单元测试方法,应该能够看到如下类似输出:【各位看官可以变化一下查询条件,观察输出内容有什么变化】
--------------------------------------------------------------------------------------------------------------------------------------------------------
【第二个需求:基于固定的某一个条件,附加搜索条件】
具体场景如:在电器类别下,搜索某一个品牌的产品。当然,在此我们还是直接对userinfo操作吧,具体情况就请举一反三吧
1.修改刚刚xml文件即可,如下:
2.重新运行单元测试方法即可,注意这里是以gender为额外的条件,各位看官可以通过变化gender的0或1来观察控制台输出,这里我们给出示例,请读者自定比对。【我们直接在上面的SQL加入【gender==1】输出:
--------------------------------------------------------------------------------------------------------------------------------------------------------
【第三个需求:基于固定的某一个条件,集合属性条件搜索】
这里的做法其实和上文类似,废话不多说,看看我们实际的操作步骤方法:
1.首先,我们需要修改UserInfo.java对象中的成员变量,如下:【注意,我们仅修改对象,而没有修改数据表】
@SuppressWarnings("serial")
public class UserInfo implements Serializable {
private String userid;
private String department;
private String position;
private String mobile;
private String gender;
private String email;
private Departments depart;
//其他内容请自行补充
}
2.修改对应mapper文件,如下:
3.修改单元测试方法,如下:
@Test
public void testSeletOne() {
try {
Map map = new HashMap();
map.put("searchBy", "position");
map.put("gender", "1");
map.put("position", "工程师");
Departments d = new Departments("2", "%售%");
map.put("d", d);
UserInfoDao userInfo = sqlSession.getMapper(UserInfoDao.class);
List UIList = userInfo.findUserInfoByOneParam(map);
for (UserInfo ui : UIList) {
System.out.println(ui.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
4.运行单元测试方法,应该能够看到如下结果:
--------------------------------------------------------------------------------------------------------------------------------------------------------
至此,Mybatis最入门---动态查询(choose,when,otherwise)结束
备注:
关于if的更多用法,以及更多需求场景下的搜索语句,博主也在学习中,如果有新的内容,将会在本篇中持续更新。敬请期待!