if标签
在用Mybatis之前,我们如果进行条件查询的话(条件查询需要判断从前端获取的值是否存在来进行操作),是利用代码拼接来进行实现的。
可Mybatis是把代码和sql进行分离,在mapper.xml中操作sql语句,然后通过解析mapper.xml来实现sql语句操作的,可我们在mapper.xml中无法进行代码拼接来进行条件查询。这个时候我们就需要Mybatis提供的动态SQL常用标签里的if标签来进行操作
第一步:在接口中写出条件查询的方法
/*
根据姓名和密码进行查询
@Param是MyBatis所提供的(org.apache.ibatis.annotations.Param),
作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应
*/
User getUserByNamePwd(@Param("name") String name, @Param("pwd") String pwd);
第二步:在mapper中进行sql语句操作
<select id="getUserByNamePwd" resultMap="userMap">
select * from user
<where>
<if test="name != null and name != ''">
name = #{name}
</if>
<if test="pwd != null and pwd != ''">
and`在这里插入代码片` pwd = #{pwd}
</if>
</where>
</select>
在这里我们就可以看出if标签的作用就是判断,他会判断test里的为true或者为false,如果为true则进行,如果为false则不进行操作
@Test
public void test01(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userByNamePwd = mapper.getUserByNamePwd(null, null);
for (User user : userByNamePwd) {
System.out.println(user);
}
sqlSession.close();
}
结果为:
Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@530612ba]
==> Preparing: select * from user
==> Parameters:
<== Columns: id, name, pwd
<== Row: 1, 狂神, 123456
<== Row: 2, 张三, 123456
<== Row: 3, 李四, 123890
<== Row: 4, 嘿嘿, 123123
<== Row: 5, 德玛西亚, 666666
<== Row: 6, 李莫寒, 121212
<== Total: 6
User{id=1, name='狂神', password='123456'}
User{id=2, name='张三', password='123456'}
User{id=3, name='李四', password='123890'}
User{id=4, name='嘿嘿', password='123123'}
User{id=5, name='德玛西亚', password='666666'}
User{id=6, name='李莫寒', password='121212'}
传一个值:
@Test
public void test01(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userByNamePwd = mapper.getUserByNamePwd("狂神", null);
for (User user : userByNamePwd) {
System.out.println(user);
}
sqlSession.close();
}
结果为:
Preparing: select * from user WHERE name = ?
==> Parameters: 狂神(String)
<== Columns: id, name, pwd
<== Row: 1, 狂神, 123456
<== Total: 1
User{id=1, name='狂神', password='123456'}
传两个值的话:
@Test
public void test01(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userByNamePwd = mapper.getUserByNamePwd("狂神", "123456");
for (User user : userByNamePwd) {
System.out.println(user);
}
sqlSession.close();
}
结果为:
==> Preparing: select * from user WHERE name = ? and pwd = ?
==> Parameters: 狂神(String), 123456(String)
<== Columns: id, name, pwd
<== Row: 1, 狂神, 123456
<== Total: 1
User{id=1, name='狂神', password='123456'}