zoukankan      html  css  js  c++  java
  • 面试准备--持久层框架

          在说到持久层框架,耳熟能详的有Hibernate和iBatis,他们最简单的区别是一个全自动的,一个是半自动的。但是归根结底他们的实现原理都差不多,他们都是引用了C3P0数据库连接池,使用ibatis 提供的orm机制,对业务逻辑实现人员而言,面对的是纯粹的java对象。这一层与通过hibernate 实现orm 而言基本一致,而对于具体的数据操作,hibernate会自动生成sql 语句,而ibatis 则要求开发者编写具体的sql 语句。相对hibernate而言,ibatis 以sql开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。 

         以下是本人模仿写的持久层框架

         当用户的业务逻辑处理中,需要对数据库进行操作,依照Hibernate的经验,我们需要自定义一些条件带入,所以这里创建了2个类:Criteria.java负责查询,Handler.java负责修改数据。

      

    package com.qj.engine.sqlmap;
    
    import java.sql.SQLException;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import com.qj.engine.session.Session;
    import com.qj.engine.session.SessionImpl;
    import com.qj.engine.session.exception.SessionException;
    import com.qj.engine.sqlmap.util.FilterUtil;
    
    
    public class Criteria {
        private String tableName="";
        private int custom = 0;
        private Map<String, String> filterMap = new HashMap<String, String>();
        private Map<String, String> orderMap = new HashMap<String, String>();
        private Session session = new SessionImpl();
        public Criteria(String tableName) {
            this.tableName = tableName;
        }
        /**
         *    添加过滤条件 
         */
        public void filter(CriteriaTypes type, String colName, Object value){
            String filterStr = FilterUtil.getFilterStr(type, colName, value);
            this.filterMap.put(colName, filterStr);
        }
        /**
         *    添加过滤条件 between and 
         */
        public void filter(CriteriaTypes type, String colName, Object val1, Object val2){
            String filterStr = FilterUtil.getFilterStr(type, colName, val1, val2);
            this.filterMap.put(colName, filterStr);
        }
        /**
         *    添加过滤条件
         *    @param filterStr:自定义过滤条件
         */
        public void filter(String filterStr){
            this.custom=this.custom+1;
            this.filterMap.put("CUSTOM"+this.custom, filterStr);
        }
        /**
         * 添加排序条件
         * @param type
         * @param colName
         */
        public void order(OrderTypes type, String colName){
            this.orderMap.put(colName, colName + " " + type.toString());
        }
        /**
         * 查询一列数据,以Map形式返回
         * @return
         */
        public Map<String, Object> executeQueryForMap(){
            String querySql = FilterUtil.getQuerySQL(this.tableName, this.filterMap, this.orderMap);
            Map<String, Object> resultMap = null;
            try {
                resultMap = this.session.executeQueryForMap(querySql);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SessionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return resultMap;
        }
        /**
         * 查询数据列表,list子集是以Map形式返回
         * @return
         */
        public List<Map<String, Object>> executeQueryForMapList(){
            String querySql = FilterUtil.getQuerySQL(this.tableName, this.filterMap, this.orderMap);
            List<Map<String, Object>> resultList = null;
            try {
                resultList = this.session.executeQueryForMapList(querySql);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SessionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return resultList;
        }
        /**
         * 查询数据列表,以Object形式返回
         * @param cls
         * @return
         */
        public Object executeQueryForObject(Class<?> cls){
            String querySql = FilterUtil.getQuerySQL(this.tableName, this.filterMap, this.orderMap);
            Object obj = null;
            try {
                obj = this.session.executeQueryForObject(querySql, cls);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SessionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return obj;
        }
        /**
         * 查询数据列表,list子集是以Object形式返回
         * @param cls
         * @return
         */
        public List<Object> executeQueryForList(Class<?> cls){
            String querySql = FilterUtil.getQuerySQL(this.tableName, this.filterMap, this.orderMap);
            List<Object> objList = null;
            try {
                objList = this.session.executeQueryForList(querySql, cls);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SessionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return objList;
        }
        /**
         * 执行存储过程
         * @param procName 存储过程名称
         * @param map 传递的参数列表, 如key:in; value: param
         * @return 执行结果
         */
        public Object executeProcessQueryForObject(String procName, Map<String, Object> map){
            Object result = null;
            try {
                result = this.session.executeProcessQueryForObject(procName, map);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SessionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return result;
        }
        /**
         * 执行存储过程
         * @param procName 存储过程名称
         * @param map 传递的参数列表, 如key:in; value: param
         * @return 执行结果
         */
        public Object[] executeProcessQueryForList(String procName, Map<String, Object> map){
            Object[] results = null;
            try {
                results = this.session.executeProcessQueryForList(procName, map);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SessionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return results;
        }
    }
    package com.qj.engine.sqlmap;
    
    import java.sql.SQLException;
    import java.util.Map;
    
    import com.qj.engine.session.Session;
    import com.qj.engine.session.SessionImpl;
    import com.qj.engine.session.exception.SessionException;
    import com.qj.engine.sqlmap.exception.SqlMappingException;
    import com.qj.engine.sqlmap.util.HandlerUtil;
    /**
     * 
     * @author QJ
     *
     */
    public class Handler {
        private String tableName="";
        private Session session = new SessionImpl();
        public Handler(String tableName) {
            this.tableName = tableName;
        }
        /**
         * 插入
         * @param pkRow
         * @param pkVal
         * @param valsMap
         * @return
         */
        public boolean insert(String pkRow, Object pkVal, Map<String, Object> valsMap){
            if(this.tableName.equals("")){
                try {
                    throw new SqlMappingException("表的名称没有设定");
                } catch (SqlMappingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            String insertSql = HandlerUtil.getDmlSql(HandlerTypes.INSERT,
                    this.tableName, pkRow, pkVal, valsMap);
            boolean result = false;
            try {
                result = session.insert(insertSql);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SessionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return result;
        }
        /**
         * 修改
         * @param pkRow
         * @param pkVal
         * @param valsMap
         * @return
         */
        public boolean update(String pkRow, Object pkVal, Map<String, Object> valsMap){
            if(this.tableName.equals("")){
                try {
                    throw new SqlMappingException("表的名称没有设定");
                } catch (SqlMappingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            String updateSql = HandlerUtil.getDmlSql(HandlerTypes.UPDATE,
                    this.tableName, pkRow, pkVal, valsMap);
            boolean result = false;
            try {
                result = session.insert(updateSql);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SessionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return result;
        }
        /**
         * 删除
         * @param pkRow
         * @param pkVal
         * @return
         */
        public boolean delete(String pkRow, Object pkVal){
            if(this.tableName.equals("")){
                try {
                    throw new SqlMappingException("表的名称没有设定");
                } catch (SqlMappingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            String deleteSql = HandlerUtil.getDmlSql(HandlerTypes.DELETE,
                    this.tableName, pkRow, pkVal, null);
            boolean result = false;
            try {
                result = session.insert(deleteSql);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SessionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return result;
        }
        /**
         * 自定义DML sql 
         * @param userDefinedSql
         * @return
         */
        public boolean userDefinedSql(String userDefinedSql){
            boolean result = false;
            try {
                result = session.insert(userDefinedSql);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SessionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return result;
        }
        /**
         * 执行存储过程
         * @param procName
         * @param map
         * @return
         */
        public boolean executeProcess(String procName, Map<String, Object> map){
            boolean result = false;
            try {
                result = this.session.executeProcess(procName, map);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SessionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return result;
        }
        
    }
  • 相关阅读:
    信息论
    学习抓包
    深入学习垃圾kafka
    share data
    【转载】计算图像相似度——《Python也可以》之一
    聊聊java list的使用特性
    log4j多线程以及分文件输出日志
    【转载】JDBC的连接参数的设置导致rowid自动添加到sql
    背包问题
    【转】【动态规划】01背包问题
  • 原文地址:https://www.cnblogs.com/GenghisKhan/p/3542506.html
Copyright © 2011-2022 走看看