Mybatis-动态SQL

什么是SQL:

动态SQL指的是根据不同的查询条件,生成不同的sql语句。

  • < if >
  • < where>
  • < foreach>
  • < choose >(when otherwise)
if 语句
语法:

< if test=“判断Java对象的属性值”>
   部分sql语句
< /if>
test="判断条件"条件为真就加上sql语句
如果我们需要根据姓名和学号来查询学生,如果姓名为空,那么就根据学号来查询,学号为空,就是用姓名来查询

<select id="selectIf" resultType="cn.com.Ycy.mybatis.domain.user">
    select * from student
    where
    <if test="username !=null and username !=''">
        username=#{username}
    </if>
    <if test=" id!= null">
        and id = #{id}
    </if>
</select>

当我们的id为空时,username不为空就会按照id来查询:select * from student where username=#{username}
但是我们username为空时,就会出现语法错误,这个就需要我们使用where语句,不使用也是可以的,在每一个if加上and

 <select id="selectIf" resultType="cn.com.Ycy.mybatis.domain.user">
    select * from student
    where 1>0
    <if test="username !=null and username !=''">
       	and username=#{username}
    </if>
    <if test=" id!= null">
        and id = #{id}
    </if>
</select>
where 语句

用来包含多个< if > 当多个if有一个成立,会自动增加一个where关键字

<select id="selectWhere" resultType="cn.com.Ycy.mybatis.domain.user">
    select * from user
    <where>
        <if test="username !=null and username != ''">
            username=#{username}
        </if>
        <if test="id > 20">
            or id > #{id}
        </if>
    </where>
</select>

如果标签中返回的内容是以and 或者 or 开头,会自动去除的

Set 语句

set是我们在更新表的时候使用的元素,通过set元素,我们可以逐字段的修改一条数据。

<update id="update">
        UPDATE student
        <set>
            <if test="name!=null">
                name=#{name},
            </if>
            <if test="password!=null">
                password=#{password}
            </if>
        </set>
        WHERE id=#{id}
</update>

在set元素中,如果遇到了逗号,系统会自动将之去除

foreach 语句

循环java中的数组、List集合的,主要在sql的in语句中,可以批量处理数据的插入

语法:
<foreach collection="list" item="mylist" open="(" close=")" separator=",">
	#{mylist}
</foreach>
collection:表示接口的方法参数的类型,如果是数组就是用array,如果是list集合就使用list
item:自定义的,表示数组和集合成员的变量
open:循环开始的字符
close:循环结束时的字符
separator:集合成员之间的分隔符
接口中
List<user>selectForeach(List<Integer>list);
mapper中:
<select id="selectForeach" resultType="cn.com.Ycy.mybatis.domain.user">
	select * from user where id in
	<foreach collection="list" item="mylist" open="(" close=")" separator=",">
		#{mylist}
	</foreach>
</select>
Java测试
 @Test
    public void testForeach1(){
        userDao users = mybatisUtils.getSqlSession().getMapper(userDao.class);
        List<Integer>list = new ArrayList<>();
        list.add(29);
        list.add(30);
        list.add(31);
        list.add(32);
        List<user> u = users.selectForeach(list);
        for(user user: u){
            System.out.println(user);
        }

    }
用例2:
List<user>selectForeach2(List<user>list);
<select id="selectForeach2" resultType="cn.com.Ycy.mybatis.domain.user">
    select * from user where id in
    <foreach collection="list" item="mylist" open="(" close=")" separator=",">
        #{mylist.id}
    </foreach>
</select>
@Test
    public void testForeach2(){
        userDao users = mybatisUtils.getSqlSession().getMapper(userDao.class);
        List<user>list = new ArrayList<>();
        user user1 = new user();
        user1.setId(30);
        list.add(user1);
        user1 = new user();
        user1.setId(29);
        list.add(user1);
        List<user> u = users.selectForeach2(list);
        for(user user: u){
            System.out.println(user);
        }

    }
mybatis中一次性插入多条记录的
<insert id="addUser" parameterType="java.util.Arraylist">
    insert into user(name,sex) values
    <foreach collection="list" item="item" index="index" separator=",">
        (#{item.name},#{item.sex})
    </foreach>
</insert>
Mybatis-plus是在Mybatis基础上进行封装的一个框架,它简化了平时开发过程中对常用接口的调用,可以省去一些繁琐的操作。然而,对于一些更为复杂的查询Mybatis-plus可能无法满足需求,此时就需要我们自定义SQL语句来实现。通过在入口类的MybatisSqlSessionFactoryBuilder#build方法中注入mybatis-plus自定义的动态配置xml文件,可以实现自定义SQL语句和动态SQL的功能。具体的实现步骤如下: 1. 在应用启动时,在入口类的MybatisSqlSessionFactoryBuilder#build方法中将mybatis-plus的自定义动态配置xml文件注入到Mybatis中。 2. 在自定义的动态配置xml文件中,可以使用各种Mybatis-plus提供的方法来实现动态SQL的功能,比如IF标签、CHOOSE标签、FOREACH标签等。 3. 在自定义SQL语句中,可以结合Mybatis-plus的Wrapper类来实现条件查询,例如使用LambdaQueryWrapper来构建查询条件。 总结起来,Mybatis-plus提供了简化开发的接口,但对于一些更为复杂的查询,仍然需要我们自定义SQL语句和动态SQL实现。通过注入自定义的动态配置xml文件,并结合Mybatis-plus提供的方法和Wrapper类,可以实现更加灵活和高效的数据查询。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [mybatis-plus/mybatis 自定义 sql 语句、动态 sql](https://blog.csdn.net/CREATE_17/article/details/109117091)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Mybatis Plus实现动态SQL语句的原理,你知道吗?](https://blog.csdn.net/weixin_38405253/article/details/119880820)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值