• 封装LDAP 增删改查 方法


    封装LDAP的方法,让他可以已实体的方式来进行操作,思路类似于JPA 传入传出最好是实体,在实体里 使用map当作注解映射。
    推荐阅读:
    RedHat6下构建LDAP服务 http://www.linuxidc.com/Linux/2013-05/84741.htm
    Linux 使用pam_LDAP通过ad域认证 http://www.linuxidc.com/Linux/2012-09/71043.htm
    Zimbra故障——Unable to determine enabled services from LDAP http://www.linuxidc.com/Linux/2012-07/66869.htm
    下面 先上2个代码
    第一个封装一个baseDao;
    import java.util.HashMap; 
    import java.util.List; 
    import java.util.Map; 
    import javax.naming.Name; 
    import javax.naming.directory.SearchControls; 
    import org.apache.commons.lang.StringUtils; 
    import org.springframework.beans.factory.annotation.Autowired; 
    import org.springframework.ldap.control.PagedResultsCookie; 
    import org.springframework.ldap.control.PagedResultsDirContextProcessor; 
    import org.springframework.ldap.core.ContextMapper; 
    import org.springframework.ldap.core.DirContextAdapter; 
    import org.springframework.ldap.core.DirContextOperations; 
    import org.springframework.ldap.core.DistinguishedName; 
    import org.springframework.ldap.core.LdapTemplate; 
    import org.springframework.ldap.core.simple.ParameterizedContextMapper; 
    import org.springframework.ldap.filter.AndFilter; 
    import org.springframework.ldap.filter.EqualsFilter; 
    import org.springframework.ldap.filter.WhitespaceWildcardsFilter; 
    /** 
     * Dao基层 
     * @创建人 PengBo 
     * @创建时间 2013-7-7  下午7:03:49 
     */
    @SuppressWarnings("unchecked") 
    public class BaseDAO< T extends BaseModel> { 
        @Autowired 
        private LdapTemplate ldapTemplate; 
                                                                                                                                            
        /** 
        * 创建实体 
        * @param t 
        * @创建人 PengBo 
        * @创建时间 2013-7-7  下午6:53:40 
        */
        public void create(T t) { 
              DirContextAdapter context = new DirContextAdapter(buildDn(t)); 
              mapToContext(t.getMap(), context); 
              ldapTemplate.bind(context); 
          } 
        /** 
        * 更新实体 
        * @param t 
        * @创建人 PengBo 
        * @创建时间 2013-7-7  下午6:53:56 
        */
        public void update(T t) { 
              DirContextOperations context = ldapTemplate.lookupContext(buildDn(t)); 
              mapToContext(t.getMap(), context); 
              ldapTemplate.modifyAttributes(context); 
          } 
        /** 
        * 创建更新时使用的属性存储构造器 
        * @param map 
        * @param context 
        * @创建人 PengBo 
        * @创建时间 2013-7-7  下午6:54:16 
        */
        private void mapToContext(Map<String, String> map, DirContextOperations context) { 
                context.setAttributeValue("objectclass", "top"); 
            for(String mkey:map.keySet()){          //获得实体的属性和对应的值 加入属性构造器中 
                if(map.get(mkey) != null) 
                context.setAttributeValue(mkey, map.get(mkey)); 
            } 
        } 
        /** 
        * 删除属性 
        * @param t 
        * @创建人 PengBo 
        * @创建时间 2013-7-7  下午6:54:46 
        */
        public void delete(T t) { 
              ldapTemplate.unbind(buildDn(t)); 
        } 
        /** 
        * 根据唯一DN进行查找 
        * @param t 
        * @return 
        * @创建人 PengBo 
        * @创建时间 2013-7-7  下午6:55:02 
        */
        public T findByPrimaryKey(final T t) { 
            return (T) ldapTemplate.lookup(buildDn(t),  getContextMapper(t)); 
        } 
                                                                                                                                            
        /** 
        * 根据dn直接获取实体信息 
        * @param t 
        * @param dn 
        * @return 
        * @创建人 PengBo 
        * @创建时间 2013-7-29  下午4:39:59 
        */
        public T findByDN(final T t,String dn) { 
            return (T) ldapTemplate.lookup(dn,  getContextMapper(t)); 
        } 
        /** 
        * 根据实体条件精确查找进行查找 
        * @param t 
        * @return  返回查找的集合 
        * @创建人 PengBo 
        * @创建时间 2013-7-7  下午6:55:38 
        */
        public List<T> findByEqualFilter( final T t) { 
            return  ldapTemplate.search(buildDn(t), getEqualFilter(t).encode(), getContextMapper(t)); 
                                                                                                                                                    
        } 
                                                                                                                                            
        /** 
        * 根据实体条件进行查找 
        * @param t 
        * @return  返回查找的集合 
        * @创建人 PengBo 
        * @创建时间 2013-7-7  下午6:55:38 
        */
        public List<T> findByFilter( final T t) { 
            return  ldapTemplate.search(buildDn(t), getFilter(t).encode(), getContextMapper(t)); 
                                                                                                                                                    
        } 
                                                                                                                                                  
        /** 
        * 根据实体类型查找所有实体 
        * @param t 
        * @return  返回实体集合 
        * @创建人 PengBo 
        * @创建时间 2013-7-7  下午6:56:13 
        */
        public List<T> findAll(final T t) { 
            return  ldapTemplate.search(buildDn(t),  getObjectclass(t).encode(), getContextMapper(t)); 
                                                                                                                                              
        } 
        /** 
        * 根据实体的分页属性进行查获早分页信息  
        * @param basePage 
        * @return 
        * @创建人 PengBo 
        * @创建时间 2013-7-7  下午6:57:00 
        */
        public Page<T> getPages(Page<T> basePage,T t){ 
            int totalRow = findByFilter(t).size(); 
            basePage.setContent(getAllPageMap(null,t,(basePage.getPageSize()*basePage.getPage()))); 
            basePage.setTotalRow(totalRow); 
            basePage.setTotalPage((totalRow+basePage.getPageSize()-1)/basePage.getPageSize()); 
            return basePage; 
        } 
        /** 
        * 根据传入记录数查处所需要的信息 
        * @param cookie 
        * @param t 
        * @param pageSize 
        * @return 
        * @创建人 PengBo 
        * @创建时间 2013-7-10  上午9:23:46 
        */
        private List<T> getAllPageMap(PagedResultsCookie cookie,T t,Integer pageSize) { 
            PagedResultsDirContextProcessor  control = new PagedResultsDirContextProcessor (pageSize, cookie); 
            SearchControls searchControls = new SearchControls(); 
              searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
              List<T> mList = ldapTemplate.search(buildDn(t),  getFilter(t).encode(),searchControls, getContextMapper(t), control); 
              return mList; 
            } 
                                                                                                                                            
            /** 
            * 查找全部信息所需要的filter检索方法 
            * @param map 
            * @return 
            * @创建人 PengBo 
            * @创建时间 2013-7-7  下午6:59:38 
            */
            private AndFilter getObjectclass(T t){ 
                Map<String, String> map=t.getMap(); 
                AndFilter filter = new AndFilter(); 
                for(String mkey:map.keySet()){      //根据实体只获得他对应的objectclass的值 
                    if ("objectclass".equals(mkey)) { 
                        filter.and(new EqualsFilter(mkey, (String) map.get(mkey))); 
                    } 
                } 
            return filter; 
            } 
                                                                                                                                            
        /** 
        * 根据条件模糊查找的条件方法 
        * @param t 
        * @return 
        * @创建人 PengBo 
        * @创建时间 2013-7-7  下午7:00:10 
        */
          private AndFilter getFilter(T t) { 
                AndFilter filter = new AndFilter(); 
                Map<String, String> map=t.getMap(); 
                for(String mkey:map.keySet()){ 
                    if ("objectclass".equals(mkey)) { 
                        filter.and(new EqualsFilter(mkey, (String) map.get(mkey))); 
                    } 
                    if(StringUtils.isNotBlank(map.get(mkey)) && !"objectclass".equals(mkey)) 
                    filter.and(new WhitespaceWildcardsFilter(mkey, (String) map.get(mkey))); 
                } 
            return filter; 
            } 
          /** 
            * 根据条件精确查找的条件方法 
            * @param t 
            * @return 
            * @创建人 PengBo 
            * @创建时间 2013-7-8  下午3:10:43 
            */
          private AndFilter getEqualFilter(T t) { 
                AndFilter filter = new AndFilter(); 
                Map<String, String> map=t.getMap(); 
                for(String mkey:map.keySet()){ 
                    if ("objectclass".equals(mkey)) { 
                        filter.and(new EqualsFilter(mkey, (String) map.get(mkey))); 
                    } 
                    if(StringUtils.isNotBlank(map.get(mkey)) && !"objectclass".equals(mkey)) 
                    filter.and(new EqualsFilter(mkey, (String) map.get(mkey))); 
                } 
            return filter; 
            } 
            /** 
            * 构造查询实体UUID方法 
            * @param t 
            * @return 
            * @创建人 PengBo 
            * @创建时间 2013-7-7  下午7:00:49 
            */
          private Name buildDn(T t) { 
              String a = t.getDN(); 
                  DistinguishedName dn = new DistinguishedName(a); 
                      if(StringUtils.isNotBlank(t.getUuid())){ 
                          dn.add("uid", t.getUuid()); 
                      } 
                  return dn; 
              } 
                                                                                                                                              
          /** 
            * 构造查找组织的dn 
            * @param t 
            * @return 
            * @创建人 PengBo 
            * @创建时间 2013-7-16  上午9:45:57 
            */
          public String findDn(T t) { 
                Name dn= buildDn( t); 
                  return dn.toString(); 
              } 
        /** 
        * 查询获得实体属性构造器 
        * @param t 
        * @return 
        * @创建人 PengBo 
        * @创建时间 2013-7-7  下午7:01:12 
        */
          private ContextMapper getContextMapper(final T t) { 
                  return new ParameterizedContextMapper<T>() { 
                        @Override 
                        public T mapFromContext(Object ctx) { 
                            DirContextAdapter adapter = (DirContextAdapter) ctx; 
                            T newT=null; 
                            try { 
                                newT = (T) t.getClass().newInstance(); 
                            } catch (InstantiationException e) { 
                                e.printStackTrace(); 
                            } catch (IllegalAccessException e) { 
                                e.printStackTrace(); 
                            } 
                            Map<String, String> map= t.getMap(); 
                            Map<String, String> smap=new HashMap<String, String>(); 
                            for(String mkey:map.keySet()){ 
                                if (!"objectclass".equals(mkey)) { 
                                    if(!"userPassword".equals(mkey)){ 
                                        if (StringUtils.isNotBlank(adapter.getStringAttribute(mkey))) { 
                                            smap.put(mkey, adapter.getStringAttribute(mkey)); 
                                        }else { 
                                            smap.put(mkey, null); 
                                        } 
                                    } 
                                } 
                            } 
                            newT.setMap(smap); 
                            return newT; 
                        } 
                  }; 
              } 
    }
    第二个封装一个baseModel;
    import java.util.Map; 
    import com.smarcloud.control.util.Constant; 
    /** 
     * 实体基层 
     * @创建人 PengBo 
     * @创建时间 2013-7-7  下午7:04:09 
     */
    public class BaseModel extends UUIDEntity { 
        private static final long serialVersionUID = -3809593908380530384L; 
        /** 映射实体与LDAP属性*/
        private Map<String, String> map; 
                                                                                                                  
        /** 映射实体与LDAPDN*/
        protected String getDN() { 
            return Constant.BASE_DN; 
                                                                                                                      
        } 
        protected Map<String, String> getMap() { 
            return map; 
        } 
        protected void setMap(Map<String, String> map) { 
            this.map = map; 
        } 
                                                                                                                  
    }
    剩下的就就是集成关系了  实体集成baseModel  dao集成baseDao
    接下来再给出2个集成的实体和dao
    import java.util.HashMap; 
    import java.util.Map; 
    import org.apache.commons.lang.StringUtils; 
    import com.smarcloud.control.base.BaseModel; 
    import com.smarcloud.control.model.status.Status; 
    import com.smarcloud.control.model.status.DeviceType; 
    import com.smarcloud.control.util.Constant; 
    /** 
     * 设备对象 
     * @创建人 PengBo 
     * @创建时间 2013-7-2  上午10:17:06 
     */
    public class DeviceLDAP extends BaseModel{ 
        private static final long serialVersionUID = 3398977021142608598L; 
        /**设备ID    guid*/
        private String guid; 
        /**设备面膜  userPassword*/
        private String passWord; 
        /**设备名称<deviceType>_<GUID>_<roomNumber>  cn*/
        private String deviceName; 
        /** 状态 (注销、临时、正式 )  status*/
        private Status deviceStatus; 
        /**设备类型 deviceType*/
        private DeviceType deviceType; 
        /**设备所在房间      roomNumber*/
        private String roomId; 
        /**设备所在学校      o*/
        private String schoolCode; 
                                                          
                                                          
        public String getGuid() { 
            return guid; 
        } 
        public void setGuid(String guid) { 
            this.guid = guid; 
        } 
        public String getPassWord() { 
            return passWord; 
        } 
        public void setPassWord(String passWord) { 
            this.passWord = passWord; 
        } 
        public String getDeviceName() { 
            return deviceName; 
        } 
        public void setDeviceName(String deviceName) { 
            this.deviceName = deviceName; 
        } 
        public Status getDeviceStatus() { 
            return deviceStatus; 
        } 
        public void setDeviceStatus(Status deviceStatus) { 
            this.deviceStatus = deviceStatus; 
        } 
        public DeviceType getDeviceType() { 
            return deviceType; 
        } 
        public void setDeviceType(DeviceType deviceType) { 
            this.deviceType = deviceType; 
        } 
        public String getRoomId() { 
            return roomId; 
        } 
        public void setRoomId(String roomId) { 
            this.roomId = roomId; 
        } 
                                                          
        public String getSchoolCode() { 
            return schoolCode; 
        } 
        public void setSchoolCode(String schoolCode) { 
            this.schoolCode = schoolCode; 
        } 
        @Override 
        public Map<String, String> getMap() { 
            Map<String, String> map = new HashMap<String, String>(); 
            map.put("objectclass","smartDevice"); 
            map.put("uid", this.getUuid()); 
            map.put("guid", this.guid); 
            String newCn = null; 
            if(StringUtils.isNotBlank(this.guid)) 
            newCn =this.deviceType==null?null:this.deviceType.toString()+"_"+this.guid+"_"+this.roomId; 
            map.put("cn", newCn); 
            map.put("userPassword", this.passWord); 
            map.put("status", this.deviceStatus==null?null:this.deviceStatus.toString()); 
            map.put("deviceType", this.deviceType==null?null:this.deviceType.toString()); 
            map.put("roomNumber", this.roomId); 
            map.put("o", this.schoolCode); 
            return map; 
        } 
                                                          
        @Override 
        public void setMap(Map<String, String> map) { 
            for(String mkey:map.keySet()){ 
            switch(mkey) { 
                case "uid": 
                    this.setUuid(map.get(mkey)); 
                    break; 
                case "cn": 
                    this.setDeviceName(map.get(mkey)); 
                    break; 
                case "guid": 
                    this.setGuid(map.get(mkey)); 
                    break; 
                case "userPassword": 
                    this.setPassWord(map.get(mkey)); 
                    break; 
                case "roomNumber": 
                    this.setRoomId(map.get(mkey)); 
                    break; 
                case "o": 
                    this.setSchoolCode(map.get(mkey)); 
                    break; 
                case "status": 
                    if (StringUtils.isNotBlank(map.get(mkey))) { 
                        this.setDeviceStatus(Status.valueOf(map.get(mkey))); 
                    } 
                    break; 
                case "deviceType": 
                    if (StringUtils.isNotBlank(map.get(mkey))) { 
                        this.setDeviceType(DeviceType.valueOf(map.get(mkey))); 
                    } 
                    break; 
                } 
            } 
        } 
                                                          
        @Override 
        protected String getDN() { 
                    //自定义的组织dn 
            return Constant.DEVICE_BASE_DN; 
        }
    使用setmap 和getmap 来映射实体与ldap属性 ;
    import org.springframework.stereotype.Repository; 
    import com.smarcloud.control.base.BaseDAO; 
    import com.smarcloud.control.model.DeviceLDAP; 
    /** 
     * 设备Dao实现 
     * @创建人 PengBo 
     * @创建时间 2013-7-2  下午1:54:51 
     */
    @Repository 
    public class DeviceLDAPDao extends BaseDAO<DeviceLDAP> { 
    }
    这个DAO空的就可以了 
    接下来的使用 就跟大家使用JPA一样一样滴  把你的实体写好 放进去就可以了  不过你在新建时是不返回任何东西的 所以你可以自己去多写一个方法去获得创建好的实体。
    


  • 相关阅读:
    Vue父子组件传值$parent , ref,$refs,props大总结
    Vue-axios
    tensorflow2知识总结(杂)---1、安装tensorflow
    线性回归和逻辑回归的区别
    %matplotlib inline的含义
    王阳明的心学到底是啥
    Windows Anaconda 修改为国内源
    Reporting Services Single Sign On (SSO) Authentication
    .NET
    WebForms UnobtrusiveValidationMode requires a ScriptResourceMapping for 'jquery'. Please add a ScriptResourceMapping named jquery(case-sensitive)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318060.html
Copyright © 2020-2023  润新知