0717-7821348
彩票走势图大全彩乐乐

彩票走势图大全彩乐乐

您现在的位置: 首页 > 彩票走势图大全彩乐乐
关于 MyBatis 我总结了 10 种通用的写法
2019-05-28 22:45:38
  • 用来循环容器的标签forEach,检查比如
  • concat含糊查询
  • choose (when, otherwise)标签
  • selectKey 标签
  • if标签
  • if + where 的条件判别
  • if + set完成修正句子
  • if + trim替代where/set标签
  • foreach

用来循环容器的标签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 实例将会以“lis关于 MyBatis 我总结了 10 种通用的写法t”作为键,而数组实例的键将是“array”。

所以,不管是多参数仍是单参数的list,array类型,都能够封装为map进行传递。假如传递的是一个List,则mybatis会封关于 MyBatis 我总结了 10 种通用的写法装为一个list为key,list值为object的map,假如是array,则封装成一个array为key,array的值为object的map,假如自己封装呢,则colloection里放的是自己封装的map里的key值

//mapper中咱们要为这个办法传递的是一个容器,将容器中的元素一个一个的
//拼接到xml的办法中就要运用这个forEach这个标签了
public List queryById(List userids);
//对应的xml中如下

concat含糊查询

//比如说咱们想要进行条件查询,可是几个条件不是每次都要运用,那么咱们就能够
//经过判别是否拼接到sql中

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包起来,放置要害字多于过错。



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());关于 MyBatis 我总结了 10 种通用的写法

if标签

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



可是此刻假如studentName为null,此句子很可能报错或查询成果为空。此刻咱们运用if动态sql句子先进行判别,假如值为null或等于空字符串,咱们就不进行此条件的判别,添加灵敏性。

参数为实体类StudentEntity。将实体类中一切的特点均进行判别,假如不为空则履行判别条件。



运用时比较灵敏, new一个这样的实体类,咱们需求约束那个条件,只需求附上相应的值就会where这个条件,相反不去赋值就能够不在where中判别。

public void select_test_2_1() {
StudentEntity entity = new StudentEntity();
entity.set关于 MyBatis 我总结了 10 种通用的写法StudentName("");
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。 这时咱们能够运用关于 MyBatis 我总结了 10 种通用的写法where动态句子来处理。这个“where”标签会知道假如它包括的标签中有回来值的话,它就刺进一个‘where’。此外,假如标签回来的内容是以AND 或OR 最初的,则它会除掉去。 上面比如修正为:



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



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,所以你能够得到你现已创立的最有用的映射。

参数为array示例的写法

接口的办法声明:

public List getStudentListByClassIds_foreach_array(String[] classIds);

动态SQL句子:



测验代码,查询学生中,在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句子:



测验代码,查询学生中,在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


END

来历:http://t.cn/EoEHulz


查找微信号(ID:芋道源码),能够获得各种 Java 源码解析。

而且,回复【书本】后,能够收取笔者引荐的各种 Java 从入门到架构的书本。

来吧,骚年~