乱写的一个SQL框架

闲来没事,看了mybatis的实现形式,就心血来潮的自己弄了一个仿照mybatis的框架,性能肯定不好,而且有很多问题,但是是一次有益的尝试

 

1.基本配置文件

<!--加载数据源--> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>org.logicalcobwebs.proxool.ProxoolDriver</value> </property> <property name="url"> <value>proxool.inventory</value> </property> </bean> <bean id="InventoryTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref local='dataSource' /> </property> </bean>
<!--定义数据库类型--> <bean id="multiDBSQLSupport" class="com.****.linkalarm.dao.db.MultiDBSQLSupport"> <property name="type" value="mysql"></property> </bean> <!--加载数据库操作--> <bean id="basicDBOper" class="com.****.linkalarm.dao.db.BasicDBOper"> <property name="multiDBSQLSupport" ref="multiDBSQLSupport"></property> <property name="jdbcTemplate" ref="InventoryTemplate"></property> </bean>

2.主要实现类

  1).SQL语句支持类

  

/**
 * 多数据库支持类型*/
public class MultiDBSQLSupport {
    
    //数据库类型
    private  String type = "mysql";
    
    private  Properties localProperties;

    public  String getBasicSQL(String key){
        return getProperties(key,"");
    }
    
    /**
     * 获得插入SQL*/
    public  String getInsertSQL(String key,Map<String,String> valueMap){
        if(valueMap==null){
            return null;
        }
        String sql = getBasicSQL(key).toLowerCase();
        if(!sql.equals("")){
            String v = sql.trim().split("values")[1].replace("(", "").replace(")", "").replace(";", "");
            String[] vs = v.split(",");
            for(String s:vs){
                s = s.trim();
                if(s.contains("#")){
                    String s1 = s.replaceAll("#", "").trim();
                    String valueString;
                    if(valueMap.containsKey(s1)){
                        valueString = valueMap.get(s1);
                    }else if(valueMap.containsKey(s1.toUpperCase())){
                        valueString = valueMap.get(s1.toUpperCase());
                    }else{
                        valueString = "";
                    }
                    sql = sql.replace(s, valueString);
                }
            }
        }
        return sql;
    }
    
    /**
     * 获得查询SQL*/
    public  String getQuerySQL(String key,Map<String,String> valueMap){
        String sql = getBasicSQL(key).toLowerCase().trim();
        List<String> paramsList = new ArrayList<String>();
        for(int i=0;i<sql.length();i++){
            char ch = sql.charAt(i);
            if(ch=='#'){
                String tempStr = "";
                char c;
                while((c = sql.charAt(++i))!='#'){
                    tempStr = tempStr + sql.charAt(i);
                }
                paramsList.add("#"+tempStr+"#");
            }
        }
        
        for(String parms:paramsList){
            sql = sql .replace(parms, valueMap.get(parms.replaceAll("#", "").trim()));
        }
        return sql;
    }
    
    
    /**
     * 获得插入SQL*/
    public  String getQuerySQL(String key,String...values){
        String sql = getBasicSQL(key).toLowerCase().trim();
        List<String> paramsList = new ArrayList<String>();
        for(int i=0;i<sql.length();i++){
            char ch = sql.charAt(i);
            if(ch=='#'){
                String tempStr = "";
                char c;
                while((c = sql.charAt(++i))!='#'){
                    tempStr = tempStr + sql.charAt(i);
                }
                paramsList.add("#"+tempStr+"#");
            }
        }
        for(int i=0;i<values.length;i++){
            sql = sql.replace(paramsList.get(i), values[i]+"");
        }
        return sql;
    }
    
    /**
     * 获得批量插入SQL*/
    public  String[] getBatchInsertSQL(String key,List<Map<String,String>> valueMaps){
        if(valueMaps==null){
            return null;
        }
        int length = valueMaps.size();
        String[] results = new String[length];
        
        String sql = getBasicSQL(key).toLowerCase();
        if(!sql.equals("")){
            String v = sql.trim().split("values")[1].replace("(", "").replace(")", "").replace(";", "");
            String[] vs = v.split(",");
            for(int i=0;i<length;i++){
                String newsql = sql;
                Map<String,String> valueMap = valueMaps.get(i);
                for(String s:vs){
                    s = s.trim();
                    if(s.contains("#")){
                        String s1 = s.replaceAll("#", "").trim();
                        String valueString;
                        if(valueMap.containsKey(s1)){
                            valueString = valueMap.get(s1);
                        }else if(valueMap.containsKey(s1.toUpperCase())){
                            valueString = valueMap.get(s1.toUpperCase());
                        }else{
                            valueString = "";
                        }
                        newsql = newsql.replace(s, valueString);
                    }
                }
                results[i] = newsql;
            }
        }
        return results;
    }
    
    
    /**
     * 读取配置文件
     * */
    private  String getProperties(String key,String defaultValue){
        if(localProperties==null){
            try{
                String path = ProgramPathHelper.getProgramPath() +System.getProperty("file.separator")+"sql_"+type+".properties";
                URL url = null;
                File file = new File(path);
                try {
                    if (file.exists()) {

                        url = file.toURI().toURL();
                    } else {
                        path="sql_"+type+".properties";
                        url = new URL(path);
                    }
                } catch (MalformedURLException e) {
                    url = ConfigHelp.findAsResource(path);
                }
                if (null == url) {
                    throw new FileNotFoundException(path);
                }
                InputStream in =  new BufferedInputStream(new FileInputStream(new File(url.toURI())));
                localProperties =  new Properties(); 
                localProperties.load(in);
            }catch(Exception ex){
                Logger logger = Logger.getLogger(ConfigHelp.class);
                logger.warn("read configuration.properties while error", ex);
            }
        }
        try{
            String result = localProperties.getProperty(key);
            if(result!=null && !"".equals(result)){
                return result;
            }
        }catch(Exception ex){
            Logger logger = Logger.getLogger(ConfigHelp.class);
            logger.warn("return  configuration.properties value while error", ex);
        }
        return defaultValue;
    }
    
    
    
    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
    
}

 

  2).数据操作接口

 

public interface IDataBaseOper<T> {

    /**
     * 查询*/
    public List<Map<String,Object>> getQueryList(String sql);
    
    /**
     * 查询*/
    public List<T> getQueryList(String sql,Class classs);
    
    
    /**
     * 插入*/
    public int insertSQL(String sql);
    
    /**
     * 更新*/
    public int updateSQL(String sql);
    
    
    /**
     * 获取sql语句*/
    public String getSQL(String key,String...values);
    
}

 

  3).抽象数据操作

public abstract class ADataBaseOper<T> implements IDataBaseOper<T>{

    protected JdbcTemplate jdbcTemplate;
    
    protected MultiDBSQLSupport multiDBSQLSupport;

    public JdbcTemplate getJdbcTemplate() {
        return jdbcTemplate;
    }

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public MultiDBSQLSupport getMultiDBSQLSupport() {
        return multiDBSQLSupport;
    }

    public void setMultiDBSQLSupport(MultiDBSQLSupport multiDBSQLSupport) {
        this.multiDBSQLSupport = multiDBSQLSupport;
    }
    
}

 

  4).基本数据操作类

/**
 * 基础数据库操作类*/
public class BasicDBOper<T> extends ADataBaseOper<T>{
    
    private static final Logger logger = Logger.getLogger(BasicDBOper.class);
    
    public List<Map<String,Object>> getQueryList(String sql){
        try {
            return jdbcTemplate.queryForList(sql);
        } catch (DataAccessException e) {
            try {
                System.out.println(jdbcTemplate.getDataSource().getConnection().getMetaData().getURL());
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            logger.info(e);
        }
        return null;
    }

    public int insertSQL(String sql){
        try {
            jdbcTemplate.execute(sql);
            return 1;
        } catch (Exception e) {
            try {
                System.out.println(jdbcTemplate.getDataSource().getConnection().getMetaData().getURL());
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            logger.info(e);
        }
        return 0;
    }
    
    public int updateSQL(String sql){
        return jdbcTemplate.update(sql);
    }

@Override
public List<T> getQueryList(String sql,Class classs) { try { List<T> objects = null; List<Map<String,Object>> results = this.getQueryList(sql); if(results!=null&&results.size()>0){ objects = new ArrayList<T>(); for(int i=0;i<results.size();i++){ Map<String,Object> map = results.get(i); try { Object obj = classs.newInstance(); Field[] fs = classs.getDeclaredFields(); for(Field f:fs){ String name = f.getName(); if(map.containsKey(name)){ f.setAccessible(true); f.set(obj, map.get(name)+""); f.setAccessible(false); } } objects.add((T)obj); } catch (Exception e) { logger.info(e); continue; } } } return objects; } catch (Exception e) { try { System.out.println(jdbcTemplate.getDataSource().getConnection().getMetaData().getURL()); } catch (SQLException e1) { e1.printStackTrace(); } logger.info(e); } return null; } @Override public String getSQL(String key, String... values) { String sql = this.getMultiDBSQLSupport().getQuerySQL(key, values); //logger.info("GET SQL result is "+sql); return sql; } }

 

3.使用这个框架

  1).定义SQL语句

  sql_mysql.properties

  

jdbc.getLinkVPN=select v.name from link l,re_link_vpn r,vpn v where l.UUID ='#linkid#' and r.vpn_id = v.UUID and l.UUID = r.link_id
jdbc.analyse.getRule=select uuid,name,raction as action from patrolrule where atype = '2' and uuid = #ruleid#

 

  2).使用类

  

public static List<Map<String,Object>> getLinkVPN(String linkid){
        return dataBaseOper.getQueryList(dataBaseOper.getSQL("jdbc.getLinkVPN",linkid));
    } 
public static List<PatrolRule> getTaskRule(String ruleId){
        return dataBaseOper.getQueryList(dataBaseOper.getSQL("jdbc.analyse.getRule", ruleId), PatrolRule.class);
    }

 

posted @ 2015-03-25 21:59  TomSnail  阅读(542)  评论(0编辑  收藏  举报