前言:mybatis作为一个持久层的java框架,高度封装了jdbc原始代码,它拥有比Hiberante更便捷、更直接的sql语法和sql灵活配置的特性,比如简单的一个自动映射对象就大大减少了我们的代码,想起以前的时候,jdbc查询出来的数据,通过遍历ResultSet,然后再一个个的set进预置好的对象里,真的是大大减少了重复没有意义的代码。毫无疑问,myabits已经跻身于持久层框架的第一位,目前公司开发的项目大多摒弃Hiberanate,大势所趋为mybaits。今天我们就来聚焦myabits中的mapper文件,看一看平时我们所写的sql基本必不可少的mapper文件(如果不是用注解的话)。

假设现在我们有一张表:名字叫做roles,用来记录用户的角色,其中有role_id,,role_no,role_name,role_desc等字段

还有一个Bean,类名为Roles,有String role_id,String role_no,String role_name,String role_desc等字段用于映射数据库的表字段。

本篇博客的目录:

前言

一:常见的crud标签

二:一些重要辅助标签

三:总结

一:常见的crud标签

1.1:<select>

这个标签相信熟悉sql的一眼就看出来了,mybatis封装了我们最常用的查询语句中的标签,比如我们要查询roles表里的数据,在mapper.xml文件里。直接如下写:

<select id="queryroles" resultType="list>select * from roles</select>

  注:其中的id要与接口中的方法名保持一致,myabits通过动态代理的方式把mapper.xml中的配置标签中的id与接口中的方法进行发射匹配,如果不一致,在web程序中启动的时候会报错

reusltType指明了这个sql返回的对象类型,这里指明它是一个list,如果在接口中有对象的list对象,那么它会把查询出来的数据自动映射到这个对象中:

list<Roles> queryroles; 

1.2:<update>

望文生义,也不难理解这个标签是进行update操作,在update标签里的sql,mybaits都会识别为更新操作,比如下面的sql

<update id="updateRoleName" parameterType="map">update roles set role_name='admin' where role_id=#{role_id}</update>

这就相当于我们平时的update操作,其中#{id}是取传入的id把它放进sql中进行查询,parameterType指明了它的参数类型是map,这里的 role_id就会从map中去取它以id作为键的对应值,然后把值放入这个sql中执行

1.3:<insert>

简介:i这个标签就是对应sql中的插入数据的操作,一般用于创建新记录的时候使用:

<insert id="createRole" parameterType="map" >insert into roles (role_id,role_name,role_desc)vlaues(#{role_id},#{role_name,#{role_desc}})</insert>

上面的insert就是给roles表里插入了一条数据,其中参数的值全部从传入的参数map里面取,这也很好理解,不再赘述。

1.4:<delete>

简介:该标签用于表明里面的sql用于删除记录:

<delete id="removeRoleById" parameterType="map">delete from roles where role_id='#{role_id}'</delete>

栗子中的就是个删除的sql,用于我们把传入的id找到的一条记录删除

二:辅助语法标签

2.1:<if>

解释:if标签的含义和我们平时编程中的if一样,后面跟上具体的条件都是用于判断不同的条件。不过它并不是if="";它的固定格式为<if test="">,test中的内容是具体的条件.

现在我们需要根据role_name去查找具体的role角色,但是传入的role_name可能为空,比如我们在做一个筛选查询的时候,我们不知道传入的这个role_name条件是否为空为null(假如用户不选就是null),这时候if的作用就出来了:

<select if="searchRoleByName" parareType="string">select role_id,role_no,role_desc from roles where
<if test="role_name !=null and role_name!='' ">role_name like contact('%',#{role_name},'%')</if>
</select>

这样就会在role_name非空非null的情况下,才会进入这个sql执行。否则就会出现select role_id,role_no,role_desc from roles where role_name like '%%';

此sql就会报sql语法错误。

ps:在实际编程中,if对传入的参数的判断非空非null基本是必须要做的,这样会提升程序的伸缩性和容错性

不过再往下思考一点,加上这个标签以后,如果role_name=null,就会出现select role_id,role_no,role_desc from roles where 。这样的sql,肯定也是错误的,一般我们的作为是拼接一个绝对成立条件,比如1=1,不过这种方式还是有点多余,我们再往下看,mybaits提供了其他标签可以有效的杜绝这个问题。

2.2:choose/when/otherWise标签

解释:在实际的编程环境中,可能我们会遇见这样的场景,比如我们要用几个条件去执行查询操作,条件具有优先级的,我们希望程序以最优先的方式去执行查询。比如在执行查询roles表的时候,我们最希望以id去查询,因为id是唯一的。但是id有可能有null,此时我们希望用role_no去查询,但是role_no可能是null,这个时候我们就只能用role_name去进行模糊匹配了,在这中情况下,就要借用choose/when/otheWise了,它有点类似于java编程中的switch/case

<select id="getRoles" paramterType="map">select * from role where = <choose>
<when test="role_id !=null and role_id !=''">and role_id=#{role_id}</when>
<when test="role_no!=null and role_no!=''"> and role_no=#{role_no}</when>
<when test="role_name!=null and role_name!=''">
<otherWise>and role_desc is not null</otherWise></choose></select>

上面的sql实现了一种前后优先级的判断(这里的优先级主要体现在when标签里的sql顺序上面),chose标签里的when只会进行一次判断,如果遇到符合条件的,下面的将不会再执行。

2.3:where

在2.1中,我们提到了where 1=1 的用法,这种方式还是有点冗余,为了杜绝这种情况,myabits提供了where标签使用,where是比较智能的,如果where标签会自动判断在if条件不符合的情况下,它将不会插入where子句。在if条件很多的时候,它也知道该不该去除前面的and或or(如果自己不放心,可以用2.4中的trim标签)

<select if="findRoles">select * from roles<where><if  test="role_id!=null and role_name!=''"> and role_id=#{role_id}</if><if test="role_no!=null 

and role_no!=''">and role_no=''</if></where></select>

上面的sql,即使在role_id为null为空的情况下,也不会出现where and这种情况,或者再role_id和role_test均为null的情况下,出现where 后面跟空的情况

2.4:trim

解释:trim在平时的开发中很常见,String.trim()它的含义表示去除字符串的前后端的空格,而在mybaits中它用于去除我们在判断条件中一些多余的元素,比如and\逗号等preifx和preifxOverride是常见的和它搭配在一起的元素,第一个表示要添加的前缀,后面的表示要去除的元素(只有在trim中的if判断条件不成立的情况下才会去除)

<select  id="findRoles">select * from roles 
<trime preifx="where" preifxOverride="and">
<if test="role_id!='' and role_id!=null">and role_id=#{role_id}</if></trim></select>

这其中会对if条件进行判断,如果不符合条件就会去除preifxOverride中指定的元素and,并且不会加前缀where.避免出现where后面为空的情况

2.5:set

解释:通常我们在进行update操作的时候,有时候面对的业务需求是修改几列,并不是全部修改。我们知道在sql中的标准语法是这样:update table set fileld1='newfileld1', fileld2='newfileld12, fileld3='newfileld3' where ...(field表示要修改的字段,...表示筛选的条件)。可是在这里会有一个问题就是字段的非空非null判断时的逗号问题,当然在学习了trim的用法以后,比如我们要更新角色表中的name和desc字段你可以这样写:

<update id="updateRole" parameterType="com.wyq.Roles">update roles <trim prefix="set" prefixOverride=","> 
<if test="role_name!=null and role_name!=''">role_name=#{role_name},</if>
<if test="role_desc !=null and role_desc!=''">role_desc=#{role_desc}</if>
</trim>where role_id=#{role_id}

这样写完全可以,但是稍显冗余,我们可以用更简单 的set标签来进行代替。换成set以后的写法如下:

<update id="updateRole" parameterType="com.wyq.Roles">update roles<set>
<if test="role_name!=null and role_name!=''">role_name=#{role_name},</if><if test="role_desc !=null and role_desc!=''">role_desc=#{role_desc}</if>
</set>where role_id=#{role_id}

set标签会自动处理多余的逗号,我们完全不用担心它在if条件不成立的时候造成的用法错误,这样写是不是简便了很多,试想起当初的jdbc,一个个的非空非null判断,多么无聊和枯燥。

2.6:foreach

foreach在编程中是用于循环遍历一个集合,这个集合一般是list/set。在myabits中,有时候我们会传入一个参数,而对这个参数我们遍历其中的元素就需要用到foreach标签,它一般用在in的语法中,比如我们要查询roles表中的id在(006-008)之间的数据,那么可以采用下面的写法:

<select>
select * from roles where role_id in <foreach item="roleid" index="ix" collection="idlist" open="(",sperator=",",close=")">#{roleid}
</foreach>
</select>

这里就是对idList这个list进行了遍历操作,其中item是指集合中的每项值,我们把它设为roleid,而index就是集合的索引,相当于for(int i=0;i<idlist.size;i++)中的i。open相当于在每个元素前后要添加的开始符号,而close是要添加的结束符号。sperator表示对每个元素进行的分割符号,而在foreach标签里面的内容(#括号里的内容)要保持和item中的内容一致。这样如果传入的idList是(006,007,008)最后的sql就是这样的:

select * from roles where role_id in (006,007,008);
2.7:bind
关于bind,它的最适用的场景就是模糊查询。在mysql中,进行模糊查询的时候,使用的%,而在oracle中模糊查询用的却是"||",这就形成了数据库的语法不统一。我最近的一个项目,boss就决定把mysql 改为oracle,想想这其中得有多少工作量。有没有一种方法,让它既适用于mysql,又适用于oracle,消除数据库之间的差异呢?答案就是bind标签
<select id="getRolesByName" parameterType="com.wyq.Roles">
<bind name="likePattern" value="'%'+_parameter.getRoleName()+'%'"></bind>
select * from roles where role_name like #{likePattern}</select>

bind标签有两个属性,一个是name也就是要绑定的条件的方法,value就是具体的值,_parametType是一个固定的写法,表示传入的参数。而再调用它的getRoleName()获取它的role_name作为参数传递到like这个语法中。在下面的sql中通过#号引用这个bind绑定的值,就可以把它的值代入sql。

2.8:include

解释:这个标签翻译过来就是包含,引用一些元素.比如说我们要查询一段数据,这个数据我们可以用sql标签引起来,然后给它一个id,在include标签里通过refid可以调用该id进行引用。比如我们要查询roles表里的role_id,role_name,role_no,可以这样做:

<sql id="role_colums">role_id,role_no,role_name</sql>

<select id="findRoles">select <include refid="role_colums"> from Roles<select>

上面定义了id="role_colums"这个sql标签,然后再下面的sql中通过include标签里的refid来引用该标签,这样在实际的mybatis解析的时候,就会把查询的内容去找相应的id,再取出其中的内容,放在sql中执行。这样做的好处就是可以复用,其它地方想使用可以直接引用,提高了复用率。

三:总结

     本篇博文主要介绍了mybaits的常用的一些标签,充分使用标签可以有效的减少代码的判断,提高程序的灵活性和容错性,在平时的开发过程中,多理解它的用法,

可以写出更加便捷的sql,高效的完成我们的程序开发工作。本篇博客介绍的标签还不够全,如果以后看到新的标签,博主一定会及时更新,感谢阅读,希望我们的

编程能力愈来愈高效。

												

讲解mybaits的标签语法的更多相关文章

  1. ECMall2.x模板制作入门系列之2(模板标签/语法)

    ECMall2.x模板制作入门系列之2(模板标签/语法) 今天给大家带来一个模板语法的教程.希望能为ECMall模板制作者提供一份参考资料.如有问题.建议和意见,欢迎提出. 在ECMall模板中,用& ...

  2. HTML&CSS基础学习笔记1.3-HTML的标签语法

    HTML标签语法 1. 标签由英文尖括号<和>括起来,如<html>就是一个标签. 2. HTML中的标签一般都是成对出现的,分开始标签和结束标签.结束标签比开始标签多了一个/ ...

  3. PHPCMS中GET标签概述、 get 标签语法、get 标签创建工具、get 调用本系统演示样例、get 调用其它系统演示样例

    一.get 标签概述 通俗来讲,get 标签是Phpcms定义的能直接调用数据库里面内容的简单化.友好化代码,她可调用本系统和外部数据,仅仅有你对SQL有一定的了解,她就是你的绝世好剑!也就是适合熟悉 ...

  4. html caption标签 语法

    html caption标签 语法 caption是什么标签? 作用:定义表格标题. 说明:caption 标签必须紧随 table 标签之后.您只能对每个表格定义一个标题.通常这个标题会被居中于表格 ...

  5. html canvas标签 语法

    html canvas标签 语法 canvas是什么意思? 作用:定义图形,比如图表和其他图像. 说明:<canvas> 标签只是图形容器,通过脚本 (通常是JavaScript)来完成, ...

  6. html button标签 语法

    html button标签 语法 button标签怎么用? 作用:定义一个按钮. 语法:<button type="button">按钮</button> ...

  7. html br标签 语法

    html br标签 语法 br标签什么意思? 作用:插入一个简单的换行符.广州大理石机械构件 说明:<br> 标签是空标签(意味着它没有结束标签,因此这是错误的:<br>< ...

  8. html body标签 语法

    html body标签 语法 标签body是什么意思? 标签body是一个网页的身体部分,也就是用于定义网页的主体内容,也是一个HTML文档中必须的部分. 作用:定义文档的主体. 广州大理石机械构件 ...

  9. html b标签 语法

    html b标签 语法 标签b是什么意思? b的意思是bold,b标签主要用于html中规定粗体文本,该标签内的字符将被设为粗体.B标签所传达的意思只是加粗,没有任何其它的作用. 作用:规定粗体文本. ...

随机推荐

  1. union 时只能查出一个表中的信息,另一个表只能查出字段

    原因:news表中title字段的编码,与brand表中的编码不一致导致 y

  2. 如何设置让网站禁止被爬虫收录?robots.txt

    robot.txt只是爬虫禁抓协议,user-agent表示禁止哪个爬虫,disallow告诉爬出那个禁止抓取的目录. 如果爬虫够友好的话,会遵守网站的robot.txt内容. 一个内部业务系统,不想 ...

  3. DedeCMS实现自定义表单提交后发送指定QQ邮箱法

    https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=monline_3_dg&wd=dedecms 邮箱&oq=d ...

  4. dedecms_

    2012-7-5(no1)当我们点击检索结果的某个电影超链接时,如何跳转到对应的内容页[本资源由www.qinglongweb.com搜集整理] dedelist标签 --可以嵌套 项目移植: mys ...

  5. asp.net -mvc框架复习(11)-基于三层架构与MVC实现完整的用户登录

    一.先从M部分写起(Modles\DAL\BLL) 1.Modles 实体类:上次实体类已经搞定. 2.DAL 数据访问类类 (1)通用数据数据访问类: A:  先编写数据连接字符串,写到网站根目录W ...

  6. Java 运动模糊

    Java 运动模糊代码 想用Java 写个运动模糊的效果,无奈本人水平有限,国内也没找到资源,于是Google到了一个文档,特地分享出来! 本代码源自 http://www.jhlabs.com/ip ...

  7. git 简单入门

    首先了解一下git的是什么: [百度百科解释]Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.[2]  Git 是 Linus Torvalds 为了帮助管理 ...

  8. cpp - 编译过程

    预处理 E:\CppSpace\hello>g++ -o main.i -E main.cpp E:\CppSpace\hello>dir /p 驱动器 E 中的卷是 固盘-项目 卷的序列 ...

  9. 策略模式--List排序

    需求:根据姓名进行排序,升序或者降序,如果名字一样,就按照id升序排序,用策略模式 步骤一: 定义一个Person对象 public class Person { private Integer id ...

  10. python3 第十三章 - 数据类型之tuple(元组)

    元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可: language = ('c', 'c++', 'py ...