MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。<br />例如,下面需求就会使用到拼接sql语句:<br />【需求】:查询**男性**用户,**如果输入了用户名,按用户名模糊查询**,如果**没有输入用户名,就查询所有男性用户**。<br />正常的sql语句:查询男性并且用户名中包含zhang<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/26105817/1646484722209-dadcd775-5730-4a47-ab7f-184cb7fe01c8.png#clientId=u98625835-0015-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=309&id=u83bac08e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=386&originWidth=1201&originalType=binary&ratio=1&rotation=0&showTitle=false&size=27736&status=done&style=none&taskId=ud017cf85-ed72-4276-83fd-b41b31842e1&title=&width=960.8)<br />实现需求时还要判断用户是否输入用户名来做不同的查询要求,而这里似乎没有办法判断是否输入了用户名,因此可以考虑使用动态sql来完成这个功能。<br /> 动态 SQL 元素和后面学习的 JSTL 或基于之前学习的类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 开始精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的 OGNL 的表达式来淘汰其它大部分元素。<br />常见标签如下:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/26105817/1646484773320-a7165295-5b24-4e7d-a703-d891806f59d7.png#clientId=u98625835-0015-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=102&id=ud42a0c35&margin=%5Bobject%20Object%5D&name=image.png&originHeight=128&originWidth=913&originalType=binary&ratio=1&rotation=0&showTitle=false&size=15055&status=done&style=none&taskId=uc13f1f53-8a24-4d38-9ff9-7c7819a5a2b&title=&width=730.4)<br />动态SQL中的业务逻辑判断需要使用到以下运算符: ognl表达式<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/26105817/1646484822721-ec059072-f9a6-4be1-b879-da3abb9402fe.png#clientId=u98625835-0015-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=353&id=u7a888a81&margin=%5Bobject%20Object%5D&name=image.png&originHeight=441&originWidth=977&originalType=binary&ratio=1&rotation=0&showTitle=false&size=56765&status=done&style=none&taskId=u8c067de3-351e-492c-931a-9e359bca18d&title=&width=781.6)
1、if标签
格式:
【需求】:查询男性用户,如果输入了用户名,按用户名模糊查询,如果没有输入用户名,就查询所有男性用户。
正常的sql语句:查询男性并且用户名中包含zhang
实现需求时还要判断用户是否输入用户名来做不同的查询要求,而这里似乎没有办法判断是否输入了用户名,因此可以考虑使用动态sql来完成这个功能。
上述动态sql语句部分: and user_name like ‘%zhang%’