文档章节

JFinal SqlInXmlPlugin

绝望的八皮
 绝望的八皮
发布于 2012/07/18 11:44
字数 522
阅读 3.1K
收藏 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 条评论,请先登录后再查看。
一个十分简洁清新小巧的java BBS--JFinal-BBS

这是一个java新人开发的BBS,本着:希望她能提供给java web新人一点帮助的想法。 JFinal-BBS采用了简洁强大的JFinal作为web框架,模板引擎用的是beetl,数据库用mysql,前端bootstrap框架,大...

匿名
2013/05/10
3W
22
深度吐槽hibernate

hibernate我很久都没有用了,最后一次用应该是3年前的一个企业项目,决定采用hibernate的并不是我,是我领导,我只是开发者。我所受的罪领导并不知道。正如我的每个hibernate项目那样,每次我...

闲大赋
2015/12/23
5.3K
56
JFinal集成Activiti流程引擎(不使用Spring)

大多数项目都集成Spring网上大多数教程也是Activiti集成Spring的方法集成到项目中。 一直也没有找到如何抛离Spring使用Activiti。 一开始以为集成Activit需要大量的工作,实际上非常简单。 ...

丶Lion
2016/05/26
5.7K
12
修复AOP接口自动绑定时不成功的bug

jboot 1.0-alpha5 changes更新如下: 修复AOP接口自动绑定时不成功的bug,新增了@Bean注解,方便对接口绑定的配置; 移除默认的jvm对jmx的设置,因为在docker环境下,设置网络为host模式时可...

lsbcjy
2017/07/09
86
0
JFinal 怎么查询一对多关系的数据,JSP页面怎么展示

JFinal 要在页面展示一对多关系的数据,应该怎么查询?例如要展示一个城市的信息和所属的号码段。这个怎么写?

追月小虎
2012/09/28
4.2K
3

没有更多内容

加载失败,请刷新页面

加载更多

Vue视频播放器 vue-video-player

Vue视频播放器 vue-video-player 本篇主要记录一下 在 vue 项目中 如何使用 vue-video-player 来作为视频播放器,由于最近在做博客的 轻松一刻模块 所以拿这个尝试一下 在此纪录一下 以及遇到...

AskaJohnny
29分钟前
5
0
Python是什么,Python语言及其特点简介

虽然软件产业的历史相对于人类历史只是白驹过隙,但世界上却存在非常多的编程语言,「Python」 就是其中之一。 Python 语言算得上一门“古老”的编程语言,Python 流行这么久,必然有它的独到...

前端老司机
38分钟前
15
0
serve 和 hhtp-server 对比

两个都是一个静态资源工具 npm i serve http-server -g https://github.com/http-party/http-server#readme https://github.com/vercel/serve#readme 由于遇到了cors问题, 目前选择http-se......

阿豪boy
39分钟前
28
0
java开发之阿里云接口发送短信验证码

随着互联网的兴起,各行各业的需求都在不断的增加。随着业务的扩大,企业给用户发送短信验证码的业务,也是如火如荼。在这里,calvin给各位开发者推荐阿里云短信平台。原因有二:1.接入较简单...

Arisono
49分钟前
27
0
如何从我的应用程序在Android的网络浏览器中打开URL? - How can I open a URL in Android's web browser from my application?

问题: How to open an URL from code in the built-in web browser rather than within my application? 如何通过内置Web浏览器而不是应用程序中的代码打开URL? I tried this: 我尝试了这个...

javail
50分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部