< where > 标签的作用:
< where >标签会自动判断sql语句,当自己身体里存在sql语句时,会在原sql语句的基准上拼接一个where 然后加上身体里的sql语句。并且会自动去除where关键字身后的第一个and或者or。
where标签的出现,使我们拼接sql时不用以前那样写成“…… where 1=1”这样让人费解的语句,简化了我们的sql语句,提高了效率。
实践一下:
CM1.xml(一个mapper)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace表示命名空间 -->
<mapper namespace="com.itheima.mapper.CM1">
<!-- parameterType 传入的参数类型 -->
<!-- resultType 接收的参数类型 -->
<select id="W" parameterType="com.itheima.po.Account"
resultType="com.itheima.po.Account">
select * from account
<where>
<if test="username != null and username != '' ">
and username like concat('%',#{username},'%')
</if>
<if test="balance != null and balance > 0">
and balance > #{balance}
</if>
</where>
</select>
</mapper>
拼接手法:
我们来拼接下where标签身体里的sql语句
基础的SQL语句:
select * from account
当where标签下的if标签的条件都为真时:
拼接:原sql语句+where+and username like concat(’%’,#{username},’%’) and balance > #{balance}
select * from account where username like concat('%',#{username},'%') and balance > #{balance}
where身体里存在了sql语句,于是它自动为原sql语句添加了where关键字,并且去除了where身后的第一个and。
当where标签下的第一个if标签的条件为真时:
拼接:原sql语句+where+and username like concat(’%’,#{username},’%’)
select * from account where username like concat('%',#{username},'%')
当where标签下的第二个if标签的条件为真时:
拼接:原sql语句+where+and balance > #{balance}
select * from account where balance > #{balance}
当where标签下的所有if标签的条件为假时:
拼接:原sql语句+
select * from account
是的,没加东西,where标签看到自己身体里没有任何东西,于是就没有做任何拼接动作
开始实际测试一下吧:
第一步:把这个映射器配置到Mybatis的主要配置文件中去
这里不演示了
第二步:数据库数据
第三步:测试方法
//select where测试
@Test
public void whereTest() throws Exception {
SqlSession session = MyBatisUtils.getSqlSession();// 获取会话
Account account = new Account();
account.setUsername("小明");
account.setBalance(7000);
List<Account> users = session.selectList("com.itheima.mapper.CM1.T5", account);
session.close();// 关闭会话
for (Account a : users) {
System.out.println(a.toString());
}
}
测试结果:
通过实践表明,where子标签的确如我们上文所讲的那样拼接sql语句
注释掉用户名的结果
//account.setUsername("小明");
account.setBalance(7000);
注释掉所有数据的结果
//account.setUsername("小明");
//account.setBalance(7000);
好了,水平有限,where的实践到此结束!