MyBatis动态SQL

动态sql:sql映射文件中sql语句是变化的,可以根据条件获取到不同的sql语句,主要是where部分发生变化。

动态sql的实现:使用mybatis提供的标签,<if>,<where>,<foreach >

<if>用法

接口方法:

public interface StudentDao {
    //接口定义方法,传一个java对象
List<Student> selectStudentIF(Student student);
}

sql映射文件:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rKh5pyJ6IWw55qE5Zif5Zif,size_20,color_FFFFFF,t_70,g_se,x_16

<if>弊端

当第一个if不成立时,第二个if成立时,会把or age = #{age}加到sql语句后面,会造成sql语法错误

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rKh5pyJ6IWw55qE5Zif5Zif,size_20,color_FFFFFF,t_70,g_se,x_16

 <where>用法

用来包含多个<if>的 ,当多个if有一个成立的,<where>会自动增加一个where关键字,并去掉if中多余的 and , or 

用法:

1.先定义接口方法

/动态sql  where使用
List<Student> selectStudentwhere(Student student);

2.sql映射文件

<select id="selectStudentwhere" resultType="Student">
        select id,name,email,age from student
        <where>
            <if test="name != null and name != ''">
                name = #{name}
            </if>
            <if test="age >= 20">
                or age = #{age}
            </if>
        </where>
    </select>

<where>避免了<if>的弊端,推荐使用

<foreach>

<foreach>循环java中的数组,list集合,主要用在sql的in语句中

使用方法:

1.定义接口方法

接口方法参数是List集合,集合中存放数字1001.1002.1003

//动态sql  foreach
    List<Student> selectForeach(List<Integer> integers);

2.sql映射文件

<select id="selectForeach" resultType="Student">
        select * from student where id in
        <foreach collection="list" item="stu" open="(" close=")" separator="," >
            #{stu}
        </foreach>

    </select>

collection:表示接口中的方法参数的类型,如果是数组使用array,如果是list集合使用list
separator:集合成员之间的分隔符
cloes:循环结束时的字符
open:循环开始时的字符
item:自定义的,表示数组和集合成员的变量,也就是要循环的参数

3测试类:

@Test
    public  void selectSQLForeach(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        List<Integer> integerList = new ArrayList<>();
        integerList.add(1001);
        integerList.add(1002);
        integerList.add(1003);
        List<Student> studentList = dao.selectForeach(integerList);
        for (Student stu : studentList){
            System.out.println("====>>Foreach"+stu);
        }
    }

<Foreach>

1.定义方法,方法参数是list集合,集合中放的是java对象

//动态sql  foreach Studentjava对象list集合
List<Student> selectForeach2(List<Student> students);

2.sql映射文件

通过stu.id拿到java对象的id 属性值


    <select id="selectForeach2" resultType="Student">
        select * from student where id in
        <foreach collection="list" item="stu" open="(" close=")" separator="," >
            #{stu.id}/*stu.id 指 java对象的id属性值*/
        </foreach>
    </select>

3.测试类

先创建一个List集合在创建三个Student对象并给id属性赋值,添加到list集合中

 @Test
    public  void selectSQLForeach2(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);
        List<Student> studentList = new ArrayList<>();
        Student s1 = new Student();
        s1.setId(1005);
        studentList.add(s1);
        Student s2 = new Student();
        s2.setId(2001);
        studentList.add(s2);
        Student s3 = new Student();
        s3.setId(2002);
        studentList.add(s3);
        List<Student> ss = dao.selectForeach2(studentList);
        for (Student stu : studentList){
            System.out.println("====>>Foreach222"+stu);
        }
    }

复用sql语句

先定义:<sql id = "自定义名称"> sql语句 </sql>

在使用:<include refid = "id的值"/>

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rKh5pyJ6IWw55qE5Zif5Zif,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有腰的嘟嘟嘟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值