四、动态sql
1.动态sql
动态SQL指的是sql语句的内容是变化的,可以根据条件获取到不同的sql语句
主要是where的部分发生变化
2.动态sql的实现
动态sql的实现使用的是mybatis提供的标签,比如,,
(1)if 标签
if标签是判断条件的
语法:
部分sql语句
<?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">
<mapper namespace="customDAO.TestDao">
<!--
<if test="java对象的属性">
-->
<select id="selectIf" resultType="customDAO.Test">
<!--这里加入where 1=1的目的是为了保证语法格式正确-->
SELECT * FROM t_test WHERE 1=1
<if test="name != null and name != ''">
name = #{name}
</if>
</select>
</mapper>
(2)where 标签
where标签用于包含多个if标签,当多个if有一个成立时,where标签会自动增加一个where关键字,并去掉if中多余的and,or等
<?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">
<mapper namespace="customDAO.TestDao">
<!--
<where标签>
-->
<select id="selectIf" resultType="customDAO.Test">
SELECT * FROM t_test
<where>
<if test="name != null and name != ''">
name = #{name}
</if>
</where>
</select>
</mapper>
(3) foreach标签
foreach标签用于循环java中的数组或list集合
主要用于sql的in语句中
比如:查找id是1001,1002,1003的学生
select * from t_test where id in (1001,1002,1003);
两种种使用方式
sql映射文件
<?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">
<mapper namespace="customDAO.TestDao">
<!--
foreach的第一种用法:List集合
-->
<select id="foreach1" resultType="customDAO.Test">
SELECT * FROM t_test WHERE id IN
<!--
collection:表示接口中方法参数的类型,如果是数组使用array,如果是list集合使用list
item:自定义的表示数组或集合成员中的变量
open:循环开始的字符
close:循环结束时的字符
separator:集合成员之间的分隔
-->
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
<!--
foreach的第二种用法
-->
<select id="foreach2" resultType="customDAO.Test">
SELECT * FROM t_test WHERE id IN
<foreach collection="list" item="test" open="(" close=")" separator=",">
<!--
循环对象的某个属性值
-->
#{test.id}
</foreach>
</select>
</mapper>
dao接口中的方法
import java.util.List;
//定义操作test表的接口
public interface TestDao
{
//foreach用法1
public List<Test> foreach1(List<Integer> idList);
//foreach用法2
public List<Test> foreach2(List<Test> test);
}
(4) sql代码片段
用途:复用一些语句
步骤
1.先定义sql语句
2.使用include标签导入即可
sql映射文件
<?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">
<mapper namespace="customDAO.TestDao">
<!--定义sql的片段-->
<sql id="mysql">
SELECT * FROM t_test
</sql>
<select id="selectIf" resultType="customDAO.Test">
<!--SELECT * FROM t_test-->
<!--使用include导入sql语句-->
<include refid="mysql"></include>
<where>
<if test="name != null and name != ''">
name = #{name}
</if>
</where>
</select>
</mapper>