一,用来循环容器的标签forEach
forEach元素的属性主要有 : item(集合中元素迭代时的别名),index(元素迭代时的索引),collection,open(常用于where语句中,表示以什么开始,比如以" ("开始),separator(每次进行迭代时的分隔符),close(常用于where语句中,表示以什么结束)
在使用forEach的时候,一定要注意collection属性是必须指定的,然而,在不同情况下,该属性的值是不同的,主要有以下三种情况:
1,传入的是单参数且参数类型是一个List的时候,collection属性值为list
2,传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3,传入的是多参数,我们就需要把它们封装成一个map了,当然,单参数也可以封装成map,实际上在传入参数的时候,MyBatis里面也会把它封装成一个Map的,map的key就是参数名,collection的值就是传入的List或array对象在自己封装的map里面的key。List实例将会以**“list"作为键,而数组的键将是"array”**
//mapper中我们要为这个方法传递的是一个容器,
//将容器中的元素一个一个的拼接到xml的方法中就要使用这个forEach这个标签了
public List queryById(List
select * from entity
where id in
#{userid}
二,concat模糊查询
//有时候我们要进行条件查询,但是有几个条件并不是每次都用到,我们可以先通过判断是否拼接到sql语句中
三,choose(when,otherwise)标签
choose标签按顺序判断其内部when标签中的test条件是否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满足时,则执行otherwise中的sql。类似于java的switch语句,choose为switch,when为case,otherwise则为default
//choose(判断参数)-按顺序将实体类User第一个不为空的属性作为 where条件
四,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 student = new StudentEntity();
student.setStudentName("无忌");
student.setStudentSex(1);
student.setStudentBirthday(DateUtil.parse("1999-05-26"))
student.setClassId("10001");
student.setPlaceId("101");
this.dynamicSqlMapper.createStudentAutoKey(student);
System.out.println("新增学生ID:"+student.getStudentId());
五,if + where的条件判断
当where中的条件使用的if标签较多时,这样的组合可能会导致错误,比如:
如果上面这个例子的参数studentName为null,将不会进行STUDENT_NAME列的判断,则会直接导致**“WHERE AND” 关键字多余**的错误SQL,所以我们得用where标签解决,where标签如果知道有返回值的话,它就插入一个"where"。如果标签返回的内容是以AND或OR开头的,则它会剔除掉
//上面例子修改为如下