• DAO层基础设计原理


        在实际的开发中有一种项目的程序组织架构方案叫做MVC模式,按照程序 的功能将他们分成三个层,如下图

    Modle层(模型层)、View层(显示层)、Controller层(控制层)。

    Modle层:可以分两层,DAO层、service层,基文本功能 如下

    service层:主要去负责一些业务处理,比如取得连接、关闭数据库连接、事务回滚,一些复杂的逻辑业务处理就放到service层

    DAO层:负责访问数据库进行数据的操作,取得结果集,之后将结果集中的数据取出封装到VO类对象之后返回给service层

    Cotroller层:叫做控制层,主要的功能是处理用户发送的请求。

    View层:叫做显示层,主要是负责现实数据。

    在实际开发中dao层要先定义出自己的操作标准即标准接口,就是为了解耦合。

    Modle层(DAO层和service层)的设计如下。

    //BasDaoUtil.java代码,共7个方法
    package com.sxt.mvcpro.dao.impl;
    import java.lang.reflect.Field;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    public class BaseDAOUtil {
        private static PreparedStatement pst;
        private static ResultSet rst;
        /**
         * 
         * @param conn 
         * @param sql
         * @param clz
         * @param vo
         * @return
         * @throws Exception
         */
        public <T> int save(Connection conn, String sql, Class<T> clz, T vo) throws Exception {
            //取得预编译对象
            pst = conn.prepareStatement(sql);
            // 为sql设置占位符内容(insert into 表(字段1,字段2,字段3,字段4)VALUES(?,?,?,?))
            String[] coulums = sql.split("\(")[1].split("\)")[0].split(",");
            for (int i = 0; i < coulums.length; i++) {
                Field f = vo.getClass().getDeclaredField(coulums[i]);
                // 取消私有封装访问限制
                f.setAccessible(true);
                //取得字段对应的属性的值
                Object fvalue = f.get(vo);
                pst.setObject(i + 1, fvalue);
            }
            return pst.executeUpdate();
        }
        /**
         * 
         * @param conn
         * @param sql
         * @param vo
         * @return
         * @throws Exception
         */
        public <T> int edit(Connection conn,String sql,T vo) throws Exception{
            // update emp SET sal=?,job=?,comm=? WHERE empno=? AND  ...  ;
            //取得预编译对象
            pst=conn.prepareStatement(sql);
            String[] strs = sql.split("SET")[1].split("WHERE")[0].split(",");
            int i=0;
            for(i=0;i<strs.length;i++) {
                //取得要修改的字段名称
                String column=strs[i].split("=")[0];
                //通过反射取得column对应在vo中的属性对象(就是拿vo的变量,比如ename)
                Field f = vo.getClass().getDeclaredField(column.trim());
                // 取消私有封装访问限制
                f.setAccessible(true);
                //取得该字段在vo对象中的值
                Object fvalue=f.get(vo);
                //为占位符设置具体的内容
                pst.setObject(i+1, fvalue);
            }
            String coditions = sql.split("WHERE")[1].split("=")[0];
            Field f = vo.getClass().getDeclaredField(coditions.trim());
            f.setAccessible(true);
            Object fvalue=f.get(vo);
            pst.setObject(i+1, fvalue);
            return pst.executeUpdate();
        }
        /**
         * 
         * @param conn
         * @param sql
         * @param id
         * @return
         * @throws Exception
         */
        public  int  removeById(Connection conn,String sql,Object id) throws Exception{
            //取得预编译对象
            pst=conn.prepareStatement(sql);
            pst.setObject(1, id);
            return pst.executeUpdate();
        }
        /**
         * 
         * @param conn
         * @param sql
         * @param ids
         * @return
         * @throws Exception
         */
        public  int removeBatch(Connection conn,StringBuffer sql,List<Object> ids) throws Exception{
            Iterator<Object> iter=ids.iterator();
            while (iter.hasNext()) {
                sql.append(iter.next()+",");
            }
            sql.delete(sql.length()-1, sql.length());
            sql.append(")");
            pst=conn.prepareStatement(sql.toString());
            return pst.executeUpdate();
        }
        /**
         * 
         * @param conn
         * @param sql
         * @param clz
         * @param id
         * @return
         * @throws Exception
         */
        public <T> T selectOne(Connection conn,String sql,Class<T> clz,Object id) throws Exception{
            //取得预编译对象
            pst=conn.prepareStatement(sql);
            pst.setObject(1, id);
            //执行sql语句
            rst=pst.executeQuery();
            T t=null;
            if (rst.next()) {
                t=clz.newInstance();
                //取得所有属性
                Field[] fs = clz.getDeclaredFields();
                for (Field f : fs) {
                    //为属性取消私有封装
                    f.setAccessible(true);
                    //取得属性名
                    String fname=f.getName();
                    //使用该属性名称从结果集中取得数据
                    Object fvalue=rst.getObject(fname);
                    //将取得的值保存t对象的属性
                    f.set(t, fvalue);
                }
                return t;
            }
            return null;
        }
        /**
         * 
         * @param conn
         * @param sql
         * @param clz
         * @param params
         * @return
         * @throws Exception
         */
        public <T> List<T> selectList(Connection conn,String sql,Class<T> clz,Object...params) throws Exception{
            List<T> list= new ArrayList<T>();
            pst=conn.prepareStatement(sql);
            for(int i=0;i<params.length;i++) {
                pst.setObject(i+1, params[i]);
            }
            //执行sql语句
            rst=pst.executeQuery();
            T t=null;
            while (rst.next()) {
                t=clz.newInstance();
                //取得所属性
                Field[] fs = clz.getDeclaredFields();
                for (Field f : fs) {
                    //为属性取消私有封装
                    f.setAccessible(true);
                    //取得属性名
                    String fname = f.getName();
                    //使用该属性名称从结果集中取得数据
                    Object fvalue=rst.getObject(fname);
                    //将取得的值保存给t对象的属性
                    f.set(t, fvalue);
                }
                list.add(t);
            }
            return list;
        }
        /**
         * 
         * @param conn
         * @param sql
         * @param params
         * @return
         * @throws Exception
         */
        public int selectCount(Connection conn,String sql,Object...params) throws Exception{
            pst=conn.prepareStatement(sql);
            for(int i=0;i<params.length;i++) {
                pst.setObject(i+1, params[i]);
            }
            //执行sql语句
            rst=pst.executeQuery();
            rst.next();//让指针往下移动
            return rst.getInt(1);
        }
    }
  • 相关阅读:
    Android Static分析
    hdoj 1285 确定比赛名次 【拓扑排序】
    Sqoop2安装记录
    Activiti源代码分析
    SpringBoard 无法启动应用程序(错误:-3)
    关于public、private、protected、internal
    Java基础——Statement与PrepareStatement
    无password身份验证:安全、简单且部署高速
    说说Linux文件权限那些事儿
    Android中Service概述
  • 原文地址:https://www.cnblogs.com/whymoney1000/p/10723428.html
Copyright © 2020-2023  润新知