我们根据实体类的不同取值,使用不同的 SQL 语句来进行查询。比如在 id 如果不为空时可以根据 id 查询,如果 username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。
If标签
- 根据条件查询,比如可以根据姓名查询,可以根据ID查询,也可以结合两个一起查询
- 持久层Dao接口
1 | List<User> findByCondition(User user); |
持久层 Dao 映射配置
注意:if标签的 test 属性中写的是对象的属性名,如果是包装类的对象要使用 OGNL 表达式的写法。比如包装类VoUser类中有一个属性user,如果参数是VoUser的话,就要使用user.username表达式。
关于大小写的问题:如果SQL语句上的内容就不区分大小写,比如select * from user where 1 = 1 、 and username like、and address like 但是涉及到Java中的类的属性就要严格区分大小大写,比如下面的test属性里面的内容:username和address,还有#{username},#{address} 要严格对应User类中的属性如:getUsername对应username
1 | <select id="findByCondition" parameterType="user" resultType="user"> |
3.测试
1 | /*测试findByCondition*/ |
where标签
- 在多条件查询时,不需要使用where 1 = 1
1 | <select id="findByCondition" parameterType="user" resultType="user"> |
foreach标签
SQL 语句:select 字段 from user where id in (?)
foreach标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写 #{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符
需求:根据ID集合查询
持久层Dao接口
1 | List<User> findByIds(queryVo vo); |
持久层 Dao 映射配置
1 | <select id="findByIds" parameterType="queryVo" resultType="user"> |
测试
1 |
|
抽取重复的SQL语句
1 | <sql id="defaultSql"> select * from user </sql> |