一聚教程网:一个值得你收藏的教程网站

热门教程

MyBatis实现动态SQL的案例解析

时间:2026-05-28 08:00:02 编辑:袖梨 来源:一聚教程网

MyBatis动态SQL彻底解决了传统JDBC拼接SQL的难题,通过智能标签实现条件判断、循环等逻辑,让数据库操作更灵活高效。本文将详细介绍各类动态SQL标签的实战用法。相较于传统SQL拼接方式,MyBatis通过基于OGNL表达式的动态SQL语言,大幅简化了条件查询的复杂度。熟悉JSTL或XML文本处理的开发者能快速上手这些语法元素。经过版本迭代,MyBatis 3精简了动态SQL元素,目前核心标签可分为六大类:ifchoose (when, otherwise)trim (where, set)foreachbindsql片段元素作用备注if判断语句单条件分支判断choose、when、otherwise相当于java的case when多条件分支判断Trim、where、set辅助元素用于处理sql拼装问题foreach循环语句在in语句等列举条件常用,常用于实现批量操作一、ifEmpDao.xml select * from emp where empno > #{empno} and ename like #{ename} and sal > #{sal} EmpDao.javapublic List getEmpByCondition(Emp emp);Test.java@Test public void test10() { SqlSession sqlSession = sqlSessionFactory.openSession(); try { EmpDao mapper = sqlSession.getMapper(EmpDao.class); Emp emp = new Emp(); emp.setEmpno(6500); emp.setEname("%E%"); emp.setSal(500.0); List empByCondition = mapper.getEmpByCondition(emp); for (Emp emp1 : empByCondition) { System.out.println(emp1); } } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); }}当参数缺失时,SQL拼接会出现语法错误。传统解决方案是添加"1=1"条件,但这会导致SQL注入风险和索引失效。MyBatis提供了更优雅的where标签解决方案。二、wherewhere标签仅在子元素返回内容时插入WHERE子句,并自动移除首个子句的AND/OR连接词。 select * from emp empno > #{empno} and ename like #{ename} and sal > #{sal} 核心功能:自动处理首个条件前的连接词注意事项:1.首个条件可省略AND但不会报错2.后续条件必须包含连接词3.无条件时返回全部记录三、trimtrim标签提供比where更灵活的字符串处理能力,支持自定义前后缀。 select * from emp empno > #{empno} and ename like #{ename} and sal > #{sal} and 属性说明:1.prefix:添加整体前缀2.prefixOverrides:移除首部指定字符3.suffixOverrides:移除尾部指定字符trim的典型扩展用法: OR FIND_IN_SET( #{idItem}, space_types ) 四、foreachforeach标签专为集合遍历设计,特别适合构建IN条件语句。 select * from emp where deptno in #{deptno} 批量操作方案:使用foreach拼接SQL(效率更高)采用BATCH类型执行器五、choose、when、otherwise实现多条件分支选择,类似Java的switch-case结构。 select * from emp empno > #{empno} ename like #{ename} sal > #{sal} 1=1 六、setset标签用于动态更新语句,自动处理更新字段后的逗号。 update emp empno=#{empno}, ename = #{ename}, sal = #{sal} empno = #{empno} 七、bindbind元素支持在OGNL表达式外创建变量并绑定到当前上下文。

热门栏目