mybatis动态sql实现逻辑代码详解
作者:_东极 发布时间:2024-01-13 05:13:04
标签:mybatis,动态,sql
mybatis通过将sql配置xml文件中,通过解析xml动态标签来实现动态sql
如下样例 xml文件
<?xml version = "1.0" ?>
<!DOCTYPE script SYSTEM "script-1.0.dtd">
<script namespace="user">
<common id="commonOrder">
order by id desc
</common>
<sql id="queryUser">
select * from user
<where>
<if test='id != null '>
id = #{id}
</if>
<if test="names != null and names.size() >0">
and name in
<foreach collection="names" item="item" separator="," open="(" close=")">
${item}
</foreach>
</if>
</where>
<ref id="commonOrder"/>
</sql>
<sql id="updateUser">
update user set name = ${name}
<where>
<if test='id != null '>
id = #{id}
</if>
</where>
</sql>
</script>
1.xml文件读取
xml标签编写规则
<!ELEMENT script (#PCDATA | sql | common)*>
<!ATTLIST script
namespace CDATA #REQUIRED
>
<!ELEMENT sql (#PCDATA | trim | where | set | foreach | choose | if | ref)*>
<!ATTLIST sql
id CDATA #REQUIRED
>
<!ELEMENT common (#PCDATA | trim | where | set | foreach | choose | if)*>
<!ATTLIST common
id CDATA #REQUIRED
>
<!ELEMENT ref (#PCDATA)*>
<!ATTLIST ref
id CDATA #REQUIRED
>
<!ELEMENT trim (#PCDATA | trim | where | set | foreach | choose | if)*>
<!ATTLIST trim
prefix CDATA #IMPLIED
prefixOverrides CDATA #IMPLIED
suffix CDATA #IMPLIED
suffixOverrides CDATA #IMPLIED
>
<!ELEMENT where (#PCDATA | trim | where | set | foreach | choose | if | ref)*>
<!ELEMENT set (#PCDATA | trim | where | set | foreach | choose | if)*>
<!ELEMENT foreach (#PCDATA | trim | where | set | foreach | choose | if)*>
<!ATTLIST foreach
collection CDATA #REQUIRED
item CDATA #IMPLIED
index CDATA #IMPLIED
open CDATA #IMPLIED
close CDATA #IMPLIED
separator CDATA #IMPLIED
>
<!ELEMENT choose (when* , otherwise?)>
<!ELEMENT when (#PCDATA | trim | where | set | foreach | choose | if)*>
<!ATTLIST when
test CDATA #REQUIRED
>
<!ELEMENT otherwise (#PCDATA | trim | where | set | foreach | choose | if)*>
<!ELEMENT if (#PCDATA | trim | where | set | foreach | choose | if)*>
<!ATTLIST if
test CDATA #REQUIRED
>
DocumentBuilderFactory 是jdk自带的解析xml文件操作,位于 javax.xml.parsers 包,如图其是一个抽象类,因此无法被实例化
需要通过 newInstance 来实例化
实例化对象后的属性 setValidating(true); 即通过xml的 验证规则进行xml格式验证
setNamespaceAware 设置忽略命名空间
对于xml文件的命名空间的定义,详见
https://www.jb51.net/article/219617.htm
private Document buildXml(InputStream scriptFile)
throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
//默认情况下,解析器不验证文档。将这个参数设置为 true 可打开验证功能。
factory.setValidating(true);
//是否设置命名空间
factory.setNamespaceAware(false);
//确定是否要忽略文件中的注释。其默认值为 false。
factory.setIgnoringComments(true);
//确定是否要忽略元素内容中的空白(类似于浏览器对待 HTML 的方式)。其默认值为 false。
factory.setIgnoringElementContentWhitespace(false);
//定解析器是否要将 CDATA 节点转换为文本,以及是否要和周围的文本节点合并(如果适用的话)。其默认值为 false。
factory.setCoalescing(false);
//确定是否要展开外部实体引用。如果为 true,外部数据将插入文档。其默认值为 true
factory.setExpandEntityReferences(true);
DocumentBuilder builder = factory.newDocumentBuilder();
//设置验证规则文件 dtd文件
builder.setEntityResolver(new EntityResolver() {
@Override
public InputSource resolveEntity(String publicId,
String systemId) throws SAXException, IOException {
return new InputSource(new ClassPathResource("script-1.0.dtd").getInputStream());
}
});
//设置错误解析器
builder.setErrorHandler(new ErrorHandler() {
@Override
public void error(SAXParseException exception)
throws SAXException {
throw exception;
}
@Override
public void fatalError(SAXParseException exception)
throws SAXException {
throw exception;
}
@Override
public void warning(SAXParseException exception)
throws SAXException {
}
});
return builder.parse(scriptFile);
}
2.xml 文件解析
来源:https://blog.csdn.net/wwwzydcom/article/details/119649970


猜你喜欢
- 1、安装pip install djangorestframework2、创建项目及应用创建项目创建应用目录结构如图3、设置settings
- 本文实例讲述了php文件上传类。分享给大家供大家参考,具体如下:/**$file=new class_file($file_array,&q
- 使用Nodejs的开发者愈来越多,基于Nodejs的后台开发也多了起来,像短信验证码、短信群发、国际短信这些需求,完全可以采用第三方接口来实
- 下面和大家分享一下具体的实现过程。HTML标签结构:<ul class="animation_menu">&
- 热力图热力图(Heat Map)是指用 X 轴 和 Y 轴 表示的两个分类字段确定数值点的位置,通过相应位置的矩形颜色去表现数值的大小,颜色
- 本文实例讲述了laravel框架中路由设置,路由参数和路由命名。分享给大家供大家参考,具体如下:laravel中必须先配置路由,才能使用。不
- 思路:先随机排序然后再分组就好了。1、创建表:CREATE TABLE `xdx_test` ( `id` int(11) NOT NULL
- 该章节我们来学习一下在 Python 中去创建并使用多进程的方法,通过学习该章节,我们将可以通过创建多个进程来帮助我们提高脚本执行的效率。可
- 需求分析现在是 "图片为王"的时代,在浏览一些网站时,经常会看到类似于这种满屏都是图片。图片大小不一,却按空间排列,就这
- 简介使用Pandas的pivot方法可以将DF进行旋转变换,本文将会详细讲解pivot的秘密。使用Pivotpivot用来重组DF,使用指定
- 本文实例为大家分享了PHP文件操作的具体代码,供大家参考,具体内容如下(1)文件读取file_get_contents( )实例:<?
- 我想大多数的人在编写ASP程序的时候,都碰到过类似的错误信息: Error Num
- Python 爬虫图片简单实现经常在逛知乎,有时候希望把一些问题的图片集中保存起来。于是就有了这个程序。这是一个非常简单的图片爬虫程序,只能
- 假设前提:每天晚上10点到早上5点,每10分钟定时执行存储过程。实现方式:第一种是利用Mysql本身实现,制定event定时任务,可以借助N
- 通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。你们大部分人大概都知道怎样把日期进行分割
- 本文实例讲述了PHP实现通过正则表达式替换回调的内容标签。分享给大家供大家参考。具体实现方法如下:function my_wp_plugin
- window.onresize = baiduResizeDiv; window.onerror = function(){} var di
- 一、卷积神经网络Yann LeCun 和Yoshua Bengio在1995年引入了卷积神经网络,也称为卷积网络或CNN。CNN是一种特殊的
- ORA-00600:internal error code,arguments:[num],[?],[?],[?],[?] 产生原因:这种错
- 百度地图开放平台进入百度地图开放平台后,登陆用户,点击上方的控制台,按照提示进行激活后创建服务端类型的应用,应用名任意设置,其中白名单校验不