Mybatis(4)---动态sql

四、动态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>

猜你喜欢

转载自blog.csdn.net/weixin_46841376/article/details/114667624