请选择 进入手机版 | 继续访问电脑版

[MsSql] mybatis动态sql实现逻辑代码详解

[复制链接]
查看94 | 回复17 | 2021-9-17 11:49:42 | 显示全部楼层 |阅读模式
目次

mybatis通过将sql设置 xml文件中,通过分析 xml动态标签来实现动态sql
如下样例 xml文件

  1. <?xml version = "1.0" ?>
  2. <!DOCTYPE script SYSTEM "script-1.0.dtd">
  3. <script namespace="user">
  4. <common id="commonOrder">
  5. order by id desc
  6. </common>
  7. <sql id="queryUser">
  8. select * from user
  9. <where>
  10. <if test='id != null '>
  11. id = #{id}
  12. </if>
  13. <if test="names != null and names.size() >0">
  14. and name in
  15. <foreach collection="names" item="item" separator="," open="(" close=")">
  16. ${item}
  17. </foreach>
  18. </if>
  19. </where>
  20. <ref id="commonOrder"/>
  21. </sql>
  22. <sql id="updateUser">
  23. update user set name = ${name}
  24. <where>
  25. <if test='id != null '>
  26. id = #{id}
  27. </if>
  28. </where>
  29. </sql>
  30. </script>
复制代码

1.xml文件读取

xml标签编写规则

  1. <!ELEMENT script (#PCDATA | sql | common)*>
  2. <!ATTLIST script
  3. namespace CDATA #REQUIRED
  4. >
  5. <!ELEMENT sql (#PCDATA | trim | where | set | foreach | choose | if | ref)*>
  6. <!ATTLIST sql
  7. id CDATA #REQUIRED
  8. >
  9. <!ELEMENT common (#PCDATA | trim | where | set | foreach | choose | if)*>
  10. <!ATTLIST common
  11. id CDATA #REQUIRED
  12. >
  13. <!ELEMENT ref (#PCDATA)*>
  14. <!ATTLIST ref
  15. id CDATA #REQUIRED
  16. >
  17. <!ELEMENT trim (#PCDATA | trim | where | set | foreach | choose | if)*>
  18. <!ATTLIST trim
  19. prefix CDATA #IMPLIED
  20. prefixOverrides CDATA #IMPLIED
  21. suffix CDATA #IMPLIED
  22. suffixOverrides CDATA #IMPLIED
  23. >
  24. <!ELEMENT where (#PCDATA | trim | where | set | foreach | choose | if | ref)*>
  25. <!ELEMENT set (#PCDATA | trim | where | set | foreach | choose | if)*>
  26. <!ELEMENT foreach (#PCDATA | trim | where | set | foreach | choose | if)*>
  27. <!ATTLIST foreach
  28. collection CDATA #REQUIRED
  29. item CDATA #IMPLIED
  30. index CDATA #IMPLIED
  31. open CDATA #IMPLIED
  32. close CDATA #IMPLIED
  33. separator CDATA #IMPLIED
  34. >
  35. <!ELEMENT choose (when* , otherwise?)>
  36. <!ELEMENT when (#PCDATA | trim | where | set | foreach | choose | if)*>
  37. <!ATTLIST when
  38. test CDATA #REQUIRED
  39. >
  40. <!ELEMENT otherwise (#PCDATA | trim | where | set | foreach | choose | if)*>
  41. <!ELEMENT if (#PCDATA | trim | where | set | foreach | choose | if)*>
  42. <!ATTLIST if
  43. test CDATA #REQUIRED
  44. >
复制代码

DocumentBuilderFactory 是jdk自带的分析 xml文件操作,位于 javax.xml.parsers 包,如图其是一个抽象类,因此无法被实例化

在这里插入图片形貌

必要 通过 newInstance 来实例化

在这里插入图片形貌

实例化对象后的属性 setValidating(true); 即通过xml的 验证规则举行 xml格式验证

setNamespaceAware 设置忽略定名 空间
对于xml文件的定名 空间的定义,详见
https://www.jb51.net/article/219617.htm

  1. private Document buildXml(InputStream scriptFile)
  2. throws ParserConfigurationException, SAXException, IOException {
  3. DocumentBuilderFactory factory = DocumentBuilderFactory
  4. .newInstance();
  5. //默认情况下,解析器不验证文档。将这个参数设置为 true 可打开验证功能。
  6. factory.setValidating(true);
  7. //是否设置命名空间
  8. factory.setNamespaceAware(false);
  9. //确定是否要忽略文件中的注释。其默认值为 false。
  10. factory.setIgnoringComments(true);
  11. //确定是否要忽略元素内容中的空白(类似于浏览器对待 HTML 的方式)。其默认值为 false。
  12. factory.setIgnoringElementContentWhitespace(false);
  13. //定解析器是否要将 CDATA 节点转换为文本,以及是否要和周围的文本节点合并(如果适用的话)。其默认值为 false。
  14. factory.setCoalescing(false);
  15. //确定是否要展开外部实体引用。如果为 true,外部数据将插入文档。其默认值为 true
  16. factory.setExpandEntityReferences(true);
  17. DocumentBuilder builder = factory.newDocumentBuilder();
  18. //设置验证规则文件 dtd文件
  19. builder.setEntityResolver(new EntityResolver() {
  20. @Override
  21. public InputSource resolveEntity(String publicId,
  22. String systemId) throws SAXException, IOException {
  23. return new InputSource(new ClassPathResource("script-1.0.dtd").getInputStream());
  24. }
  25. });
  26. //设置错误解析器
  27. builder.setErrorHandler(new ErrorHandler() {
  28. @Override
  29. public void error(SAXParseException exception)
  30. throws SAXException {
  31. throw exception;
  32. }
  33. @Override
  34. public void fatalError(SAXParseException exception)
  35. throws SAXException {
  36. throw exception;
  37. }
  38. @Override
  39. public void warning(SAXParseException exception)
  40. throws SAXException {
  41. }
  42. });
  43. return builder.parse(scriptFile);
  44. }
复制代码

2.xml 文件分析

到此这篇关于mybatis动态sql实现逻辑代码详解的文章就先容 到这了,更多干系 mybatis动态sql内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的干系 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 昀离936 | 2021-9-20 12:54:09 | 显示全部楼层
admin楼主很有经验啊!
回复

使用道具 举报

avatar XY890 | 2021-9-20 22:27:38 | 显示全部楼层
这么好的帖子,应该加精华!
回复

使用道具 举报

avatar 123457648 | 2021-10-1 22:19:58 | 显示全部楼层
读了admin楼主的帖子,顿时马桶就通了。。。
回复

使用道具 举报

avatar 名人堂熊猫虞kk | 2021-10-12 14:59:38 | 显示全部楼层
突然觉得admin楼主说的很有道理,赞一个!
回复

使用道具 举报

avatar 穿雨捶 | 2021-10-14 13:47:55 | 显示全部楼层
admin楼主发几张靓照啊!
回复

使用道具 举报

avatar 玻璃杯儿敌 | 2021-10-16 00:38:15 | 显示全部楼层
世界末日我都挺过去了,看到admin楼主我才知道为什么上帝留我到现在!
回复

使用道具 举报

avatar 水497 | 7 天前 | 显示全部楼层
admin楼主说的我也略懂!
回复

使用道具 举报

管它三七二十一!
回复

使用道具 举报

admin楼主给脑残下了定义!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则