做历史卷子的网站,网站建设需要哪些资质,wordpress首页显示摘要数字,加建网网站MyBatis提供了动态SQL帮助我们解决在业务过程中#xff0c;我们根据不同的条件动态生成SQL语句#xff0c;用来满足各种复杂的查询需求#xff0c;包括MyBatis中常用的动态SQL标签和用法#xff0c;这种方式在一定程度上帮助我们重复写许多SQL堆积在一起#xff0c;下面我…MyBatis提供了动态SQL帮助我们解决在业务过程中我们根据不同的条件动态生成SQL语句用来满足各种复杂的查询需求包括MyBatis中常用的动态SQL标签和用法这种方式在一定程度上帮助我们重复写许多SQL堆积在一起下面我们就看一下Mybatis中常用的有哪些动态SQL标签以及他的用法
if
if用来表示条件判断根据我们的条件动态生成SQL片段。在实际开发中算是我们用的最多的一种动态SQL条件判断字段是加入SQL中还是不加入SQL语句中。
select idgetUser resultTypecom.example.UserSELECT * FROM usersWHERE 11if testname ! null and name ! AND name #{name}/ifif testage ! nullAND age #{age}/if
/select上述代码中我们使用了if 语句来判断上述语句的 name ! null and name ! 表示当传过来的name 字段的值不为空并且name 传过来的是不是空字符串那么我们就通过 将if 语句内部的SQL语句添加进去。实际上If 标签就是通过test属性的表达式进行判断当表达式的结果为true那么标签中的内容就会执行否则就直接被忽略掉。
where
where: where一般和if结合使用
当where 标签中的if条件都不满足的时候则where标签没有任何功能那就不会添加任何的where关键字。当where标签中的if条件有满足或者全部满足的时候那么where标签会自动添加where关键字并将条件最前方多余的and去掉。 ps: where标签不能去掉条件最后多余的and标签
select idgetUser resultTypecom.example.UserSELECT * FROM userswhereif testname ! null and name ! AND name #{name}/ifif testage ! nullAND age #{age}/if/where
/selecttrim标签
trim用于去除或添加SQL片段的前缀或后缀。 常用属性 prefix: 在trim标签中的内容的前面添加某些内容。prefixOverrides: 在trim标签中的内容的前面去掉某些内容。suffix在trim标签中内容的后面添加某些内容。suffixOverrides : 在trim标签中的内容的后面去掉某些内容。 select idgetEmpListByMoreTJ resultTypeEmpselect * from userstrim prefixwhere suffixOverridesandif testname ! and name ! nullname #{ename} and/ifif testage ! and age ! nullage #{age} and/ifif testsex ! and sex ! nullsex #{sex}/if/trim
/selecttrim prefixwhere suffixOverridesand在trim标签中添加了前缀where并通过suffixOverridesand去除了最后一个条件中的and。 根据不同的条件值动态生成了查询语句的条件部分。如果ename、age和sex参数都有值则生成完整的查询条件如果某个参数没有值则不生成对应的条件。
上述示例中使用了#{}占位符来引用参数值这是为了防止SQL注入攻击。确保传递给SQL语句的参数值被正确地转义和处理。
choose、when、otherwise
choose、when、otherwise用于多条件判断类似于Java中的switch语句。也可以说是if ...else if ... else
select idgetUser resultTypecom.example.UserSELECT * FROM usersWHERE 11choosewhen testname ! nullAND name #{name}/whenwhen testage ! nullAND age #{age}/whenotherwiseAND status ACTIVE/otherwise/choose
/select在上述示例中根据name和age参数的值动态生成了不同的查询条件 如果name参数不为null则生成AND name #{name}的条件。 如果age参数不为null则生成AND age #{age}的条件。 如果以上两个条件都不成立即name和age都为null则生成AND status ACTIVE’的条件。 choose标签用于多条件判断类似于Java中的switch语句。在choose标签中可以包含多个when标签和一个otherwise标签。
when标签用于指定条件成立时生成的SQL片段。在每个when标签中通过test属性来判断条件是否成立。
otherwise标签用于指定所有条件都不成立时生成的SQL片段。
通过使用、和标签可以根据不同的条件值动态生成不同的SQL片段实现灵活的条件判断和SQL拼接。这样可以满足复杂查询需求同时保持SQL语句的可读性和可维护性。
foreach
foreach:用于遍历集合或数组生成重复的SQL片段。
!--int insertMoreEmp(ListEmp emps);--
insert idinsertMoreEmpinsert into t_emp valuesforeach collectionemps itememp separator,(null,#{emp.ename},#{emp.age},#{emp.sex},#{emp.email},null)/foreach
/insert
!--int deleteMoreByArray(int[] eids);--
delete iddeleteMoreByArraydelete from t_emp whereforeach collectioneids itemeid separatororeid #{eid}/foreach
/delete
!--int deleteMoreByArray(int[] eids);--
delete iddeleteMoreByArraydelete from t_emp where eid inforeach collectioneids itemeid separator, open( close)#{eid}/foreach
/deleteinsert标签示例
insert idinsertMoreEmpinsert into t_emp valuesforeach collectionemps itememp separator,(null,#{emp.ename},#{emp.age},#{emp.sex},#{emp.email},null)/foreach
/insert使用了foreach标签来遍历emps集合将集合中的每个Emp对象的属性值插入到t_emp表中。
public int insertMoreEmp(ListEmp emps) {try (SqlSession sqlSession sqlSessionFactory.openSession()) {EmpMapper empMapper sqlSession.getMapper(EmpMapper.class);return empMapper.insertMoreEmp(emps);}
}public static void main(String[] args) {ListEmp emps new ArrayList();// 添加要插入的Emp对象到emps集合中Emp emp1 new Emp();emp1.setEname(John);emp1.setAge(25);emp1.setSex(Male);emp1.setEmail(johnexample.com);emps.add(emp1);Emp emp2 new Emp();emp2.setEname(Jane);emp2.setAge(30);emp2.setSex(Female);emp2.setEmail(janeexample.com);emps.add(emp2);// 调用insertMoreEmp方法进行批量插入int rowsAffected insertMoreEmp(emps);System.out.println(rowsAffected rows inserted.);
}delete标签示例使用or连接条件)
delete iddeleteMoreByArraydelete from t_emp whereforeach collectioneids itemeid separatororeid #{eid}/foreach
/delete在上述示例中使用了foreach标签来遍历eids数组将数组中的每个元素作为删除条件的一部分使用or连接多个条件。
public int deleteMoreByArray(int[] eids) {try (SqlSession sqlSession sqlSessionFactory.openSession()) {EmpMapper empMapper sqlSession.getMapper(EmpMapper.class);return empMapper.deleteMoreByArray(eids);}
}public static void main(String[] args) {int[] eids {1, 2, 3}; // 要删除的eid数组// 调用deleteMoreByArray方法进行批量删除int rowsAffected deleteMoreByArray(eids);System.out.println(rowsAffected rows deleted.);
}delete标签示例使用in连接条件
delete iddeleteMoreByArraydelete from t_emp where eid inforeach collectioneids itemeid separator, open( close)#{eid}/foreach
/delete公共SQL片段
在Mapper.xml文件中我们对可以通过记录一段公共的SQL片段在使用的地方通过include标签进行引入。
示例
sql idempColumnseid,ename,age,sex,did
/sql使用
select include refidempColumns/include from t_emp