java mysubmail_关于MyBatis10种超好用的写法(收藏)

用来循环容器的标签forEach,查看例子

foreach元素的属性主要有item,index,collection,open,separator,close。

item:集合中元素迭代时的别名

index:集合中元素迭代时的索引

open:常用语where语句中,表示以什么开始,比如以'('开始

separator:表示在每次进行迭代时的分隔符

close 常用语where语句中,表示以什么结束

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:

如果传入的是单参数且参数类型是一个List的时候,collection属性值为list .

如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array .

如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key.

针对最后一条,我们来看一下官方说法:

注意 你可以将一个 List 实例或者数组作为参数对象传给 MyBatis,当你这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以“list”作为键,而数组实例的键将是“array”。

所以,不管是多参数还是单参数的list,array类型,都可以封装为map进行传递。如果传递的是一个List,则mybatis会封装为一个list为key,list值为object的map,如果是array,则封装成一个array为key,array的值为object的map,如果自己封装呢,则colloection里放的是自己封装的map里的key值

//mapper中我们要为这个方法传递的是一个容器,将容器中的元素一个一个的

//拼接到xml的方法中就要使用这个forEach这个标签了

public List queryById(List userids);

//对应的xml中如下

select * FROM entity

where id in

#{userid}

concat模糊查询

//比如说我们想要进行条件查询,但是几个条件不是每次都要使用,那么我们就可以

//通过判断是否拼接到sql中

SELECT * from entity

name like concat('%',concat(#{name},'%'))

choose (when, otherwise)标签

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

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

SELECT *

FROM User u

u.username LIKE CONCAT(CONCAT('%', #{username, jdbcType=VARCHAR}),'%')

AND u.sex = #{sex, jdbcType=INTEGER}

AND u.birthday = #{birthday, jdbcType=DATE}

selectKey 标签

在insert语句中,在Oracle经常使用序列、在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键。使用myBatis的selectKey标签可以实现这个效果。

下面例子,使用mysql数据库自定义函数nextval('student'),用来生成一个key,并把它设置到传入的实体类中的studentId属性上。所以在执行完此方法后,便可以通过这个实体类获取生成的key。

select nextval('student')

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})

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

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());

if标签

if标签可用在许多类型的sql语句中,我们以查询为例。首先看一个很普通的查询:

SELECT * from STUDENT_TBL ST

WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')

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

参数为实体类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

ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%')

AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}

AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}

AND ST.CLASS_ID = #{classId, jdbcType=VARCHAR}

AND ST.CLASS_ID = #{classEntity.classId, jdbcType=VARCHAR}

AND ST.PLACE_ID = #{placeId, jdbcType=VARCHAR}

AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=VARCHAR}

AND ST.STUDENT_ID = #{studentId, jdbcType=VARCHAR}

使用时比较灵活, 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 list = this.dynamicSqlMapper.getStudentList_if(entity);

for (StudentEntity e : list) {

System.out.println(e.toString());

}

}

if + where 的条件判断

当where中的条件使用的if标签较多时,这样的组合可能会导致错误。我们以在3.1中的查询语句为例子,当java代码按如下方法调用时:

@Test

public void select_test_2_1() {

StudentEntity entity = new StudentEntity();

entity.setStudentName(null);

entity.setStudentSex(1);

List list = this.dynamicSqlMapper.getStudentList_if(entity);

for (StudentEntity e : list) {

System.out.println(e.toString());

}

}

如果上面例子,参数studentName为null,将不会进行STUDENT_NAME列的判断,则会直接导“WHERE AND”关键字多余的错误SQL。

这时我们可以使用where动态语句来解决。这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where'。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。

上面例子修改为:

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

ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%')

AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}

AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}

AND ST.CLASS_ID = #{classId, jdbcType=VARCHAR}

AND ST.CLASS_ID = #{classEntity.classId, jdbcType=VARCHAR}

AND ST.PLACE_ID = #{placeId, jdbcType=VARCHAR}

AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=VARCHAR}

AND ST.STUDENT_ID = #{studentId, jdbcType=VARCHAR}

if + set实现修改语句

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

当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。使用if+set标签修改后,如果某项为null则不进行更新,而是保持数据库原值。

如下示例:

UPDATE STUDENT_TBL

STUDENT_TBL.STUDENT_NAME = #{studentName},

STUDENT_TBL.STUDENT_SEX = #{studentSex},

STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},

STUDENT_TBL.STUDENT_PHOTO = #{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler},

STUDENT_TBL.CLASS_ID = #{classId}

STUDENT_TBL.PLACE_ID = #{placeId}

WHERE STUDENT_TBL.STUDENT_ID = #{studentId};

if + trim代替where/set标签

trim是更灵活的去除多余关键字的标签,他可以实践where和set的效果。

trim代替where

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

ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%')

AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}

AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}

AND ST.CLASS_ID = #{classId, jdbcType=VARCHAR}

AND ST.CLASS_ID = #{classEntity.classId, jdbcType=VARCHAR}

AND ST.PLACE_ID = #{placeId, jdbcType=VARCHAR}

AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=VARCHAR}

AND ST.STUDENT_ID = #{studentId, jdbcType=VARCHAR}

trim代替set

UPDATE STUDENT_TBL

STUDENT_TBL.STUDENT_NAME = #{studentName},

STUDENT_TBL.STUDENT_SEX = #{studentSex},

STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},

STUDENT_TBL.STUDENT_PHOTO = #{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler},

STUDENT_TBL.CLASS_ID = #{classId},

STUDENT_TBL.PLACE_ID = #{placeId}

WHERE STUDENT_TBL.STUDENT_ID = #{studentId}

foreach

对于动态SQL 非常必须的,主是要迭代一个集合,通常是用于IN 条件。List 实例将使用“list”作为键,数组实例以“array” 做为键。

foreach元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素是很智能的,它不会偶然地附加多余的分隔符。

注意:你可以传递一个List实例或者数组作为参数对象传给MyBatis。当你这么做的时候,MyBatis会自动将它包装在一个Map中,用名称在作为键。List实例将会以“list”作为键,而数组实例将会以“array”作为键。

这个部分是对关于XML配置文件和XML映射文件的而讨论的。下一部分将详细讨论Java API,所以你可以得到你已经创建的最有效的映射。

1.参数为array示例的写法

接口的方法声明:

public List getStudentListByClassIds_foreach_array(String[] classIds);

动态SQL语句:

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 ST.CLASS_ID IN

#{classIds}

测试代码,查询学生中,在20000001、20000002这两个班级的学生:

@Test

public void test7_foreach() {

String[] classIds = { "20000001", "20000002" };

List list = this.dynamicSqlMapper.getStudentListByClassIds_foreach_array(classIds);

for (StudentEntity e : list) {

System.out.println(e.toString());

}

}

2.参数为list示例的写法

接口的方法声明:

public List getStudentListByClassIds_foreach_list(List classIdList);

动态SQL语句:

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 ST.CLASS_ID IN

#{classIdList}

测试代码,查询学生中,在20000001、20000002这两个班级的学生:

@Test

public void test7_2_foreach() {

ArrayList classIdList = new ArrayList();

classIdList.add("20000001");

classIdList.add("20000002");

List list = this.dynamicSqlMapper.getStudentListByClassIds_foreach_list(classIdList);

for (StudentEntity e : list) {

System.out.println(e.toString());

}

}

sql片段标签:通过该标签可定义能复用的sql语句片段,在执行sql语句标签中直接引用即可。这样既可以提高编码效率,还能有效简化代码,提高可读性

需要配置的属性:id="" >>>表示需要改sql语句片段的唯一标识

引用:通过标签引用,refid="" 中的值指向需要引用的中的id=“”属性

o.order_id,o.cid,o.address,o.create_date,o.orderitem_id,i.orderitem_id,i.product_id,i.count

select

from ordertable o

join orderitem i on o.orderitem_id = i.orderitem_id

where o.order_id = #{orderId}

到此这篇关于关于MyBatis10种超好用的写法(收藏)的文章就介绍到这了,更多相关MyBatis 写法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php学好要多久,零基础php自学要多久

万事开头难,自学编程也是一样,只要能入门,在学起来就容易多了,那么零基础自学编程多久才可以入门呢,如何才能找到自学编程的门道呢? (推荐学习:PHP视频教程)零基础自学编程也可以,关…

php laravel 优点,Laravel 特点有哪些?

Laravel特点:1、“artisan”命令行工具,可以自动化完成手动的工作;2、“migration”管理数据库和版本控制;3、测试功能也很强大;4、适合应用各种开发模式TDD、DDD和BDD;5、支持Composer包管理工具。Laravel…

php枚举mysql,小技巧:取得MYSQL中ENUM(枚举)列的全部可能值。-PHP教程,PHP应用...

取得mysql中enum(枚举)列的全部可能值这里其实并不需要其它的什么函数来支持,只需要使用mysql提供的一些sql语句就可以了。这里为了简单起见,以mysql的系统表user为例,取出select_priv这一列的所有可能值。方法:show c…

php 拼接wav,将两个Wav文件合并为一个 | 学步园

参考了:http://www.codeguru.com/forum/showthread.php?t132649CWave CWave::Mix(LPCTSTR bkWav){CWave wavBK(bkWav);int iTrackLenth;int iHeaderLen 46;iTrackLenth data.dataSIZE;CWave ret_val;ret_val.fmt fmt;ret_val.riff riff;ret_val.data data;ret…

php+代码行数常量,php统计文件中的代码行数

函数介绍:file_get_contents()把整个文件读入一个字符串中。explode() 函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组。count() 函数返回数组中元素的数目。在线视频教程分享:php视频教程示例如下:public functio…

PhP加载时显示动画,在ajax请求完之前的loading加载的动画效果实现

这篇文章给大家介绍的内容是关于在ajax请求完之前的loading加载的动画效果实现,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。很多时候我们需要引入框架来开发项目,这时我们可能会遇到页面还没加载完源码出来了的…

php中 和 的优先级,理解php中的运算符优先级

您的代码正在评估如下&#xff1a;while (!($apns ($this->getApns($streamContext) && ($z < 11))))这就是你看到无限循环的原因(只要$z> 11,$apns为false,所以条件总是为真).这种优先权的原因是特殊规则仅适用于&#xff01;赋值左侧有效(优先级低于).它对…

java自定义异常实验总结,Java实验--自定义异常的使用

这几天有点小忙&#xff0c;都没时间更新博客了&#xff0c;今天趁着Java实验课&#xff0c;把做的这次实验放上去吧&#xff01;实验5 自定义异常的使用a&#xff0e;在定义一个银行类Bank时, 有存钱deposit()、取钱withdraw()、显示余额showBalance()等方法。若取钱数大于余额…

matlab 动态分配内存,[Matlab科学计算之高效编程] 1. 预分配内存

通过对变量预分配内存可以大大降低计算耗时&#xff0c;下面举例说明。1.没有预分配变量内存情况clearn 2000;tic;for i1:nfor j1:na(i,j) 1;endendtime toc;disp([未预分配内存下计算时间为,num2str(time),秒])计算时间为&#xff1a;未预分配内存下计算时间为3.3465秒2.预…

wordpressQQ登陆php代码,仅在登录时使用wordpress PHP代码

我有一个自定义URL生成的一些PHP嵌入到页面模板中.<?php echo http://www.mywebsite.co.uk/clients/ . $current_user->user_login . "/"; ?>这一切都很好,但我希望它能在用户未登录时将链接更改为静态链接,否则get_currentuserinfo部分会中断并且显示的链…

matlab 水文频率曲线,【求助】如何计算水文频率,外行求教 - 地学 - 小木虫 - 学术 科研 互动社区...

根据某水文现象的统计特性,利用现有水文资料,分析水文变量设计值与出现频率(或重现期)之间的定量关系的工作过程称为水文频率计算。自然界的现象按发生情况可分成&#xff1a;必然事件&#xff0c;即在一定条件下必然会发生的事情&#xff0c;如降雨以后就要涨水是必然发生的&a…

水解聚丙烯酰胺 php,聚丙烯酰胺水溶液的流变性质

聚 丙 烯 酰 胺 水 溶 液 的 流 变 性 质谢 刚 ! 黎 勇 陈 九 顺 邓 立 育( 黑 龙 江 大 学 化 学 化 工 学 院 哈 尔 滨 ! " # # $ # ) ( 黑 龙 江 进 出 口 商 品 检 验 局 哈 尔 滨 )关 键 词 聚 丙 烯 酰 胺 水 溶 液 &#xff0c; 流 变 性 质 &#xff0c; 粘 性 指…

matlab字符和字符串,MATLAB字符和字符串

3.字符和字符串在MATLAB中&#xff0c;几个字符(Character)可以构一个字符串(String)。一个字符串被视为一个行向量&#xff0c;而字符串中的每一个字符(含空格符)&#xff0c;则是以其ASCII的形式存放于此向量的每一个元素中&#xff0c;只是它的外显形式仍然是可读的字符。字…

计算器java程序设计报告总体设计,java程序设计实验报告-计算器

《java程序设计实验报告-计算器》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《java程序设计实验报告-计算器(18页珍藏版)》请在金锄头文库上搜索。1、 Java 程序设计实验报告程序设计实验报告题 目 计算器 姓 名 学 号 学 院 软件学院 专 业 软件工程 年 级 2009 级…

mybatis连接oracle12乱码,使用mybatis链接oracle数据库出现账号密码错误解决

使用mybatis链接oracle数据库步骤最近oracle老师布置下来了作业&#xff0c;要求使用传统的java代码链接oracle数据库做一个小程序&#xff0c;因为我已经很熟练的掌握了ssm框架的开发&#xff0c;以前用的是mysql&#xff0c;现在就尝试尝试oracle来练练手。问题一 oracle 的j…

oracle active data guard,Oracle Active DataGuard配置手册(一)

第一章 搭建Active DG开始配置dgPrimary db:1、 判断dataguard是否安装SQL> select * from v$option where parameter Oracle Data Guard;PARAMETER----------------------------------------------------------------VALUE----------------------------------------------…

linux创建文件后会自动删除,linux会自动删除目录和文件的吗

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼建议不要在 /tmp 或 /var/tmp 中存放需由用户掌握的文件unix 系统的习惯做法是将系统运行过程中的产生的临时文件保存在 /tmp 和 /var/tmp 中。这两者的区别在于 /tmp 中保存的临时文件原则上将在系统重新启动后删除&#xff0c;这…

linux关闭gvim命令,Linux 下 8 种退出 vim 编辑器的方法

Vim被称为一个非常强大的文本编辑器&#xff0c;但同样以其陡峭的学习曲线而闻名。 如果您经常使用命令行&#xff0c;那么至少应该学习一些基本功能。 如果你没有花时间去学习它&#xff0c;即使像退出Vim这样简单的事情也很困难。Vim是一套独立的软件&#xff0c;它有自己的一…

du 查看使用 linux命令,如何正确使用Linux命令–du

本文简单介绍了如何使用如何使用Linux命令–du&#xff0c;需要的朋友可以参考一下。du(disk usage)功能说明&#xff1a;显示目录或文件的大小。语  法&#xff1a;du [-abcDhHklmsSx][-L ][-X ][–block-size][–exclude][–max-depth][–help][–version][目录或文件]补充…

编译 linux 3,linux内核的编译(3)

linux内核的编译(3)2008-02-23 07:17:46来源&#xff1a;互联网 阅读 ()无论什麽档名)&#xff0c;然後将你做的 zImage 拷贝进去&#xff0c;(例如&#xff0c;如果你用” /vmlinuz ″的话&#xff0c;就像这样″ cp zImage /vmlinuz ”)。接著重新执行 lilo — 在较新的系统上…