文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

mybatis中的动态sql问题怎么解决

2023-07-05 07:09

关注

本篇内容主要讲解“mybatis中的动态sql问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mybatis中的动态sql问题怎么解决”吧!

Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是通过标签解决拼接SQL语句字符串时的问题

1、if(常用)

if:根据标签中test属性所对应的表达式决定标签中的内容是否需要拼接到SQL中

    List<Emp> getEmpByCondition(Emp emp);

当empName为null和“ ”时,会拼接and age,此时会报错,可以1=1恒成立解决。

<!--List<Emp> getEmpListByMoreTJ(Emp emp);-->    <select id="getEmpListByMoreTJ" resultType="Emp">select * from t_emp where 1=1<if test="empName!= '' and empName!= null">    and emp_name = #{empName}</if><if test="age != '' and age != null">    and age = #{age}</if><if test="sex != '' and sex != null">    and sex = #{sex}</if></select>
@Test    public void testGetEmpByCondition(){        SqlSession sqlSession = SqlSessionUtils.getSqlSession();        DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);        List<Emp> list = mapper.getEmpByCondition(new Emp(null, "陈智", 33, "女", null));        System.out.println(list);    }
select eid,emp_name,age,sex,email from t_emp where emp_name = ? and age = ? or sex = ?

2、where

当where标签中有内容时,会自动生成where关键字,并且将内容前多余的and或or去掉(在程序执行后生成的sql会将内容前多余的and或or去掉)

and写在第二句是为了和上面拼接,写在第一句是和下面拼接(即固定有elect * from t_emp emp_name= ?)

<select id="getEmpListByMoreTJ2" resultType="Emp">    select * from t_emp<where><if test="empName != '' and empName != null">    emp_name = #{empName }</if><if test="age != '' and age != null">    and age = #{age}</if><if test="sex != '' and sex != null">    and sex = #{sex}</if></where></select>

当where标签中没有内容时(或者使用getEmpByCondition传入的值全为null或“ ”),此时where标签没有任何效果。则直接SQL语句为select * from t_emp

--------------------分割--------------------

where标签不能将其中内容后面多余的and或or去掉:(会报错)

语句为select * from t_emp emp_name= ? and

<select id="getEmpListByMoreTJ2" resultType="Emp">    select * from t_emp<where><if test="empName != '' and empName != null">    emp_name = #{empName } and</if><if test="age != '' and age != null">    age = #{age} and</if><if test="sex != '' and sex != null">    sex = #{sex}</if></where></select>

3、trim

where的增强

若标签中有内容时:

若标签中没有内容时,trim标签也没有任何效果(跟上面的where一样)

<!--List<Emp> getEmpByCondition(Emp emp);-->    <select id="getEmpByCondition" resultType="Emp">        select <include refid="empColumns"></include> from t_emp        <trim prefix="where" suffixOverrides="and|or">            <if test="empName != null and empName != ''">                emp_name = #{empName} and            </if>            <if test="age != null and age != ''">                age = #{age} or            </if>            <if test="sex != null and sex != ''">                sex = #{sex} and            </if>            <if test="email != null and email != ''">                email = #{email}            </if>        </trim>    </select>

4.choose、when、otherwise

相当于if...else if...else

    List<Emp> getEmpByChoose(Emp emp);

when至少要有一个,otherwise最多只能有一个

与第一点if的区别:choose只会满足一个条件便退出,一个不满足则执行otherwise

<!--List<Emp> getEmpByChoose(Emp emp);-->    <select id="getEmpByChoose" resultType="Emp">        select * from t_emp        <where>            <choose>                <when test="empName != null and empName != ''">                    emp_name = #{empName}                </when>                <when test="age != null and age != ''">                    age = #{age}                </when>                <when test="sex != null and sex != ''">                    sex = #{sex}                </when>                <when test="email != null and email != ''">                    email = #{email}                </when>                <otherwise>                    did = 1                </otherwise>            </choose>        </where>    </select>
@Test    public void testGetEmpByChoose(){        SqlSession sqlSession = SqlSessionUtils.getSqlSession();        DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);        List<Emp> list = mapper.getEmpByChoose(new Emp(null, "", null, "", ""));        System.out.println(list);    }

mybatis中的动态sql问题怎么解决

5、foreach

5.1批量删除

    int deleteMoreByArray(@Param("eids") Integer[] eids);
<!--int deleteMoreByArray(@Param("eids") Integer[] eids);-->    <delete id="deleteMoreByArray">        delete from t_emp where        <foreach collection="eids" item="eid" separator="or">            eid = #{eid}        </foreach>        <!--            delete from t_emp where eid in            <foreach collection="eids" item="eid" separator="," open="(" close=")">                #{eid}            </foreach>        -->    </delete>
@Test    public void testDeleteMoreByArray(){        SqlSession sqlSession = SqlSessionUtils.getSqlSession();        DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);        int result = mapper.deleteMoreByArray(new Integer[]{12,13,14,15});        System.out.println(result);    }

mybatis中的动态sql问题怎么解决

5.2批量添加

    int insertMoreByList(@Param("emps") List<Emp> emps);
<!--int insertMoreByList(@Param("emps") List<Emp> emps);-->    <insert id="insertMoreByList">        insert into t_emp values        <foreach collection="emps" item="emp" separator=",">            (null,#{emp.empName},#{emp.age},#{emp.sex},#{emp.email},null)        </foreach>    </insert>

Arrays.asList该方法是将数组转化成List集合的方法 

如果你的List只是用来遍历,就用Arrays.asList()。

如果你的List还要添加或删除元素,还是乖乖地new一个java.util.ArrayList,然后一个一个的添加元素。

@Test    public void testInsertMoreByList(){        SqlSession sqlSession = SqlSessionUtils.getSqlSession();        DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);        Emp emp1 = new Emp(null,"a1",23,"男","123@qq.com");        Emp emp2 = new Emp(null,"a2",23,"男","123@qq.com");        Emp emp3 = new Emp(null,"a3",23,"男","123@qq.com");        List<Emp> emps = Arrays.asList(emp1, emp2, emp3);        System.out.println(mapper.insertMoreByList(emps));    }

6、sql标签

设置SQL片段:<sql id="empColumns">eid,emp_name,age,sex,email</sql>

引用SQL片段:<include refid="empColumns"></include>

mybatis中的动态sql问题怎么解决

到此,相信大家对“mybatis中的动态sql问题怎么解决”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯