zoukankan      html  css  js  c++  java
  • orm映射 封装baseDao

    是用orm映射封装自己封装dao层

      思路:通过映射获得实体类的属性拼接sql语句

    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import club.itstu.MyUtil.DbUtil;
    import club.itstu.MyUtil.StringUtil;
    
    /**
     * orm基础封装类
     * BaseDao.java
     * @author Mr储
     * 2016-10-20 下午9:59:30
     */
    
    public class BaseDao<T> {
        private Class cls = null; //所操作是同类对应的Calss
        private String tableName = null; //数据库的表名
        private T t = (T) this; //当前对象
        public DbUtil db = DbUtil.getInstance();//获取数据库的连接
        
        public BaseDao(String tableName,Class cls){
            super();
            this.tableName = tableName;
            this.cls = cls;
        }
        /**
         * 保存对象(向数据库中增加数据)
         */
        public boolean save(){
            //通过映射获取实体类中的属性
            Field[] fields = cls.getDeclaredFields();//获取类所有属性
            //将要拼接的sql拆开
            StringBuffer sqlbf1 = new StringBuffer("insert into "+tableName+" (");//存列名
            StringBuilder sqlbf2 = new StringBuilder(" values (");
            for(Field f:fields){
                f.setAccessible(true);//私有属性设为可读
                sqlbf1.append(f.getName()+",");
                try {
                    if(f.get(t)==null||StringUtil.isEmpty(f.get(t)+"")){
                        sqlbf2.append("null,");
                    }else{
                        sqlbf2.append("'"+f.get(t)+"',");
                    }
                    
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                    return false;
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                    return false;
                }
            }
            
            String sql1 = sqlbf1.substring(0,sqlbf1.length()-1)+")";
            String sql2 = sqlbf2.substring(0,sqlbf2.length()-1)+")";
            db.insert(sql1+sql2);//执行sql
            return true;
            
            
        }
        
        /**
         * 查询单个对象(一条记录)
         * 
         */
        
        public T find(){
            //通过映射获得所有属性
            Field[] fields = cls.getDeclaredFields();
            //1=1  方便sql的拼接
            StringBuffer sqlsb = new StringBuffer("select * from "+tableName+" where 1=1");
            List<Object> params = new ArrayList<Object>();//存取属的值
            List<String> fieldNmaeList = new ArrayList<String>();//存取属性名
            //判读所有属性值是否为空
            boolean paramsFlag = true;
            for(Field f : fields){
                f.setAccessible(true);//将属性设为可读的
                fieldNmaeList.add(f.getName());//将属性名全部添加到容器中
                try {
                    //判断该属性的值是否为空  +""将任何类型转换为字符串
                    if(f.get(t)!=null&&StringUtil.isNotEmpty(f.get(t)+"")){
                        sqlsb.append(" and "+f.getName()+"=? ");//在sql上添加查询条件
                        params.add(f.get(t));//将该值添加到容器中
                        paramsFlag = false;//将属性值改为不全部为空
                    }
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
            if(paramsFlag){//属性值权为空  返回空的对象
                return t;
            }else{
                //部位空时从数据库中取出满足改条件的记录
                List<Map<String,Object>> rstList = db.query(sqlsb.toString(),params);
                if(!rstList.isEmpty()){
                    Map<String,Object> m = rstList.get(0);//取出该条数据
                    //遍历将该数据 并通过属性名将该记录刚给属性赋值
                    for(String fieldName : fieldNmaeList){
                        Object value = m.get(fieldName);
                        //通过映射给对象赋值
                        setValue(fieldName,value);
                    }
                }
            }
            //返回该对象
            return t;
        }
            
        /**
         * 查询多个对象
         */
        public List<T> findAll(){
            List<T> resTList = new ArrayList<T>();//用来存储多个结果集
            Field[] fields = cls.getDeclaredFields();//获取类所有属性
            StringBuffer sfSql = new StringBuffer("select * from "+tableName+" where 1=1");
            List<Object> params = new ArrayList<Object>();//存属性值
            List<String> fieldNameList = new ArrayList<String>();//存属性名
            for(Field f:fields){
                f.setAccessible(true);//私有属性设为可读
                fieldNameList.add(f.getName());
                try {
                    if(f.get(t)!=null){
                        sfSql.append(" and " +f.getName()+"=? ");
                        params.add(f.get(t));
                    }
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
            List<Map<String,Object>> resList = db.query(sfSql.toString(), params);
            try {
                if(!resList.isEmpty()){
                    //遍历多个结果集存入T类型的对象中
                    for(Map<String,Object> map:resList){
                        T tt = (T) cls.newInstance();
                        for(String fieldName:fieldNameList){
                            Object value = map.get(fieldName);
                            setValue(fieldName,value,tt);
                        }
                        resTList.add(tt);
                    }
                    
                }
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            return resTList;
        }
        /**
         * 实体对象属性赋值
         * @param name 属性名
         * @param value 属性值
         */
        private void setValue(String name,Object value){
            String setName = name.substring(0,1).toUpperCase()+name.substring(1);//将属性名的首字母大写
            String type = null;
            if(value!=null){
                type = value.getClass().getName();
                if(type.equalsIgnoreCase("java.sql.Timestamp")||type.equalsIgnoreCase("java.sql.Date")){
    //                type = "java.util.Date";
                    type= "java.lang.String";
                    value = value+"";
                }
            }
            
            try {
                if(value!=null){
                    Method method = cls.getDeclaredMethod("set"+setName, Class.forName(type));
                    method.invoke(t, value);
                }
                
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        /**
         * 实体对象属性赋值
         * @param name 属性名
         * @param value 属性值
         * @param obj 要赋值的对象
         */
        private void setValue(String name,Object value,T obj){
            String setName = name.substring(0,1).toUpperCase()+name.substring(1);//将属性名的首字母大写
            String type = null;
            if(value!=null){
                type = value.getClass().getName();
                if(type.equalsIgnoreCase("java.sql.Timestamp")||type.equalsIgnoreCase("java.sql.Date")){
                    //type = "java.util.Date";
                    value = value+"";
                    type = "java.lang.String";
                }
            }
            
            
            try {
                if(type!=null){
                    Method method = cls.getDeclaredMethod("set"+setName, Class.forName(type));
                    method.invoke(obj, value);
                }            
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        /**
         * 根据id 删除对象
         */
        public boolean deleteById(){
            Method method =null;
            Integer id = null;
                try {
                    method = cls.getDeclaredMethod("getId");
                    id = (Integer)method.invoke(t);
                    if(id==null){
                        throw new Exception("主键为空");
                    }else{
                        db.delete("delete from "+tableName+" where id=?",id);
                    }
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (SecurityException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            return true;
        }
        /**
         * 根据id更新
         */
        public boolean updateById(){
            //获取所有属性
            Field[] fields = cls.getDeclaredFields();
            //sql语句
            StringBuffer sqlsb = new StringBuffer("update "+tableName+" set ");
            
            Integer id = null;
            
            for(Field f : fields){
                f.setAccessible(true);//将属性设为可读的
                try {
                    //是“id”这个属性进入判断
                    if("id".equalsIgnoreCase(f.getName())){
                        //获得的对象为空更新失败
                        if(f.get(t)==null){
                            throw new Exception("主键id为空跟新失败");
                        }else{
                            //将该值赋给id
                            id = (Integer)f.get(t);
                        }
                    }else if(f.get(t)!=null){//对象不为空进入拼接sql语句
                        sqlsb.append(f.getName()+"='"+f.get(t)+"',");
                    }
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                    return false;
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                    return false;
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }
            String sql = sqlsb.toString();
            if(sql.endsWith(",")){//该字符串逗号结束 说明属性有值 去除逗号  拼接sql
                sql = sql.substring(0,sql.length()-1)+" where id="+id;
            }else{
                try {
                    throw new Exception("属性值为空,跟新失败");
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
            }
            db.update(sql);//执行
            return true;
        }
    }
  • 相关阅读:
    最大子数组问题:股票
    dfs小练 【dfs】
    java小知识点简单回顾
    cdoj841-休生伤杜景死惊开 (逆序数变形)【线段树 树状数组】
    二路归并排序算法
    优秀Python学习资源收集汇总(强烈推荐)
    怎么学习逆向工程?
    __cdecl 、__fastcall、__stdcall
    getchar()、putchar()、gets()、puts()、cin.get()、cin.getline()、getline()
    <cctype>库
  • 原文地址:https://www.cnblogs.com/cpstart/p/6085350.html
Copyright © 2011-2022 走看看