文档章节

JFinal SqlInXmlPlugin

绝望的八皮
 绝望的八皮
发布于 2012/07/18 11:44
字数 522
阅读 2978
收藏 21

      在业务表关系复杂,数据量大的时候,总的说手写sql是比较好的方式。但是当sql语句较为复杂一行代码很难容纳下的时候,在没有多行字符串的java世界就相当蛋疼。mybatis这类可以在xml中管理sql语句的框架是一种比较好的选择。

       我也并没有怎么深入用过这些框架,仅吸取xml管理sql的思想为jfinal做一个小小的插件。在设计方面自己也感觉有很多不顺畅的地方,在此抛砖引玉直接上代码。

package com.jfinal.plugin.sqlInXml;

import com.jfinal.plugin.IPlugin;

public class SqlInXmlPlugin implements IPlugin {

	@Override
	public boolean start() {
		try {
			SqlManager.parseSqlXml();
		} catch (Exception e) {
			new RuntimeException(e);
		}
		return true;
	}

	@Override
	public boolean stop() {
		SqlManager.clearSqlMap();
		return true;
	}

}

package com.jfinal.plugin.sqlInXml;

import java.io.File;
import java.io.FileFilter;
import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

public class SqlManager {
	private static Map<String, String> sqlMap = new HashMap<String, String>();

	public static String sql(String groupNameAndsqlId) {
		return sqlMap.get(groupNameAndsqlId);
	}

	static void clearSqlMap() {
		sqlMap.clear();
	}

	static void parseSqlXml() {
		File file = new File(SqlManager.class.getClassLoader().getResource("").getFile());
		File[] files = file.listFiles(new FileFilter() {

			@Override
			public boolean accept(File pathname) {
				if (pathname.getName().endsWith("sql.xml")) {
					return true;
				}
				return false;
			}
		});
		for (File xmlfile : files) {
			SqlGroup group = null;
			try {
				JAXBContext context = JAXBContext.newInstance(SqlGroup.class);
				Unmarshaller unmarshaller = context.createUnmarshaller();
				group = (SqlGroup) unmarshaller.unmarshal(xmlfile);
			} catch (JAXBException e) {
				throw new RuntimeException(e);
			}
			String name = group.name;
			if (name == null || name.trim().equals("")) {
				name = xmlfile.getName();
			}
			for (SqlItem sqlItem : group.sqlItems) {
				sqlMap.put(name + "." + sqlItem.id, sqlItem.value);
			}
		}
	}

	public static void main(String[] args) {
		parseSqlXml();
		System.out.println(sqlMap);
	}

}

package com.jfinal.plugin.sqlInXml;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
 class SqlGroup {
	@XmlAttribute 
	 String name;
    @XmlElement(name="sql")
	 List<SqlItem> sqlItems = new ArrayList<SqlItem>();

	 void addSqlgroup(SqlItem sqlGroup) {
		sqlItems.add(sqlGroup);
	}


}

package com.jfinal.plugin.sqlInXml;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

@XmlRootElement
 class SqlItem {
	@XmlAttribute 
	 String id;

	@XmlValue
	 String value;


}

 sql.xml 
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<sqlGroup name="mobileBind">
    <sql id="findByStudentMobile">select * from mobilebind where studentMobile = ?</sql>
    <sql id="xx">....</sql>
    
</sqlGroup>

 简单使用:

Model中调用 

List<MobileBind> mobileBinds = find(SqlManager.sql("mobileBind.findByStudentMobile"), studentMobile);


 一些问题:

SqlManager这里面的功能是否可以移到SqlInXmlPlugIn中?感觉SqlInXmlPlugin.sql()这么调用有点别扭。 

另外在sql语句不是很复杂改动不频繁的情况下直接写到java类比xml方便一点。因为虽然sql在xml统一管理,又可以利用xml格式化sql语句,易于维护。 但是在java这一层来读代码又不能直接在看到sql,也是一个很烦的事情。

 

 

© 著作权归作者所有

共有 人打赏支持
绝望的八皮

绝望的八皮

粉丝 392
博文 22
码字总数 10505
作品 2
其它
CTO(技术副总裁)
私信 提问
加载中

评论(17)

李金元s
李金元s
能不能写代码多打点注释 让别看得懂
李金元s
李金元s
sqls.xml
李金元s
李金元s
请问在哪里改sql的路径
李金元s
李金元s
我调用的时候 会报错 说sql 不能为空
g
gyj129129
我问一下大家伙 xml中的sql 可以利用条件语句来拼写吗?如:if("username"!=null){and username=?}
绝望的八皮
绝望的八皮

引用来自“Role”的评论

咋的获取不到xml中的sql的?

引用来自“绝望的八皮”的评论

https://github.com/b1412/jfinal-ext/tree/master/src/main/java/com/jfinal/ext/plugin/sqlinxml Sqlkit.sql("xxxx")

引用来自“Role”的评论

我发现只能扫描classpath目录下的sql.xml放基它包内就找不着了
这个demo是只scan classpath 的root,可以自己根据需要做修改
绝望的八皮
绝望的八皮

引用来自“Role”的评论

这个支持多数据库不?如oracle、sqlserver、mysql不?
'
只是单纯的吧sql放到xml而已.和数据库无关
Role
Role

引用来自“Role”的评论

咋的获取不到xml中的sql的?

引用来自“绝望的八皮”的评论

https://github.com/b1412/jfinal-ext/tree/master/src/main/java/com/jfinal/ext/plugin/sqlinxml Sqlkit.sql("xxxx")
我发现只能扫描classpath目录下的sql.xml放基它包内就找不着了
Role
Role
这个支持多数据库不?如oracle、sqlserver、mysql不?
'
Role
Role
我也遇到这问题,用着扫描不到sql.xml文件着
JFinal Extensions 1.0 发布,JFinal 扩展

Jfinal-ext是对java极速web框架 jfinal 的一个扩充,主要利用jfinal的plugin机制集成各种第三方框架,像spring一样,简化开发者的学习应用成本,使用时请将jfinal.jar先引入工程。 Jfinal-e...

绝望的八皮
2012/10/14
1K
13
Jfinal-ext shiro注解不起作用

我现在环境Jfinal2.0 + Jfinal-ext , 其中用到了ext的shiro,也自定义了Reaml,现在的问题是ext的shiro注解无效,不起作用(使用shiro.ini文件中的urls配置和在代码里直接调用curuser.isPer...

tomney2008
2015/07/17
587
1
SqlInXmlPlugin 怎么不递归扫描子目录......

@绝望的八皮 你好,想跟你请教个问题: 使用SqlInXmlPlugin 的时候,发现没有扫描子目录中sql文件。 我看了代码,只扫描了,根目录下以sql.xml结尾的文件!!! 又不想换 dreampie jfinal-sq...

大树被注册了
2015/05/26
163
1
自定义jfinal插件-SqlInXmlPlugin篇

在业务表关系复杂,数据量大的时候,总的说手写sql是比较好的方式。但是当sql语句较为复杂一行代码很难容纳下的时候,在没有多行字符串的java世界就相当蛋疼。mybatis这类可以在xml中管理sql...

鱼中鱼
2012/07/18
0
4
jfinal sdk和jfinal weixin区别

@JFinal ,你好,我的项目现在继承了jfinal 3.2版本,但是突然加入了公众号需求,想知道jfinal 3.2和jfinal weixin 1.2有什么区别?如果jfinal weixin是直接在jfinal 上扩展的,那我是不是把j...

pkxutao
2017/08/09
109
2

没有更多内容

加载失败,请刷新页面

加载更多

dubbo自学入门

由于敏感文字检索过于死板,请跳转我的csdn博客查看 https://blog.csdn.net/loveshunyi/article/details/88813214

GodIsCj
32分钟前
1
0
前嗅ForeSpider脚本教程:模板脚本

链接脚本是频道的模板中的脚本。配置了模板脚本,模板的处理流程将被改变: 1.如果脚本未正确返回dom区域节点,则该模板的采集则完全由该脚本控制。 2.如果脚本返回了一个正确的dom区域节点,...

forespider
35分钟前
0
0
DM 源码阅读系列文章(二)整体架构介绍

作者:张学程 本文为 DM 源码阅读系列文章的第二篇,第一篇文章 简单介绍了 DM 源码阅读的目的和规划,以及 DM 的源码结构以及工具链。从本篇文章开始,我们会正式开始阅读 DM 的源码。 本篇...

TiDB
36分钟前
1
0
stm32h7 __attribute__((weak)) 使用说明

在用stm32h7 板子的时候,看了一个usmart历程,里面有个usart.c函数,声明了一个函数叫做HAL_UART_RxCpltCallback(UART_HandleTYpeDef *huart) 然后再stm32h7xx_hal_uart.c里看到了同样的一个...

青春无极限
38分钟前
1
0
用 C 语言编写 Windows 服务程序的五个步骤(转)

摘要   Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务。为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择。本文将建立并 实现一个简单的服务程...

_编程菜鸟_
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部