文档章节

Mybatis中Mapper文件常用标签:

SFLC
 SFLC
发布于 2017/02/16 18:09
字数 1515
阅读 41
收藏 0

Mybatis中Mapper文件常用标签: 1.choose(when,otherwise)标签 当我们不想应用所有的条件,而只是想从多个选项中选择一个的时候,使用if标签时,只要test中的表达式为true,就会执行if标签中的条件。Mybatis提供了choose元素。if标签是与的关系,而choose是或的关系。choose标签是按照顺序判断其内部when标签中的test条件是否成立,如果有一个成立,则choose结束。当choose中所有when条件都不满足时,则执行otherwise中的sql。,类似于java中的Switch语句。 例如下面的例子,同样把所有可以限制的条件都写上,方便使用。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 很类似。如下:

<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>
</choose>
</select>

when元素表示当when中的条件满足的时候就输出其中的内容,跟JAVA中的swicth效果莱斯的是按照条件的顺序,当when中的有条件吗,满足的时候,就会跳出choose,即所有的when和otherwise条件中,只有一个会输出。当所有条件都不满足时就输出otherwise的内容。

2.selectKey标签 在insert语句中,在Oracle经常使用序列、在mysql中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键。使用mybatis的selectKey标签可以实现这个效果。下面例子,使用mysql数据库自定义函数nextval('student'),用来生成一个key,并把他设置到传入的实体类中的studentId属性上。所以在执行完此方法后,边可以通过这个实体类获取生成的key。 Xml代码:

<!-- 插入学生 自动主键-->  
<insert id="createStudentAutoKey" parameterType="liming.student.manager.data.model.StudentEntity" keyProperty="studentId">  
    <selectKey keyProperty="studentId" resultType="String" order="BEFORE">  
        select nextval('student')  
    </selectKey>  
    INSERT INTO STUDENT_TBL(STUDENT_ID,  
                            STUDENT_NAME,  
                            STUDENT_SEX,  
                            STUDENT_BIRTHDAY,  
                            STUDENT_PHOTO,  
                            CLASS_ID,  
                            PLACE_ID)  
    VALUES (#{studentId},  
            #{studentName},  
            #{studentSex},  
            #{studentBirthday},  
            #{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler},  
            #{classId},  
            #{placeId})  
</insert>  

调用接口方法,和获取自动生成key

Java代码:

StudentEntity entity = new StudentEntity();  
entity.setStudentName("黎明你好");  
entity.setStudentSex(1);  
entity.setStudentBirthday(DateUtil.parse("1985-05-28"));  
entity.setClassId("20000001");  
entity.setPlaceId("70000001");  
this.dynamicSqlMapper.createStudentAutoKey(entity);  
System.out.println("新增学生ID: " + entity.getStudentId());  

selectKey语句属性配置细节: 输入图片说明

3.<trim>标签 事实上trim标签有点类似于replace效果。 trim 属性 prefix:前缀覆盖并增加其内容 suffix:后缀覆盖并增加其内容 prefixOverrides:前缀判断的条件 suffixOverrides:后缀判断的条件 比如: select b.* from sys_menu b where 1 = 1

<trim suffix="WHERE" suffixOverrides="AND | OR">  
  <if test="id != null and id !='' ">  
      AND b.id =#{id}   
  </if>  
  <if test="name != null">  
      AND b.menu_name like #{name}  
  </if>  
</trim>    

最终打印为: select b.*from sys_menu b where 1=1 AND b.menu_name like" WHERE 从结果可以发现: 1.<trim suffix="where" suffixOverrides="AND|OR"> suffix是针对符合suffixOverride的SQL语句追加后缀suffix值。

4.if标签 if标签可以使用在很多类型的sql中,已查询为例:

<!-- 查询学生list,like姓名 -->  
<select id="getStudentListLikeName" parameterType="StudentEntity" resultMap="studentResultMap">  
    SELECT * from STUDENT_TBL ST   
WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')  
</select>  

但是此时如果studentName或studentSex为null,此语句很可能报错或查询结果为空。此时我们使用if动态sql语句先进行判断,如果值为null或等于空字符串,我们就不进行此条件的判断,增加灵活性。 参数为实体类StudentEntity。将实体类中所有的属性均进行判断,如果不为空则执行判断条件。

<!-- 2 if(判断参数) - 将实体类不为空的属性作为where条件 -->  
<select id="getStudentList_if" resultMap="resultMap_studentEntity" 
parameterType="liming.student.manager.data.model.StudentEntity">  
    SELECT ST.STUDENT_ID,  
           ST.STUDENT_NAME,  
           ST.STUDENT_SEX,  
           ST.STUDENT_BIRTHDAY,  
           ST.STUDENT_PHOTO,  
           ST.CLASS_ID,  
           ST.PLACE_ID  
      FROM STUDENT_TBL ST   
     WHERE  
    <if test="studentName !=null ">  
        ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%')  
    </if>  
    <if test="studentSex != null and studentSex != '' ">  
        AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}  
    </if>  
    <if test="studentBirthday != null ">  
        AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}  
    </if>  
    <if test="classId != null and classId!= '' ">  
        AND ST.CLASS_ID = #{classId, jdbcType=VARCHAR}  
    </if>  
    <if test="classEntity != null and classEntity.classId !=null and classEntity.classId !=' ' ">  
        AND ST.CLASS_ID = #{classEntity.classId, jdbcType=VARCHAR}  
    </if>  
    <if test="placeId != null and placeId != '' ">  
        AND ST.PLACE_ID = #{placeId, jdbcType=VARCHAR}  
    </if>  
    <if test="placeEntity != null and placeEntity.placeId != null and placeEntity.placeId != '' ">  
        AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=VARCHAR}  
    </if>  
    <if test="studentId != null and studentId != '' ">  
        AND ST.STUDENT_ID = #{studentId, jdbcType=VARCHAR}  
    </if>   
</select>  

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

public void select_test_2_1() {  
    StudentEntity entity = new StudentEntity();  
    entity.setStudentName("");  
    entity.setStudentSex(1);  
    entity.setStudentBirthday(DateUtil.parse("1985-05-28"));  
    entity.setClassId("20000001");  
    //entity.setPlaceId("70000001");  
    List<StudentEntity> list = this.dynamicSqlMapper.getStudentList_if(entity);  
    for (StudentEntity e : list) {  
        System.out.println(e.toString());  
    }  
}  

5.foreach标签

在mybatis的mapper配置文件中,可以利用<foreach>标签实现sql条件的循环,可完成类似批量的sql mybatis接受的参数分为:(1)基本类型(2)对象(3)List(4)数组(5)Map 无论传哪种参数给mybatis,他都会将参数放在一个Map中: 如果传入基本类型:变量名作为key,变量值作为value 此时生成的map只有一个元素。 如果传入对象: 对象的属性名作为key,属性值作为value, 如果传入List: "list"作为key,这个List是value (这类参数可以迭代,利用<foreach>标签实现循环) 如果传入数组: "array"作为key,数组作为value(同上) 如果传入Map: 键值不变。

<foreach>标签的用法: 六个参数: collection:要循环的集合 index:循环索引(不知道啥用。。) item:集合中的一个元素(item和collection,按foreach循环理解) open:以什么开始 close:以什么结束 separator:循环内容之间以什么分隔 例如:

<update id="pubS" parameterType="Map">  
  UPDATE BMC_SUBPLATE  
  SET PLSTATUS = '02'  
  WHERE  
  <foreach collection="ids" item="plid" open="" close="" separator="OR">  
   PLID = #{plid}  
  </foreach>  
 </update>

© 著作权归作者所有

共有 人打赏支持
SFLC
粉丝 0
博文 6
码字总数 5388
作品 0
私信 提问
史上最简单的 MyBatis 教程(三)

1 前言 在史上最简单的 MyBatis 教程(一、二)中,咱们已经初步体验了 MyBatis 框架的一些优秀的特性,例如在映射文件中书写自定义的 SQL 语句以及便捷的调用方式等等。为了能够更好的掌握 ...

qq_35246620
2017/02/02
0
0
使用【mybatis + oracle】时报错:java.sql.SQLException 无效的列类型

原因--MyBatis中源码分析 参考网页 http://makemyownlife.iteye.com/blog/1610021 详细见网页,摘抄几段 MyBatis 插入空值时,需要指定JdbcType mybatis insert空值报空值异常,但是在pl/sq...

karma123
10/20
0
0
Mybatis 入门案例 2 ---- mapper 代理的方式

我们只需要编写DAO接口和mapper.xml文件即可,DAO接口实现对象由mybatis自动生成代理对象。 如: 一、为什么不使用原始的DAO方式开发呢? 1、dao的实现类中存在重复代码,整个mybatis操作的过...

故新
2017/11/07
0
0
Mybatis应用学习(2)——配置文件编写

Mybatis的配置文件SqlMapConfig.xml 1.1 主要标签 properties(定义属性):用来定义一些固定属性值,以key-value形式存在 MyBatis 将按照下面的顺序来加载属性:在 properties 元素体内定义...

江左煤郎
11/24
0
0
springBoot 整合mybatis

springBoot 整合mybatis s使用IDEA开发,为了提高效率,推荐使用插件: 说明:上述插件可以在低版本的IDEA中找到破解版 项目结构 说明: mapper/UserMapper.xml 是与接口 对应的mapper文件 UserMa...

黄威
07/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring AOP 切面编程记录日志和接口执行时间

最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx、tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统...

编程SHA
15分钟前
3
0
年度大盘点:机器学习开源项目及框架

摘要: 2018年马上就要结束了,我们来回顾一下过去的这一年中,机器学习领域有哪些有趣的事情吧! 我们先来看看Mybridge AI 中排名靠前的顶级开源项目,再聊聊机器学习今年都有哪些发展,最后...

阿里云官方博客
18分钟前
3
0
15个Spring的核心注释示例

众所周知,Spring DI和Spring IOC是Spring Framework的核心概念。让我们从org.springframework.beans.factory.annotation和org.springframework.context.annotation包中探索一些Spring核心注......

java菜分享
20分钟前
0
0
[LintCode] Binary Tree Level Order Traversal(二叉树的层次遍历)

描述 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 样例 给一棵二叉树 {3,9,20,#,#,15,7} : 3 / \9 20 / \ 15 7 返回他的分层遍历结果: [ [3], [...

honeymose
29分钟前
1
0
renderer

renderer Function 单元格绘制处理函数,同drawcell事件。

architect刘源源
49分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部