Java开发之SSM框架-动态SQL语句

本文介绍了MyBatis框架中动态SQL的使用,包括if、where、choose(when/otherwise)、forEach标签的用法,以及在多参数查询和更新操作中的应用。示例代码展示了如何处理数组、List和Map类型的参数,并解释了set和trim标签在更新语句中的作用。此外,还提及了分页查询的基本思路。

MyBatis框架动态SQL处理简单的多参数查询

if标签:
用法类似Java中的if语句,选择性拼接指定SQL片段.
格式:
if test=“条件”
SQL片段
/if
说明:
1.当条件为true时,将SQL片段拼接到该标签所在位置
示例:

 <select id="getUser" resultType="user">
        select * from user where 1=1
        <if test="id!=null">
            and id=#{id}
        </if>
        <if test="name!=null">
            and name=#{name}
        </if>
        <if test="sex!=null">
            and sex=#{sex}
        </if>
        <if test="age!=null">
            and age=#{age}
        </if>
        <if test="address!=null">
            and address=#{address}
        </if>
    </select>

where标签:
在这里插入图片描述
示例:

 <select id="getUser" resultType="user">
        select * from user
      	<where>
	       	<if test="id!=null">
	            and id=#{id}
	        </if>
	        <if test="name!=null">
	            and name=#{name}
	        </if>
	        <if test="sex!=null">
	            and sex=#{sex}
	        </if>
	        <if test="age!=null">
	            and age=#{age}
	        </if>
	        <if test="address!=null">
	            and address=#{address}
	        </if>
      	</where>
    </select>

choose标签:
在这里插入图片描述
示例:

<select id="getUserches" resultType="user" parameterType="user">
        select * from user
        <where>
            <choose>
                <when test="name!=null">
                    and name=#{name}
                </when>
                <when test="sex!=null and sex!=' '">
                    and sex=#{sex}
                </when>
                <when test="address!=null">
                    and address=#{address}
                </when>
                <otherwise>
                </otherwise>
            </choose>
        </where>
    </select>

执行到choose标签时,只会进入test属性判断为true的第一个when标签,执行之后便跳出choose标签。如果所有when标签的test属性都为false,则进入otherwise标签。与JSTL中的choose标签非常相似。

forEach标签:

用于遍历集合,通常用于构建in语句中.
格式:

select 字段列 from 表名 where 字段名 in

#{变量A}


说明:
1.collection属性值为集合类型的属性名.当参数为数组时,默认参数的名为array,当参数为List集合时,默认的参数名为list,当参数为Map集合时,参数名为map中集合元素所在的键值key
2.item属性值为变量名,名称任意.该变量存放当前元素/键值
3.index属性值为变量名,名称任意.该变量存放当前元素索引/键名
4.open,separator,close属性值为符号,表示遍历开始/中间/结束时拼接的符号

示例:foreach标签处理数组类型参数

<select id="getUserArray" resultType="user">
        select * from user where id in
        <foreach collection="array" open="(" close=")" separator="," item="eml">
            ${eml}
        </foreach>
    </select>

添加测试方法:

 public void getuserarray(){
        SqlSession session = MyBatisUtils.getSqlSession();
        int[] ids={1,2};
        List<User> list = session.getMapper(UserMapper.class).getUserArray(ids);
        logger.info("当前查出的记录数"+list.size());
        logger.info("查询结果"+list);
        session.commit();
        MyBatisUtils.close(session);
    }

foreach标签处理List类型参数:

<select id="getUserList" resultType="user">
        select * from user where id in
        <foreach collection="list" open="(" close=")" separator="," item="listitem">
            ${listitem}
        </foreach>
    </select>

添加测试方法:

public void getuserlist(){
        SqlSession session = MyBatisUtils.getSqlSession();
        List<Integer> intlist =new ArrayList<Integer>();
        intlist.add(1);
        intlist.add(2);
        List<User> list = session.getMapper(UserMapper.class).getUserList(intlist);
        logger.info("当前查出的记录数"+list.size());
        logger.info("查询结果"+list);
        session.commit();
        MyBatisUtils.close(session);
    }

foreach标签处理Map类型参数:

<select id="getUserMap" resultType="user">
        select * from user where id in
        <foreach collection="mapuser" open="(" close=")" separator="," item="listmap">
            ${listmap}
        </foreach>
    </select>

添加测试方法:

 public void getusermap(){
        SqlSession session = MyBatisUtils.getSqlSession();
        List<Integer> intlist =new ArrayList<Integer>();
        intlist.add(1);
        intlist.add(2);
        Map<String,Object> map  = new HashMap<String, Object>();
        map.put("mapuser",intlist);
        List<User> list = session.getMapper(UserMapper.class).getUserMap(map);
        logger.info("当前查出的记录数"+list.size());
        logger.info("查询结果"+list);
        session.commit();
        MyBatisUtils.close(session);
    }

动态SQL处理更新功能

更新数据功能主要通过set+if标签来实现

set标签:

在这里插入图片描述

示例:

<update id="editUser" parameterType="user">
        update user
        <set>
            <if test="name!=null and name!=''">
                name=#{name},
            </if>
            <if test="sex!=null and sex!=''">
                sex=#{sex},
            </if>
            <if test="age!=null">
                age=#{age},
            </if>
            <if test="address!=null and address!=''">
                address=#{address},
            </if>
        </set>
        where id=#{id}
    </update>

添加测试方法“:

public void updateuser(){
        SqlSession session = MyBatisUtils.getSqlSession();
        User user = new User();
        user.setId(1);
        user.setAddress("上海上海");
        int re = session.getMapper(UserMapper.class).editUser(user);
        logger.info(re!=-1?"操作成功":"操作失败");
        session.commit();
        MyBatisUtils.close(session);
    }

trim标签
语法:

<trim prefix="前缀" suffix="后缀" perfixOverrides="忽略前缀" suffixOverrides="忽略后缀">
.....
</trim>

属性介绍如下:

  • perfix:前缀,可以自动对trim标签所包含的语句是否有返回值进行判断。如果有返回值,则为SQL语句拼接相应的前缀。
  • suffix:后缀,在trim标签包含的语句末尾拼接后缀。
  • perfixOverrides:忽略的前缀,忽略trim标签内部首部指定的内容。
  • suffixOverrides:忽略的后缀,忽略trim标签包含内容尾部指定的内容。

示例:

 <select id="getUser" resultType="user">
        select * from user
        <trim prefix="where" prefixOverrides="and|or">
            <if test="id!=null">
                and id=#{id}
            </if>
            <if test="name!=null and name!=''">
                and name like CONCAT('%', #{name}, '%')
            </if>
        </trim>
    </select>

添加测试方法:

 public void getuser(){
        SqlSession session = MyBatisUtils.getSqlSession();
        Integer id=null;
        String name=null;
        List<User> list = session.getMapper(UserMapper.class).getUser(id,name);
        logger.info("当前查出的记录数"+list.size());
        logger.info("查询结果"+list);
        session.commit();
        MyBatisUtils.close(session);
    }

分页查询思路:
limit #{pageBegin},#{pageSize}
#{pageBegin}表示查询开始位置,#{pageSize}表示要查询的数据量。
#{pageBegin}的计算方法为Integer pageBengin=(Pageindex-1) * pageSize;
pageIndex为当前的页数 当前页数-1在乘以每页要显示的数据量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值