精华内容
下载资源
问答
  • MyBatis动态标签

    2019-10-01 16:14:14
    MyBatis动态标签 set ​ set标签是Mybatis提供的一个智能标签,一般情况下用在更新操作中。 ​ set标签的功能是动态的配置SET关键字,并且剔除追加到条件末尾的任何不相关的逗号 ​ set和if标签配合使用时,如果某项...

    MyBatis动态标签

    set

    ​ set标签是Mybatis提供的一个智能标签,一般情况下用在更新操作中。

    ​ set标签的功能是动态的配置SET关键字,并且剔除追加到条件末尾的任何不相关的逗号

    ​ set和if标签配合使用时,如果某项数据为null则不进行更新,而是保持数据库原值。

    语法格式

    <set>
        <!--每个字段进行修改必须用逗号接间隔,并且set标签不会自动补全逗号-->
        <if test="uname != null and">uname=#{uname,jdbcType=VARCHAR},</if>
        <if test="use != null">use=#{use,jdbcType=VARCHAR},</if>
    </set>
    

    sql、include

    ​ sql标签用于封装一些通用的sql语句,通过include标签实现sql的复用

    语法格式

    <sql id="Base_Column_List">
        stu_id,stu_name,stu_class
    </sql>
    <!--以下语句相当于直接插入一条字符串-->
    <include refid="Base_Column_List"/>
    

    trim

    语法格式

    <trim prefix="" prefixOverrides="" suffix="" suffixOverrides="">
    </trim>
    
    属性 说明
    prefix 指定一个字符串,替换prefixOverrides属性指定的字符串
    prefixOverrides 指定SQL语句的前缀字符串(如果不是则不起作用),用prefix指定字符串替换该属性指定的字符串
    suffix 指定一个字符串替换suffixOverrides属性指定的字符串
    suffixOverrides 指定SQL语句的后缀字符串(如果不是则不起作用),用suffix指定字符串替换该属性指定的字符串

    功能说明

    • 如果标签中有SQL语句就把格式化后的SQL语句拼接到之前的SQL语句上,如果标签体中没有SQL语句,则该标签相当于不存在
    • 该标签的四个属性默认值都为空字符串
    • 如果prefixOverrides值为空字符串,相当于prefix指定的字符串拼接到SQL语句首位
    • 如果prefix值为空字符串,相当于删除prefixOverrides指定的字符串

    使用实例

    检索

    SELECT * FROM user
    <trim prefix="WHERE" prefixOverrides="AND|OR">
        <if test="name != null and name != ''">AND name = #{name}</if>
        <if test="gender != null and gender != ''"> AND gender = #{gender}</if>
    </trim>
    
    SELECT * FROM user
    <where>
        <trim prefixOverrides="AND|OR">
        <if test="name != null and name != ''">AND name = #{name}</if>
        <if test="gender != null and gender != ''"> AND gender = #{gender}</if>
    </trim>
    </where>
    
    

    更新

    UPDATE user
    <trim prefix="SET" suffix="WHERE id = #{id}" suffixOverrides=",">
    	    <if test="name != null and name != ''">name = #{name},</if>
        <if test="gender != null and gender != ''">gender = #{gender},</if>
    </trim> 
    

    分组

    SELECT stafid,companyId,area
    FROM user
    	<trim prefix="GROUP BY" suffixOverrides=",">
            <if test="param.staffId != null">
           		t.staffId, 
            </if>
            <if test="param.companyId != null">
                t.companyId,
            </if>
            <if test="param.area != null">
                area,
            </if>
    	</trim>
    

    foreach

    ​ foreach标签主要用在构建IN条件中,它可以在SQL语句中迭代一个集合

    语法格式

    <foreach collection="" item="" index="" open="" separator="" close="">
    </foreach>
    
    属性 说明
    collection 传入的参数的数据类型(对象),必选
    item 指定一个字符串作为名称,表示集合每次迭代过程中的元素(对象),支持点路径访问,必选
    index 指定一个字符串作为名字,用于迭代过程中,每次迭代到的位置
    open 开始的字符串
    separator 每次进行迭代时分隔字符串
    close 结束的字符串

    collection属性

    ​ 该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下3种情况:

    • 如果传入的是单参数且参数类型是一个List,则默认使用list作为List对象的键
    • 如果传入的是单参数且参数类型是一个Array,则默认使用array作为Array对象的键
    • 如果传入的参数是多个,可以封装到一个Map中,但是Map对象没有默认的键,必须使用**@Param注解指定collection的键。多参数也可以分别使用注解@Param独立传入,不需要封装到Map**中

    键值覆盖:List对象和Array对象默认键(collection属性值)分别为list和arraya,但是可以使用注解@Param进行覆盖

    index和item属性

    index和item属性值自由指定,当传入对象是List和Array时,index表示元素下标,item表示元素值(对象),

    当传入对象是Map时,index表示key,item表示value

    传入参数可以是一个包含List、Array或Map的对象,这时访问就需要使用点路径进行访问。

    例如一个名为User的对象包含一个名为message的List,则进行迭代时,colleaction属性值设定为User.message,需要使用@Param指定键名

    使用实例

    使用foreach实现IN语句

    <foreach collection="list" item="t" open="AND name IN(" separator="," close=")">
        #{t}
    </foreach> 
    

    网络资源

    https://my.oschina.net/u/3555887/blog/1838220

    https://www.cnblogs.com/caoyajun33-blog/p/6875169.html


    if

    ​ if标签用于添加条件判断,配合其他动态标签可以根据传入参数动态生成SQL语句

    语法格式

    <if test="id != null">
    </if>
    

    test属性对应的表达式中可以进行一系列条件判断,但是需要注意的是,在这里使用大于小于大于等于 等判断符号时需要转义,以下罗列了常用需要转义的字符:

    常规字符 转义字符
    & &amp;
    < &lt;
    > &gt;
    ``" &quot;
    ' &apos;
    <= &lt;=<![CDATA[<= ]]>
    >= &gt;=<![CDATA[>= ]]
    != <![CDATA[ <> ]]><![CDATA[!= ]]>

    xml解析忽略字符

    放在<![CDATA[ ]]>中的字符串在解析xml文件时将会被忽略,因此应该仅仅包含>、<等特殊字符,而不能包含动态sql标签。


    where

    ​ where标签的作用是自动生成WHERE子句,同时自动去除条件语句开头的OR或AND关键字。如果所有条件都不满足,那Mybatis就会查询出所有的数据。

    使用实例

    <where>
       <if test="uname != null and uname ! = ''">
           AND uname LIKE CONCAT('%',#{uname},'%')
       </if>
       <if test="usex != null and usex != '' ">
           AND use = #{use}
       </if >
    </where>
    

    choose、when、otherwise

    ​ chosse、when和otherwise标签配合使用实现Java中switch语法效果。

    ​ MyBatis动态sql中没有同if-else语法相似的标签元素,只能通过choose、when和otherwise组合变相实现if-else语法。

    语法格式

    <!--switch-->
    <choose>
    	<when test=""></when>
        <when test=""></when>
        <otherwise></otherwise>
    </choose>
    
    <!--if-else-->
    <choose>
    	<when test=""></when>
        <otherwise></otherwise>
    </choose>
    

    selectKey

    该标签用来返回新增成功的字段数据, 一般来说都是用来返回数据库内部生成的主键值的,比如自增主键和自动生成的uuid主键

    值得注意的是

    selectKey返回的值是保存在传入参数中的,而不是直接作为方法返回值。

    语法格式

    <select>
        <selectKey id="" keyProperty="" order="" resultType="">
        	SELECT /*代码实现*/;
    	</selectKey>
        INSERT INTO tableName(
        	field1,field2
        )
        VALUES(
        	#{field1},
        	#{field2}
        )
    </select>
    
    属性 说明
    keyProperty 设置语句返回结果的目标字段名。
    keyColumn 通过生成键值设置表中的列名,这个设置仅在某些数据库中是必须的(如PostgreSQL),当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
    order 设置selectKey标签和外层标签的执行顺序,可以设置为BEFOREAFTER,分别表示selectKey先执行和后执行。(需要注意的是,如果在插入数据时期望返回结果为自增主键,则该属性必须设定为AFTER,才能通过LAST_INSERT_ID函数拿到正确的主键)
    resultType 返回结果的数据类型。MyBatis允许任何简单类型(包含字符串)作为主键类型。
    statementType 设置sql语句的映射类型。选值为STETEMENT、PREPARED、CALLABLE

    使用实例

    • 获取自增主键

    1.实体类

    /*StudentEntity.calss*/
    public class StudentEntity implements Serializable {
        private static final long serialVersionUID = -86709138255246164L;
        /*学生主键*/
        private Integer stuId;
        /*学生姓名*/
        private String stuName;
        /*学生性别*/
        private String stuGender;
        /*学生年龄*/
        private Integer stuAge;
        /*学生身高*/
        private String stuHeight;
        /*学生体重*/
        private String stuWeight;
        /*学生年级*/
        private String stuRank;
        /*学生班级*/
        private String stuClass;
        /*学生住址*/
        private String stuAddress;
        /*get and set ...*/
    }
    

    2.Dao层接口

    Integer insertStudent(StudentEntity studentEntity);
    

    3.映射文件

    <!--添加学生信息-->
    <insert id="insertStudent" parameterType="StudentEntity">
        <selectKey keyProperty="stuId" order="AFTER" resultType="java.lang.Integer">
            SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO stream_student(
        stu_name,stu_gender,
        stu_age,stu_height,
        stu_weight,stu_rank,
        stu_class,stu_address
        )VALUES(
        #{stuName,jdbcType=VARCHAR},
        #{stuGender,jdbcType=VARCHAR},
        #{stuAge,jdbcType=INTEGER},
        #{stuHeight,jdbcType=VARCHAR},
        #{stuWeight,jdbcType=VARCHAR},
        #{stuRank,jdbcType=VARCHAR},
        #{stuClass,jdbcType=VARCHAR},
        #{stuAddress,jdbcType=VARCHAR}
        )
    </insert>
    

    4.测试方法

    public void getStudent() {
        StudentEntity studentEntity = new StudentEntity();
        studentEntity.setStuAge(1);
        studentEntity.setStuName("测试");
        int row = selectKeyDao.insertStudent(studentEntity);//方法返回的还是新增行数
        System.err.println("新增的主键为:" + studentEntity.getStuId());//selectKey标签将指定值赋值给了对象的指定属性
        System.err.println("新增的行数为:" + row);
    }
    
    • 获取非自增主键

      在开发过程中通常使用UUID作为主键,字段类型为字符串类型。

    1.实体类

    /*CourseEntity.calss*/
    public class CourseEntity implements Serializable {
        private static final long serialVersionUID = -2857317476780544289L;
    
        /*课程主键*/
        private String couId;
        /*课程名称*/
        private String couName;
        /*课程周期*/
        private Integer couPeriod;
        /*课程类型*/
        private String couType;
        /*课程学分*/
        private Integer couCredits;
            /*get and set ...*/
        }
    

    2.Dao层接口

    Integer insertCourse(CourseEntity courseEntity);
    

    3.映射文件

    <insert id="insertCourse" parameterType="com.ziytek.taozhu.mybaits.entity.CourseEntity">
        <selectKey order="BEFORE" resultType="java.lang.String" keyProperty="couId">
            SELECT (REPLACE(UUID(),'-','')
        </selectKey>
        <!--order属性必须设置为BEFORE否则将没有主键值进行插入-->
        INSERT INTO stream_course(
        cou_id,cou_name,
        cou_period,cou_type,cou_credits
        )VALUES(
        #{couId,jdbcType=VARCHAR},
        #{couName,jdbcType=VARCHAR},
        #{couPeriod,jdbcType=VARCHAR},
        #{couType,jdbcType=VARCHAR},
        #{couCredits,jdbcType=INTEGER}
        )
    </insert>
    

    4.测试方法

    @Test
    public void insertCourse() {
        CourseEntity courseEntity = new CourseEntity();
        courseEntity.setCouName("测试");
        courseEntity.setCouPeriod(11);
        courseEntity.setCouType("测试");
        courseEntity.setCouCredits(11);
        int row = selectKeyDao.insertCourse(courseEntity);
        System.err.println("新增主键为:" + courseEntity.getCouId());
        System.err.println("新增的行数:" + row);
    }
    

    其他方法获取自增主键值

    设置useGeneratedKeys=true进行返回自增主键

    • 该属性只能用于Insert操作中,update操作不能使用

    • 该方法只能返回主键数据

    • 这种方式只能用在支持自动增长的数据库,比如MySql可以使用,而Orcale就只能用selectKey的方式返回主键。

    使用实例:

    <!--keyProperty指定实体类属性,keyColumn指定数据库字段-->
    <insert id="insertStudentUseGeneratedKeys" useGeneratedKeys="true" keyProperty="stuId" keyColumn="stu_id"
      parameterType="com.ziytek.taozhu.mybaits.entity.StudentEntity">
          INSERT INTO stream_student(
    stu_name,stu_gender,
    stu_age,stu_height,
    stu_weight,stu_rank,
    stu_class,stu_address
    )VALUES(
    #{stuName,jdbcType=VARCHAR},
    #{stuGender,jdbcType=VARCHAR},
    #{stuAge,jdbcType=INTEGER},
    #{stuHeight,jdbcType=VARCHAR},
    #{stuWeight,jdbcType=VARCHAR},
    #{stuRank,jdbcType=VARCHAR},
    #{stuClass,jdbcType=VARCHAR},
    #{stuAddress,jdbcType=VARCHAR}
    )
    </insert>
    

    网络资源

    https://blog.csdn.net/xu1916659422/article/details/77921912

    https://blog.csdn.net/u014515854/article/details/82863055

    https://www.cnblogs.com/dongfangshenhua/p/7091198.html


    insert、update、delete

    语法格式

    <insert id="" parameterType="">
        INSERT INTO user(id,name,password,age,deleteFlag)
        VALUES(#{id},#{name},#{password},#{age},#{deleteFlag})
    </insert>
    
    <update id="" parameterType="">
    	UPDATE tableName
        SET field1=#{field1},field2=#{field2}
        WHERE field3=#{field3}
    </update>
    
    <delete id="" parameterType="">
        DELETE FROM tableName 
        WHERE field1=#{field1}
    </delete>
    
    属性 配置 说明
    id 必选配置 命名空间唯一标识符,一个命名空间对应一个持久层接口,该id对应持久层中的某个方法,需要同方法名保持一致。
    parameterType 可选配置 指定传入参数的全限定名或别名,默认Mybatis自动推断出传入参数的类型。指定的数据类型可以是基本数据类型和String,或对象
    flushCache 可选配置(默认为true) 用于设置在调用SQL语句后是否要求MyBatis清空之前查询的本地缓存和二级缓存,默认值为false,如果设置为true,则任何时候调用该SQl语句都将清空本地和二级缓存(对应插入、更新和删除语句)
    statementType 可选配置(默认为PREPARED) 指定JDBC类型,取值为STATEMENT(Statement)PREPARED(PreparedStatement)CALLABLE(CallableStatement),默认值为PREPARED
    keyProperty 可选配置(默认为unset) 唯一标记一个属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表
    keyColumn 可选配置 通过生成的键值设置表中的列名。这个设置仅在某些数据库(PosrgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表
    useGeneratedKeys 可选配置(默认为false) 使能MyBatis使用JDBC的getGeneratedKeys方法来取出由数据库内部生成的主键(比如MySql和SQLServer中的自动递增字段)
    timeout 用于设置超时的参数,单位是秒,超时将抛出异常(即设定等待数据库返回请求结果的时间,如果数据没有在指定时间内返回数据则抛出异常)

    注意:以上属性中keyProperty、keyColumn、useGeneratedKeys仅对insert和update有用


    select

    select标签用于映射SQL语句的SELECT语句。

    属性 配置 说明
    id 必选配置 同Mapper的命名空间组合起来作为唯一标识,供MyBaits调用,同持久层接口文件中的方法名需保持一致
    paramterType 可选配置 指定传入参数的全限定名或别名,默认Mybatis自动推断出传入参数的类型。指定的数据类型可以是基本数据类型和String,或对象
    resultType 同(resultType和reslutMap)二选一配置 指定返回类型的全限定名。指定的类型可以是基本数据类型容器Bean对象
    reslutMap 同(resultType和reslutMap)二选一配置 指定引用的返回参数映射集,需同标签一起使用,是高级复杂映射的关键
    flushCache 可选配置 用于设置在调用SQL语句后是否要求MyBatis清空之前查询的本地缓存和二级缓存,默认值为false,如果设置为true,则任何时候调用该SQl语句都将清空本地和二级缓存
    useCache 可选配置 启动二级缓存的开关,默认值为true,表示将查询结果存入二级缓存中
    timeout 可选配置 用于设置超时的参数,单位是秒,超时将抛出异常(即设定等待数据库返回请求结果的时间,如果数据没有在指定时间内返回数据则抛出异常)
    fethchSize 可选配置 尝试在获取数据时进行分批获取,指定每次分批获取的数量
    statementType 可选配置 指定JDBC类型,取值为STATEMENT(Statement)PREPARED(PreparedStatement)CALLABLE(CallableStatement),默认值为PREPARED
    resultSetType 可选配置 FORWARD_ONLYSCROLL_SENSITIVE或者SCROLL_INSENSITIVE。默认为空。

    网络资源

    https://www.cnblogs.com/dongying/p/4073259.html

    https://www.cnblogs.com/wangdaijun/p/6132604.html


    reslutMap

    reslutMap实现复杂的映射关系,是实现多对一一对多关系的关键。

    resultMap语法

    <!--
    	type 对应JavaBean对象的完全限定名或别名,也可以是其他类型
    	id resultMap标签的唯一标识符,通过id对映射关系进行引用
    -->
    <resultMap type="" id="">
        <!--id为JavaBean的唯一标识,不一定是数据库主键
    		property对应JavaBean类中的属性名
    		column对应数据库中的字段名,
    		(通过propert和column指定数据库表字段注入的属性,
    		不用需要指定字段别名的情况)
    	-->
    	<id property="" column=""/><!--对应主键属性-->
        <result property="" column_""/><!--对应普通属性-->
        
        <!--constructor对应JavaBean中的构造方法-->
        <constructor>
        	<idArg column=""/><!--idArg对应构造方法中的id参数-->
            <arg column=""/><!--arg对应构造方法中的普通参数-->
        </constructor>
        
        <!--
    	collection 处理一对多的关联关系
    	property 对应JavaBean中容器对应的属性名
    	column 对应数据库表中的字段名
    	ofType 指定JavaBean中容器的类型
    	resultMap 用于引用外部映射关系
    	-->
        <collection property="" column="" ofType="" resultMap="">
            <id property="" column=""/>
        	<result property="" column_""/>
        </collection>
        
        <!--
    	association 处理一对一的关联关系
    	property JavaBean容器中对应的属性
    	column 对应数据库表中的字段名
    	javaType 指定关联的数据类型
    	resultMap 用于引用外部映射关系,可以将association中的映射关系提取到外部的resultMap中
    	-->
        <association property="" column="" javaType="" resultMap="">
            <id property="" column=""/>
        	<result property="" column_""/>
        </association>
    </resultMap>
    

    collection和associationi的区别

    association映射的是一个JavaBean类

    使用实例

    Student.java

    public class Student {
        private int id;
        private String idCard;
        private String name;
        private List<Course> courseList;
        private int deleteFlag;
        public Student(int id, String idCard, String name, List<Course> courseList, int deleteFlag){
            /*......*/
        }
        
        /*省略get和set方法*/
        }
    

    Course.java

    public class Course {
        private int id;
        private String name; 
        private int deleteFlag;
        /*省略get和set方法*/
    }
    

    reslutMap处理一对多关系的映示例:

    <resultMap type="student" id="student"><!--type指定全路径名或别名-->
        <id property="idCard" column="stu_id_card"/>
        <result property="id" column="stu_id"/>
        <result property="name" column="stu_name"/>
        <result property="deleteFlag" column="stu_delete_flag"/>
        
        <collection property="courseList" column="stu_course_id" ofType="Course">	
        	<id property="name" column="course_name"/>
            <result property="deleteFlag" course="course_delete_flag"/>
        </collection>
    </resultMap>
    
    <select id="findStudentById" resultMap="studentMap">
        SELECT s.*,c.*
        FROM t_student s LEFT JOIN t_course 
        ON s.stu_course_id = c.course_id
        WHERE s.stu_id_card = #{idCard}
    </select>
    

    网络资源

    https://www.cnblogs.com/dongying/p/4073259.html


    展开全文
  • MyBatis动态标签.pdf

    2021-04-07 16:27:11
    MyBatis动态标签.pdf
  • Mybatis动态标签

    2018-08-03 15:37:52
    if 标签可用在许多类型的 SQL 语句中,我们以查询为例。首先看一个很普通的查询: &lt;!-- 查询用户列表,like用户名称 --&gt; &lt;select id="getUserListLikeName" parameterType="...

     if 标签可用在许多类型的 SQL 语句中,我们以查询为例。首先看一个很普通的查询:
    <!-- 查询用户列表,like用户名称 -->  

    <select id="getUserListLikeName" parameterType="User" resultMap="userResultMap">  
        SELECT * from user u   
    WHERE u.username LIKE CONCAT(CONCAT('%', #{username}),'%')  
    </select>

    但是当 username 或 sex 为 null 时,此语句很可能报错或查询结果为空。此时我们使用 if 动态 sql 语句先进行判断,如果值为 null 或等于空字符串,我们就不进行此条件的判断,增加灵活性。

    参数为实体类:User。将实体类中所有的属性均进行判断,如果不为空则执行判断条件。<!-- 添加 if(判断参数) - 将实体类 User 不为空的属性作为 where 条件 -->  

    <select id="getUserList" resultMap="resultMap_User" parameterType="com.yiibai.pojo.User"> 
        SELECT u.username,  
               u.password,  
               u.sex,  
               u.birthday,  
               u.photo,  
               u.score,  
               u.sign
          FROM user u   
         WHERE  
        <if test="username !=null ">  
            u.username LIKE CONCAT(CONCAT('%', #{username, jdbcType=VARCHAR}),'%')  
        </if>  
        <if test="sex!= null and sex != '' ">  
            AND u.sex = #{Sex, jdbcType=INTEGER}  
        </if>  
        <if test="birthday != null ">  
            AND u.birthday = #{birthday, jdbcType=DATE}  
        </if>  
    
        <if test="userId != null and userId != '' ">  
            AND id.user_id = #{userId, jdbcType=VARCHAR}  
        </if>   
    </select> 

    使用时比较灵活,创建新的一个这样的实体类,我们需要限制那个条件,只需要附上相应的值就会 where 这个条件,相反不去赋值就可以不在 where 中判断。

    public void select_by_if() {  
        User user = new User();  
        user.setUsername("");  
        user.setSex(1);  
        user.setBirthday(DateUtil.parse("1990-08-18"));  
        List<User> userList = this.dynamicSqlMapper.getUserList_if(user);  
        for (user u : userList) {  
            System.out.println(u.toString());  
        }  
    } 


    当 where 中的条件使用的 if 标签较多时,这样的组合可能会导致错误。当 java 代码按如下方法调用时:

    @Test  
    public void select_test_where() {  
        User user = new User();  
        user.setUsername(null);  
        user.setSex(1);  
        List<User> userList = this.dynamicSqlMapper.getUsertList_where(user);  
        for (User u : userList ) {  
            System.out.println(u.toString());  
        }  
    }  

    如果上面例子,参数 username 为 null,将不会进行列 username 的判断,则会直接导“WHERE AND”关键字多余的错误 SQL。这时可以使用 where 动态语句来解决。“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以 AND 或OR 开头的,则它会剔除掉。

    where 元素的作用是会在写入 where 元素的地方输出一个 where,另外一个好处是你不需要考虑 where 元素里面的条件输出是什么样子的,MyBatis 会智能的帮处理,如果所有的条件都不满足那么 MyBatis 就会查出所有的记录,如果输出后是 and 开头的,MyBatis 会把第一个and忽略,当然如果是 or 开头的,MyBatis 也会把它忽略;此外,在 where 元素中你不需要考虑空格的问题,MyBatis 会智能的帮你加上。像上述例子中,如果 title=null, 而 content != null,那么输出的整个语句会是 select * from t_blog where content = #{content},而不是 select * from t_blog where and content = #{content},因为 MyBatis 会自动地把首个 and / or 给忽略。

    上面例子修改为:

    <select id="getUserList_whereIf" resultMap="resultMap_User" parameterType="com.yiibai.pojo.User">  
        SELECT u.user_id,  
               u.username,  
               u.sex,  
               u.birthday 
          FROM User u
        <where>  
            <if test="username !=null ">  
                u.username LIKE CONCAT(CONCAT('%', #{username, jdbcType=VARCHAR}),'%')  
            </if>  
            <if test="sex != null and sex != '' ">  
                AND u.sex = #{sex, jdbcType=INTEGER}  
            </if>  
            <if test="birthday != null ">  
                AND u.birthday = #{birthday, jdbcType=DATE}  
            </if> 
        </where>    
    </select>  
    where 主要是用来简化 sql 语句中 where 条件判断,自动地处理 AND/OR 条件。
    
    <select id="dynamicWhereTest" parameterType="Blog" resultType="Blog">
            select * from t_blog 
            <where>
                <if test="title != null">
                    title = #{title}
                </if>
                <if test="content != null">
                    and content = #{content}
                </if>
                <if test="owner != null">
                    and owner = #{owner}
                </if>
            </where>
        </select>

    set 标签元素主要是用在更新操作的时候,它的主要功能和 where 标签元素其实是差不多的,主要是在包含的语句前输出一个 set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果 set 包含的内容为空的话则会出错。有了 set 元素就可以动态的更新那些修改了的字段。

    set - 更新语句
    当 update 语句中没有使用 if 标签时,如果有一个参数为 null,都会导致错误。

    当在 update 语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置 SET 关键字,并剔除追加到条件末尾的任何不相关的逗号。使用 if+set 标签修改后,如果某项为 null 则不进行更新,而是保持数据库原值。如下示例:
    <!--  if/set(判断参数) - 将实体 User类不为空的属性更新 -->  

    <update id="updateUser_if_set" parameterType="com.pojo.User">  
        UPDATE user  
        <set>  
            <if test="username!= null and username != '' ">  
                username = #{username},  
            </if>  
            <if test="sex!= null and sex!= '' ">  
               sex = #{sex},  
            </if>  
            <if test="birthday != null ">  
                birthday = #{birthday},  
            </if>  
        </set>  
        WHERE user_id = #{userid};      
    </update>  

    trim 元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是 prefix 和 suffix;可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是 prefixOverrides 和 suffixOverrides;正因为 trim 有这样的功能,所以我们也可以非常简单的利用 trim 来代替 where 元素的功能。

    trim代替where/set标签
    trim 是更灵活用来去处多余关键字的标签,它可以用来实现 where 和 set 的效果。

    <!-- 使用 if/trim 代替 where(判断参数) - 将 User 类不为空的属性作为 where 条件 -->  

    <select id="getUsertList_if_trim" resultMap="resultMap_User">  
        SELECT * 
          FROM user u
        <trim prefix="WHERE" prefixOverrides="AND|OR">  
            <if test="username !=null ">  
                u.username LIKE CONCAT(CONCAT('%', #{username, jdbcType=VARCHAR}),'%')  
            </if>  
            <if test="sex != null and sex != '' ">  
                AND u.sex = #{sex, jdbcType=INTEGER}  
            </if>  
            <if test="birthday != null ">  
                AND u.birthday = #{birthday, jdbcType=DATE}  
            </if>
        </trim>     
    </select>  


    trim 代替 set
    <!-- if/trim代替set(判断参数) - 将 User 类不为空的属性更新 -->  

    <update id="updateUser_if_trim" parameterType="com.yiibai.pojo.User">  
        UPDATE user  
        <trim prefix="SET" suffixOverrides=",">  
            <if test="username != null and username != '' ">  
                username = #{username},  
            </if>  
            <if test="sex != null and sex != '' ">  
                sex = #{sex},  
            </if>  
            <if test="birthday != null ">  
                birthday = #{birthday},  
            </if>         
        </trim>  
        WHERE user_id = #{user_id}  
    </update>  

     

    choose (when, otherwise)标签
    有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。而使用if标签时,只要test中的表达式为 true,就会执行 if 标签中的条件。MyBatis 提供了 choose 元素。if标签是与(and)的关系,而 choose 是或(or)的关系。

    choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。

    例如下面例子,同样把所有可以限制的条件都写上,方面使用。choose会从上到下选择一个when标签的test为true的sql执行。安全考虑,我们使用where将choose包起来,放置关键字多于错误。

    <!--  choose(判断参数) - 按顺序将实体类 User 第一个不为空的属性作为:where条件 -->  

    <select id="getUserList_choose" resultMap="resultMap_user" parameterType="com.yiibai.pojo.User">  
        SELECT *  
          FROM User u   
        <where>  
            <choose>  
                <when test="username !=null ">  
                    u.username LIKE CONCAT(CONCAT('%', #{username, jdbcType=VARCHAR}),'%')  
                </when >  
                <when test="sex != null and sex != '' ">  
                    AND u.sex = #{sex, jdbcType=INTEGER}  
                </when >  
                <when test="birthday != null ">  
                    AND u.birthday = #{birthday, jdbcType=DATE}  
                </when >  
                <otherwise>  
                </otherwise>  
            </choose>  
        </where>    
    </select>  

    choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中 的 choose 很类似。

    when元素表示当 when 中的条件满足的时候就输出其中的内容,跟 JAVA 中的 switch 效果差不多的是按照条件的顺序,当 when 中有条件满足的时候,就会跳出 choose,即所有的 when 和 otherwise 条件中,只有一个会输出,当所有的我很条件都不满足的时候就输出 otherwise 中的内容。所以上述语句的意思非常简单, 当 title!=null 的时候就输出 and titlte = #{title},不再往下判断条件,当title为空且 content!=null 的时候就输出 and content = #{content},当所有条件都不满足的时候就输出 otherwise 中的内容。

    <select id="dynamicChooseTest" parameterType="Blog" resultType="Blog">
            select * from t_blog where 1 = 1 
            <choose>
                <when test="title != null">
                    and title = #{title}
                </when>
                <when test="content != null">
                    and content = #{content}
                </when>
                <otherwise>
                    and owner = "owner1"
                </otherwise>
            </choose>
        </select>

     

    展开全文
  • mybatis 动态标签

    2017-08-07 12:15:15
    delete from ${dmlItem.tableName}    test="dmlItem.id != null">  where ${dmlItem.pkColumn} = #{dmlItem.id}      where 1 = 1
     <delete id="delete" parameterType="***">
            delete from ${dmlItem.tableName}
            <choose>
                <when test="dmlItem.id != null">
                    where ***
                </when>
                <otherwise>
                    where ***
                </otherwise>
            </choose>

        </delete>



      <select id="getOne" resultType="java.util.Map">
            select
            ${queryItem.fields}
            <choose>
                <when test   =   "queryItem.addRanking">
                                from (

                                        select a.*, (@rownum:=@rownum+1) as ranking from ${queryItem.tableName} a, 

                                        (select  @rownum:=0) b
                    <if  test  =  'queryItem.orders != null    and   !"".equals(queryItem.orders)'>
                                       order by ${queryItem.orders}
                    </if>
                    

                    ) c


                </when>
                <otherwise>
                               from ${queryItem.tableName}
                </otherwise>
            </choose>
                              where 1 = 1
                             ${queryItem.whereCondition}
            <if test='queryItem.group != null and !"".equals(queryItem.group)'>
                             group by ${queryItem.group}
            </if>
            <if test='queryItem.orders != null and !"".equals(queryItem.orders)'>
                             order by ${queryItem.orders}
            </if>
            ${queryItem.pageFooter}
        </select>





       <insert id="insertRateInfoList" useGeneratedKeys="true" parameterType="java.util.List">  
            insert into loan_rate(loan_id,loan_name,period_from,period_to)
     values
           <foreach collection="list"      item="item"      index="index"       separator="," >  
            (#{item.loan_id},#{item.loan_name},#{item.period_from},#{item.period_to}) 
         </foreach> 
       </insert>

    展开全文
  • mybatis动态标签 xml中的转义 小于号(<) &lt; 大于号(>) &rt; 和(&) &amp; 单引号(') &apos; 双引号(") &quot; <![CDATA[在这里写的内容就不需要使用转义字符]]> if标签 ...

    mybatis动态标签


    • xml中的转义

      小于号(<)  &lt;
      大于号(>)  &rt;
      和(&)     &amp;
      单引号(')  &apos;
      双引号(")  &quot;
      <![CDATA[在这里写的内容就不需要使用转义字符]]>
      
    • if标签 test差数里面是java代码 而且title可以直接引用 词句的意思是title包含’战’ 并且 title不等于’战斗’

      <if test="title.contains(''.toString()) &amp;&amp;!title.equals('战斗'.toString())">and #{title} like '战争' </if>
      
    • choose,when,otherwise标签 相当于java中的switch,case,defalult

      <choose>
      	<when test="arg>4">and 3=3</when>
      	<when test="arg&lt;4">and 4=4 </when>
      	<otherwise>and 5=5</otherwise>
      </choose>
      
    • where标签 代替SQL中的where 并且会自动去除首个多余and或者or 防止出现语法错误

      <where>
      	<if test="title.contains(''.toString()) &amp;&amp; !title.equals('战斗'.toString())">and #{title} like '战争' </if>
      	<if test="title.length()>1">and 2=2</if>
      	<choose>
      		<when test="arg>4">and 3=3</when>
      		<when test="arg&lt;4">and 4=4 </when>
      		<otherwise>and 5=5</otherwise>
      	</choose>
      </where>
      
    • set标签 代替SQL中的set 并且会自动去除最后多余的 ‘,’ 防止出现语法错误

      <update id="updateBlog" parameterType="Blog">
      	update blog
      	<set>
              title = #{title},
              content= #{content},
              create_time = #{createTime},
              type=#{type},
      	</set>
          <where>
          	id = #{id}
          </where>
      </update>
      
    • foreach标签 用来处理多个用在同一处的参数 比如 where type in (arg1,arg2,arg3) values(arg1,arg2,arg3) 可以多个参数封装成一个数组或者list传入 ,然后通过foreach拿出 ,拼接成指定格式的SQL

      <!-- 参数说明:
      	item: 即从list或者array取出来的一个个值的命名.
      	index: 迭代的次数,即是list或array中的第几个的命名
      	open: 拼接的开始  比如"("
      	separator: 拼接的分隔符 比如","
      	close: 拼接的结束 比如")"
      	collection: 有两种种情况:
      		1. 如果传入的是单个参数(即dao中方法的参数):是数组就填array,是list就填list
      		2. 如果传入的是多个参数(Map或者参数列表):如果是Map,就填对应数组或者list的key值,如果是参数列表就填注解值或者参数下标
      -->
      <!-- 第一种collection参数情况 -->
      <select id="getByList" resultType="Blog">
              select * from blog where type in
              <foreach collection="list" item="type" index="index" open="(" separator="," close=")">
                  <!-- item和index其实是取别名,为了在foreach标签内使用 -->
                  #{type}
              </foreach>
      </select>
      
      <select id="getByArray" resultType="Blog">
              select * from blog where type in
              <foreach collection="array" item="type" open="(" separator="," close=")">
                  #{type}
              </foreach>
      </select>
      
      <!-- 第二种collection参数情况 -->
      <!-- map.put("types",list) -->
      <select id="getByMap" resultType="Blog">
              select * from blog where type in
              <foreach collection="types" item="type" index="index" open="(" separator="," close=")">
                  #{type}  
              </foreach>
      </select>
      
    展开全文
  • mybatis 动态标签详解

    2021-05-11 20:32:13
    if 标签 if标签中有一个test属性,test属性值是一个符合OGNL要求的判断表达式,表达式的结果可以使true或者false, 除此之外所有的非0值都为true (1)、数字类型 1.1 例如: 如果参数为数字类型的时候没有特俗需求...
  • Mybatis 动态标签小结

    2020-09-28 16:05:30
    mybatis 标签的一些关键字: eg: <select id="selectPersionByID"parameterType="java.lang.String" resultMap="PersonResultMap"> select * from person where id=#{id} </sele...
  • Mybatis 动态标签之 if

    2021-04-14 17:16:31
    这里记录一个关于 Mybatis 中 if 标签的知识点 在使用<if test=""> </if> 时, 当 test 中 的对比条件为一个字符时, 有可能会发生类型转换异常 java.lang.NumberFormatException 说在前面 : 我传入 ...
  • mybatis动态标签使用

    2021-01-15 09:59:47
    讲的很好 https://blog.csdn.net/qq_39623058/article/details/88779242
  • Mybatis 动态标签 set

    2020-06-14 16:18:25
    一般只用于修改
  • Mybatis 动态标签 if

    2020-06-14 16:09:51
    <insert id=”insert2 ” useGeneratedKeys=” true keyProperty insert into sys user( user_name, user_password, <if test=”userEmail != null and userEmail != ””> useremail , ...
  • Mybatis 动态标签 where

    2020-06-14 16:16:44
  • mybatis 动态标签配置

    2019-07-06 16:44:23
    标签: 我们根据实体类的不同取值,使用不同的 SQL 语句来进行查询。比如在 id 如果不为空时可以根据 id 查询, 如果 username 不为空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到 1....
  • MyBatis通过 OGNL 来进行动态 SQL 书写。 几种常用标签: 元素 常用属性 作用 示例 if test 判断语句,单支条件 &lt;if test="name != null and name !=''"&gt;and name like concat('%',...
  • 1. if 标签 : test里面写条件 <if test="name != null and name != ''"> and NAME = #{name} </if> 2. foreach 标签:主要用于构建in条件,可在sql中对集合进行迭代。也常用到批量删除、添加等操作...
  • 今天熟悉项目的时候,看到mybatis的sqlxml文件中配置的有这句: <trim prefix="(" suffix=")" suffixOverrides=",">...一般是sql语句中有多个动态标签,比如if,最终编译成sql的时候,可能有多余的, ...
  • Mybatis动态标签用法

    2016-06-29 15:59:11
    本文转自:http://tiannanyi.blog.163.com/blog/static/18735934420153345927979/ 转载请注明出处--1、动态SQL片段通过SQL片段达到代码复用<...--动态条件分页查询--> <sqlid="sql_count"> selectco...
  • 本质上是if else ... SysUser selectByidOrUserName(SysUser sysUser) ;...select id=”selectByidOrUserName” resultType=” tk.mybatis.simple.m0del. SysUser” > select id, user name userNa
  • mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd...
  • mybatis动态标签的学习

    2017-09-09 19:33:19
     <select id="getEmpsByConditionIf" resultType="com.mybatis.bean.Employee">  select * from tbl_employee  <!-- where -->    <!-- test:判断表达式(OGNL)  OGNL参照PPT或者官方文档。  c...
  • 实验室的项目,Excel文件的数据入库,原始录入语句如下: void insertCaculatePlanData(@Param("excelName") String excelName, @Param("CaculatePlanColumnName") List<String>CaculatePlanColumnName, ...
  • 抽取可重用的sql标签 方便后面引用 可以在里面定义动态sql和内置参数 比如经常要查询的列名,或者插入用到的列名 include 还可以自定义一些属性 sql标签内部可以使用这些自定义的属性 取值使用${} 而不是#{}以后...
  • 如下为用if test动态标签,判断两个参数不为空. 只有当start和end都不为空的时候,才会进入limit &lt;if test="start!= null and end!=null" &gt; limit ${start},${end} &lt;/if&gt;....
  • SqlSessionFactory初始化:[url]... Mybatis加载解析Mapper(xml)文件第一讲:[url]http://donald-draper.iteye.com/blog/2333125[/url] Mybatis加载解析Mapper(xml)文件第二讲:[url]http://dona...
  • MyBatis在生成update语句时若使用if标签,如果前面的if没有执行,则可能导致有多余逗号的错误。 使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。  没有使用if标签时,...
  • 概述 项目中通常来说是经常会用到动态去拼sql,那么...动态标签 <where> <if test="state != null"> state = #{state} </if> <if test="title != null"> AND title like #{title} &l

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,617
精华内容 1,446
关键字:

mybatis动态标签