mybatis 中 where 1=1; 标签 if ,where ,foreach ,
0.应用范例
grade为Grad类,其中包含有list<Integer> stuNos;( 为复数,stuNos有s)。 根据年级类中的 学号查学生,传入年级对象,返回学生对象,以上图片实例相当于SQL语句:(伪SQL代码,stuNos 为list集合 ,要不为空,需要使用 separate属性通过 “,”将list集合的值转换为形如(sthNo1,sthNo2,sthNo3,...sthNon) 的SQL语句。
select * from student where stuNos != null and stuNos.size()!=0 and stuNo in stuNos (sthNo1,sthNo2,sthNo3,...sthNon);
1.应用背景介绍
mybatis 不仅支持传入参数到SQL语句标签,还支持通过字符串拼接的方式实现动态传入SQL标签。'${PARAM}’)。处于灵活性的考虑,对应 where 后的语句如果想实现动态SQL,要么在where后添加 1=1 实现,要么就引入标签<where>,至于where后面的SQL拼接,需要再引入 if 标签形如
<if test="state != null">,其中state 就是传入SQL的Java字段,用以判断该if语句中的SQL是否可以进行拼接。另:where标签中 的第一个if标签会被自动处理,但是之后的标签不会校验生成的SQL是否正确。if标签中的字段也支持使用对象属性的属性,用“.”来进行选择。
同样,为实现更灵活地生成SQL,mybatis支持 foreach 标签,用来实..0..现 where field in (var1,var2,....);
2.具体实现步骤
在网上查了一篇文章,写的比较全面,链接如下:
掌握其应用场景,遇到具体问题直接查语法就行。
如果传入参数为 简单类型数组(array) 集合(list) 对象数组(Object[]),parameterType需要使用对应约定好的类型。
SQL提取:将经常要用的可重复使用的SQL片段提取出来,方便以后其他标签引用该SQL片段。
引用使用include标签 refid 引用该SQL标签。
位置在mapper标签下。
如果需要引用的SQL片段不在本mapper文件中,引入时的refid引入时需要加上SQL片段所在的mapper文件的 namespace.SQLID 。
3.关联查询
mybatis认为查询类型只有两种,多对一就是一对多,多对多就是多个一对多查询
-
一对一关联查
1. 使用业务扩展类(少数)实现一对一关联查询:新建业务扩展类,继承一个bean类,再手动添加另一个bean类的信息之后正常使用。
2. resultMap 实现一对一关联查询: 表之间由外键连接,类之间按属性连接,将一个类作为另一个类的属性成员 实现两个类的连接。
resultType 改为 resultMap,新建一个resultMap标签与之对应,映射关系XML文件如下:
映射文件mapper,一对一使用association。一对多使用collection标签。
-
一对多查询
一个班级对应多个学生。班级中增加学生类的list,作为两个类的连接。
javaType 修改为ofType,表示返回的值是ofType修饰的类的集合(list)。
collection支持级联实现内部的一对一查询。
总结