面试准备--持久层框架

      在说到持久层框架,耳熟能详的有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;

    }

    

}

 

 

你可能感兴趣的:(持久层)