在業務表關係複雜,數據量大的時候,總的說手寫sql是比較好的方式。可是當sql語句較爲複雜一行代碼很難容納下的時候,在沒有多行字符串的java世界就至關蛋疼。mybatis這類能夠在xml中管理sql語句的框架是一種比較好的選擇。java
我也並無怎麼深刻用過這些框架,僅吸收xml管理sql的思想爲jfinal作一個小小的插件。在設計方面本身也感受有不少不暢的地方,在此拋磚引玉直接上代碼。sql
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中調用 mybatis
List<MobileBind> mobileBinds = find(SqlManager.sql("mobileBind.findByStudentMobile"), studentMobile);框架
一些問題:ide
SqlManager這裏面的功能是否能夠移到SqlInXmlPlugIn中?感受SqlInXmlPlugin.sql()這麼調用有點彆扭。 spa
另外在sql語句不是很複雜改動不頻繁的狀況下直接寫到java類比xml方便一點。由於雖然sql在xml統一管理,又能夠利用xml格式化sql語句,易於維護。 可是在java這一層來讀代碼又不能直接在看到sql,也是一個很煩的事情。
來源:http://my.oschina.net/b1412/blog/67666.net