mapper.xml中动态sql

mabatis重点是通过标签对sql灵活的组织,通过配置的方式完成输入 输出映射.

1.对mapper.xml中重复的sql抽取统一维护,以及foreach使用

UserMapperCustom.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="cn.itcast.mybatis.mapper.UserMapperCustom">

    <!-- 定义一个sql片段,将重复的sql语句抽取出来
        建议:定义查询条件以单表为单位去定义,sql片段可重用性才高
        建议不要包括where
        建议以单个为单位去定义查询条件,一般要将查询条件写全
     -->
    <sql id="query_user_where">
            <!-- 如果有条件值再拼接 -->
            <if test="user!=null">
                <if test="user.username!=null and user.username!=‘‘">
                    <!-- 用户输入条件值再拼接 -->
                    and username like ‘%${user.username}%‘
                </if>
                <if test="user.sex!=null and user.sex!=‘‘">
                    and sex = #{user.sex}
                </if>
                <!-- 下边要拼接:
                AND  id IN (1,10,16)
                 -->
                <!-- 遍历id列表
                collection:接收输入参数中的集合属性
                item:每次循环定义一个对象名
                open:开始循环时拼接的sql
                close:结束循环时拼接的sql
                separator:每两次循环中间拼接的sql
                -->
                <foreach collection="ids" item="id" open=" AND  id IN ( " close=" ) " separator=",">
                    #{id}
                </foreach>
                <!-- 思考:如何拼接 AND (id=1 OR id=10 OR id=16)   实现 SELECT * FROM USER WHERE sex = ‘1‘ AND  id IN (1,10,16)
-->
            </if>
    </sql>

    <!-- 综合条件查询用户 -->
    <select id="findUserList" parameterType="queryUserVo"
        resultType="user">
        select id,username,birthday,sex,address from user

       <!-- where标签 相关于where关键字,可以将条件中的第一个and去掉 -->
        <where>
        <!-- 引用sql片段
        如果跨mapper引用需要前边加namespace
         -->
        <include refid="query_user_where"></include>
       </where>
    </select>

    <!-- 综合条件查询用户记录汇总 -->
    <select id="findUserCount" parameterType="queryUserVo" resultType="int">
        select count(*) from user
         <!-- where标签 相关于where关键字,可以将条件中的第一个and去掉 -->
        <where>
        <!-- 引用sql片段
        如果跨mapper引用需要前边加namespace
         -->
        <include refid="query_user_where"></include>
       </where>
    </select>

</mapper>

UserMapperCustom.java
public interface UserMapperCustom {

    //综合条件查询用户信息
    public List<User> findUserList(QueryUserVo queryUserVo) throws Exception;

    //综合条件查询用户记录总数
    public int findUserCount(QueryUserVo queryUserVo) throws Exception;

}

原文地址:https://www.cnblogs.com/wwwzzz/p/8277241.html

时间: 2024-08-01 05:46:59

mapper.xml中动态sql的相关文章

My Batis mapper.xml中 动态SQL中使用trim标签 if end的场景

trim标签有点类似于replace效果. trim 属性 prefix:前缀覆盖并增加其内容 suffix:后缀覆盖并增加其内容 prefixOverrides:前缀判断的条件 suffixOverrides:后缀判断的条件 <!-- 修改 --> <update id="updateTest" >        UPDATE test         <trim prefix="SET" suffixOverrides="

Mapper.xml中对象的关联

对象的关联,特别是manytoone的关联,有两种方式:发送一条额外sql去查询和内联的方式 发送一条额外sql:当我在使用到这个关联对象的时候,我发送一条额外的sql去把这个关联的对象查询出来,然后设置到对象里面,这样容易造成n+1的问题 内联方式:在这条sql直接把关联的对象的表连接进来,把需要查询的信息全部查出来,然后直接在resultMap中拼装出关联的对象,这样就可以避免n+1的问题,但是会造成连接的性能损耗 选用原则 : 如果关联的对象要在列表中显示,那么直接使用内联的方式,会造成表

PL/SQL开发中动态SQL的使用方法

一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现. 首先我们应该了解什么是动态SQL,在Oracle数据库开发PL/SQL块中我们使用的SQL分为:静态SQL语句和动态SQL语句.所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象.而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根

MyBatis中动态SQL语句完成多条件查询

http://blog.csdn.net/yanggaosheng/article/details/46685565 MyBatis中动态SQL语句完成多条件查询 <select id="queryEmp"  resultType="cn.test.entity.Emp"> select * from emp where 1=1 <if test="deptNo!=null"> and deptno=#{deptNO} &

Oracle中动态SQL详解(EXECUTE IMMEDIATE)

Oracle中动态SQL详解(EXECUTE IMMEDIATE) 2017年05月02日 18:35:48 悠悠倾我心 阅读数:744 标签: oracle动态sqloracle 更多 个人分类: 数据库 Oracle中动态SQL详解 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运

Mybatis中mapper.xml中的模糊查询

Mybatis中mapper.xml中的模糊查询 <!-- 方法一: 直接使用 % 拼接字符串 注意:此处不能写成 "%#{name}%" ,#{name}就成了字符串的一部分, 会发生这样一个异常: The error occurred while setting parameters, 应该写成: "%"#{name}"%",即#{name}是一个整体,前后加上% --> <if test="name != nul

oracle中动态SQL使用详细介绍

Oracle编译PL/SQL程序块分为两个种:通常静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式,需要了解的朋友可以参考下 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句进

xml中的SQL注入

大家通常知道xml中大部分会导致外部实体注入,但是,xml也会出现SQL注入: 在xml中正常的sql语句写法有两种: 第一: <select id="selectById" resultType="bean.user" > select * from users where id = #id#</select> 第二: <select id="selectById" resultType="bean.us

Oracle中动态SQL详解

1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句进行确定,只能在用户输入一定的查询条件后才能提交给SQL引擎进行处理.通常,静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式.