我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

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

    1、if(常用)

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

        List<Emp> getEmpByCondition(Emp emp);

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

    • 用and表示&&(并且)

    • emp_name是字段名

    • if只有test标签且必须使用

    <!--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的增强

    若标签中有内容时:

    • prefix|suffix:将trim标签中内容前面或后面添加指定内容

    • suffixOverrides|prefixOverrides:将trim标签中内容前面或后面去掉指定内容

    若标签中没有内容时,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

    • collection:设置需要循环的数组或集合

    • item:表示数组或集合中的每一个数据

    • separator:循环体之间的分割符

    • open:foreach标签所循环的所有内容的开始符

    • close: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

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

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

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

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

    MyBatis怎么解决Update动态SQL逗号的问题

    这篇文章主要介绍“MyBatis怎么解决Update动态SQL逗号的问题”,在日常操作中,相信很多人在MyBatis怎么解决Update动态SQL逗号的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MyB
    2023-06-28

    mybatis中的动态sql问题

    这篇文章主要介绍了mybatis中的动态sql问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-27

    MyBatis注解实现动态SQL问题

    这篇文章主要介绍了MyBatis注解实现动态SQL问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-07

    Mybatis的sql注释问题怎么解决

    这篇文章主要介绍“Mybatis的sql注释问题怎么解决”,在日常操作中,相信很多人在Mybatis的sql注释问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Mybatis的sql注释问题怎么解决
    2023-07-02

    MyBatis中动态SQL怎么使用

    在MyBatis中,动态SQL可以通过使用if、choose、when、otherwise、foreach等标签来实现。这些标签可以根据条件动态生成SQL语句,以实现灵活的查询和更新操作。以下是一个简单的示例,在这个示例中使用了if标签来
    MyBatis中动态SQL怎么使用
    2024-04-20

    Mybatis中xml的动态sql怎么实现

    这篇文章主要介绍“Mybatis中xml的动态sql怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Mybatis中xml的动态sql怎么实现”文章能帮助大家解决问题。动态SQL简介动态 SQ
    2023-07-02

    mybatis使用${}时sql注入的问题怎么解决

    这篇文章给大家介绍mybatis使用${}时sql注入的问题怎么解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。mybatis使用${}时sql注入的问题最近在上线项目的时候,代码审查没有通过,提示有sql注入的风险
    2023-06-22

    mybatis-plus的sql语句打印问题怎么解决

    本篇内容介绍了“mybatis-plus的sql语句打印问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!第一种方式:mybatis
    2023-06-30

    MyBatis的动态SQL怎么实现

    MyBatis提供了一种非常方便的方式来实现动态SQL,通过使用XML的方式来编写SQL语句,并在其中使用一些特定的标签来实现动态SQL的功能。以下是一些常用的动态SQL标签:标签:用于条件判断,其内部的SQL语句只有在条件成立时才
    MyBatis的动态SQL怎么实现
    2024-04-09

    怎么使用MyBatis的动态SQL

    MyBatis的动态SQL是一种通过条件判断来动态生成SQL语句的方式,可以根据不同的条件生成不同的SQL语句,从而实现动态查询。下面是使用MyBatis的动态SQL的一些常用方法:IF语句:可以通过标签在SQL语句中添加条件判断,只有当条
    怎么使用MyBatis的动态SQL
    2024-04-09

    怎么分析mybatis的动态SQL

    这期内容当中小编将会给大家带来有关怎么分析mybatis的动态SQL,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、动态SQL:if 语句根据 username 和 sex 来查询数据。如果userna
    2023-06-28

    Mybatis拦截器打印sql问题怎么解决

    本篇内容介绍了“Mybatis拦截器打印sql问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.log4j2配置修改关闭log4
    2023-07-05

    MyBatis中怎么使用动态SQL类型

    MyBatis中使用动态SQL类型有两种方式:使用if元素和使用choose元素。使用if元素:可以根据条件动态拼接SQL语句。例如: