自定義jfinal插件-SqlInXmlPlugin篇

在業務表關係複雜,數據量大的時候,總的說手寫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

相關文章
相關標籤/搜索