本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等,如果刚开始学习Java的小伙伴可以点击下方连接查看专栏
本专栏地址:JavaWeb
Java入门篇: Java基础学习篇
Java进阶学习篇(持续更新中):Java进阶学习篇
从本文开始将讲述有关于如何使用MyBatis完成增删查改的操作,预计本系列文章会有以下这些文章,在写完本系列的文章后会有一篇文章罗列这些文章以及其地址(传送门)小伙伴们直接点击查看即可
文章名称 | 文章地址 |
---|---|
查询所有数据 | 使用映射配置文件实现CRUD操作——查询所有数据 |
查询详情 | 使用映射配置文件实现CRUD操作——通过主键查询对应数据 |
添加数据 | |
修改全部字段 | |
修改动态字段 | |
删除一条数据 | |
批量删除数据 |
在实际开发中,经常会遇到多条件查询的状况。比如某宝上买东西要筛选,价格区间、颜色、品牌等,本文将介绍三种不同的方法来实现多条件查询:1️⃣使用注解 2️⃣将参数封装成实体对象 3️⃣将参数封装到map集合中
这里我们同样用List集合来放置方法查询出来的结果(因为多条件查询出来可能不止一个复合的数据),方法定义为一个含参构造的方法,将可供选择的条件以参数传递进去。这里我们要 用@Param注解来标记参数,并在映射文件中使用参数占位符进行占位
List<Brand> selectByCondition(@Param("status")int status,
@Param("brandName")String brand_name,
@Param("companyName")String company_name);
这里要注意,@Param注解后的名字要与一会映射文件中使用的参数占位符一致,后面带有返回值类型的参数是一会我们要设置的(也就是日后从页面接收用户传递的数据)
这里需要用到参数占位符,前文已经介绍过了参数占位符,很显然这里要用到#{}占位符。由于公司名称和品牌名称用户在输入的时候可能不会输入与表格中的数据一模一样的,例如华为技术有限公司,用户只会输入华为,那么这里就需要用到模糊查询,在SQL中使用LIKE
来实现模糊查询,这在后面写测试用例时会提到
<select id="selectByCondition" resultMap="brandResultMap">
select
*
from tb_brand
where
status = #{status}
and company_name like #{companyName}
and brand_name like #{brandName}
</select>
除了要写上面的SQL语句,还要加上前面文章中一直有的ResultMap,这样才能完成字段映射,这里也不多做赘述
<resultMap id="brandResultMap" type="Brand">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
resultMap>
这里就讲几个与之前不一样的地方,与之前一样的就不再重复描述了
由于我们目前没有学到如何捕获用户输入的信息,所以只能在这里自己定义参数,这里有三个条件,那么我们需要定义三个参数值来模拟从页面接收的数据;这里参数设置的可以与我不相同,仅作参考
int status = 1;
String brandName = "华为";
String companyName = "华为";
上面提到用户不会输入一模一样的字段名称,但是字段中只要包含用户输入的这几个字就应该要能够查询,所以在这里使用通配符%(也是模糊查询中的,如果不熟悉的小伙伴可以回顾一下数据库的表查询相关知识点)
brandName = "%" + brandName + "%";
companyName = "%" + companyName + "%";
由于我们构造的是带参数的方法,所以要传递三个参数,这里只需要将我们之前定义的三个参数传进去就可以了
List<Brand> brandList = brandMapper.selectByCondition(status, brandName, companyName);
[Brand{id=2, brandName=‘华为’, companyName=‘华为技术有限公司’, ordered=100, description=‘华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界’, status=1}]
这里我们同样用List集合来放置方法查询出来的结果,方法定义为一个含参构造的方法,将参数封装为实体对象后,到时候只需要把对象传递进去就行了
List<Brand> selectByCondition(Brand brand);
同上,SQL语句也一致,这里不用改动
由于我们目前没有学到如何捕获用户输入的信息,所以只能在这里自己定义参数,这里有三个条件,那么我们需要定义三个参数值来模拟从页面接收的数据;这里参数设置的可以与我不相同,仅作参考
int status = 1;
String brandName = "华为";
String companyName = "华为";
上面提到用户不会输入一模一样的字段名称,但是字段中只要包含用户输入的这几个字就应该要能够查询,所以在这里使用通配符%(也是模糊查询中的,如果不熟悉的小伙伴可以回顾一下数据库的表查询相关知识点)
brandName = "%" + brandName + "%";
companyName = "%" + companyName + "%";
这里就要用到之前学的set方法来给对象赋值,将前面设置的参数封装到new出来的对象中,到时候执行方法时,只需要传递一个对象即可,优化了之前的代码,但依然不是最好的方法
Brand brand = new Brand();
brand.setStatus(status);
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
这里我们同样用List集合来放置方法查询出来的结果,方法定义为一个含参构造的方法,将参数封装为实体对象后,到时候只需要把对象传递进去就行了
List<Brand> selectByCondition(Brand brand);
同上,SQL语句也一致,这里不用改动
使用Map集合封装对象时,要注意键值对所对应的是什么,前面的是键,也就是在SQL语句中使用占位符中的那几个参数,而后面的是值,也就是前面定义完并经过处理的参数
Map map = new HashMap();
map.put("status",status);
map.put("brandName",brandName);
map.put("companyName",companyName);
这里放出完整的代码以供参考
public class MyBatisTest3_selectByCondition2_useMap {
@Test
public void SelectByCondition() throws IOException {
//接收参数
int status = 1;
String brandName = "华为";
String companyName = "华为";
//处理参数
brandName = "%" + brandName + "%";
companyName = "%" + companyName + "%";
//封装对象,键值对,前面是键名称,后面是值
Map map = new HashMap();
map.put("status",status);
map.put("brandName",brandName);
map.put("companyName",companyName);
//加载MyBatis的核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//SqlSession获取对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取BrandMapper接口代理对象
BrandMapper brandMapper= sqlSession.getMapper(BrandMapper.class);
//传入对象,执行方法
List<Brand> brands = brandMapper.selectByCondition(map);
//打印结果
System.out.println(brands);
//释放资源
sqlSession.close();
}
}
这里还是存在一定的问题的,比如当我们有一个参数没有值的时候,就查询不出来结果了,这不是我们需要的,说明这个代码还需要改进,这就是动态SQL,也就是我们下一篇文章会讲述的