Mybatis 动态sql 小结

1.什么是mybatis动态sql

看到动态,我们就应该想到,这是一个可以变化的sql语句

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑

2.mybatis动态sql使用前准备

a.数据库表


b.创建类


3.使用mybatis动态sql,得先知道一些属性值

一,插入

selectKey:在sql语句前后或后执行的sql语句
keyColumn:对应字段名或别名
keyProperty:对应实体类的属性名或map的key值
order:在执行语句前或后执行
resultType:返回结果的类型

第一种方式:最简单的动态sql  插入

<insert id="insertCourse" parameterType="Course" >
        insert into course values(seq_course.nextval,#{courseCode},#{courseName})

       <selectKey keyColumn="currId" keyProperty="id" order="AFTER" resultType="int">
            select max(id) currId from course
       </selectKey>
</insert>

测试

测试结果


第二种方式:如果我不想插入这么多的字段,courseName这个字段我不想插入,那么第一种这种方式,肯定是不行的

<insert id="insertCourse02" parameterType="Course" >
     insert into course(id,
            <if test="courseCode!=null">
                courseCode,
            </if>
            <if test="courseName!=null">
                courseName
            </if>
        )
        values(seq_course.nextval,
            <if test="courseCode!=null">
                #{courseCode},
            </if>
            <if test="courseName!=null">
                #{courseName}
            </if>
        )
    </insert>

测试及结果

由此可见,这种方式,在我不想插入courseCode这个字段的时候,我们是可以实现的

现在为题又来了,如果我们想把最后一个字段变为空,或者两个字段都变为空的时候,会出现什么情况

最后一个字段变为空

控制台第一个问号后面好像多了一个逗号


两个字段都变为空试试

还是多了一个逗号

出现上面这种情况的原因是,在不想插入字段的时候,我们并没有把逗号去掉,所有现在介绍第三种方式


第三种方式,去掉多余的逗号

这种方式要引入trim

trim也有几种属性

prefix:添加前缀

prefixOverrides:覆盖前缀

suffix:添加后缀

suffixOverrides:覆盖后缀

   <trim prefix="insert into course(" suffixOverrides="," suffix=")" >
            id,
            <if test="courseCode!=null">
                courseCode,
            </if>
            <if test="courseName!=null">
                courseName
            </if>
            </trim>
            <trim prefix="values(" suffixOverrides="," suffix=")" >
            seq_course.nextval,
            <if test="courseCode!=null">
                #{courseCode},
            </if>
            <if test="courseName!=null">
                #{courseName}
            </if>
            </trim>
            </insert>

看,问题解决了

在做项目的时候,我们经常对数据库进行插入数据,有时候我们会想同时插入多条,那么,在使用mybatis我们该怎么样插入多条数据呢

在这里,我们要解决几个问题

1.我们怎么样复制表结构

create  table course02 as select * from COURSE

这个语句是不是很熟悉,对的,course02这个表不仅复制了course表的表结构,把course表的内容也复制进来了

2.我们怎么样只复制course的表结构,而不复制course表的内容呢

create  table course03 as select * from COURSE where 1!=1;

3.那么进行插入的时候,是不是也是和这个一样呢

insert into course03  select * from course;

答案是一样的

4.怎么进行多条语句的插入

insert into course03
select '6', 'yc06', '数据结构06' from dual union
select '7', 'yc07', '数据结构07' from dual union
select '8', 'yc08', '数据结构08' from dual

现在sql语句有了,我们就可以在配置文件中进行插入操作了

<insert id="batchInsertCourse" parameterType="Course">
            insert into course
            <foreach collection="list" item="courses" separator="union">
                select #{courses.id},#{courses.courseCode},
                #{courses.courseName} from dual
            </foreach>
  </insert>


二,修改

1.使用trim,前面也已经介绍,使用trim可以去前缀,是因为有suffixOverrides这个属性

<update id="updateCourse" parameterType="Course">
             update course set
            <trim suffixOverrides=",">
            <if test="courseCode!=null">
                courseCode=#{courseCode},
            </if>
            <if test="courseName!=null">
                courseName=#{courseName}
            </if>
            </trim>
            where id=#{id}

</update>

2.使用set,可以代替语句中的set,还可以去掉后缀

<update id="updateCourse" parameterType="Course">

            update course
              <set>
            <if test="courseCode!=null">
                courseCode=#{courseCode},
            </if>
            <if test="courseName!=null">
                courseName=#{courseName}
            </if>
            </set>
            where id=#{id}
        </update>

 3.在修改的时候我们也会有选择性的修改,有时候我们不想修改的值,让其和没有修改的值一致

  choose相当于多重if
                第一个when相当于if,第二个when相当于else if
                otherwise相当于else
            

<update id="updateCourse" parameterType="Course">

         update course
         <!-- set只能处理前缀 -->
            <set>
          
            <choose>
                <when test="courseCode!=null">
                    courseCode=#{courseCode},
                </when>
                <otherwise>
                    courseCode=courseCode,
                </otherwise>
            </choose>
            <choose>
                <when test="courseName!=null">
                    courseName=#{courseName},
                </when>
                <otherwise>
                    courseName=courseName,
                </otherwise>
            </choose>
            
            </set>
            where id=#{id}
        </update>








  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wen's

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

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

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

打赏作者

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

抵扣说明:

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

余额充值