`
raywithu
  • 浏览: 24732 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

连接LDAP数据库CRUD,包括分页查询的持久层代码

    博客分类:
  • LDAP
 
阅读更多
连接LDAP数据库CRUD,包括分页查询的持久层代码

package com.scnu.ytxt.persistence.sqlmapdao.user;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;

import org.springframework.ldap.AttributesMapper;
import org.springframework.ldap.CollectingNameClassPairCallbackHandler;
import org.springframework.ldap.LdapTemplate;
import org.springframework.ldap.support.DistinguishedName;
import org.springframework.ldap.support.control.PagedResultsRequestControl;
import org.springframework.ldap.support.filter.AndFilter;
import org.springframework.ldap.support.filter.EqualsFilter;

import com.scnu.ytxt.attribute.AttributeBuilder;
import com.scnu.ytxt.attribute.AttributeFather;
import com.scnu.ytxt.attribute.AttributeMapper;
import com.scnu.ytxt.persistence.iface.user.UserManageDao;

/**
 * 用户管理DaoImpl
 * 
 * @author Ray
 */
public class UserManageDaoImpl implements UserManageDao {
	private LdapTemplate ldapTemplate;
	/** objectClass类型 */
	private static final String OBJECT_NAME = "user";
	/** 节点名 */
	private static final String BASE = "ou=user";
	/** 所需要的类名称 */
	private static final String ENTITY_CLASSNAME
						= "com.scnu.ytxt.persistence.sqlmapdao.user.UserForLDAP";
	/** 主键 */
	private static final String PRIMARY_KEY = "userUid";
	/** 最大页数 */
	private static final int MAX_PAGE = 10000;
	
	AttributeFather father = null;

	AttributeBuilder builder = null;
	
	AttributeMapper mapper = null;
	
	public void setLdapTemplate(LdapTemplate ldapTemplate)
	{
		this.ldapTemplate = ldapTemplate;
	}

	/** 构造函数 */
	public UserManageDaoImpl()
	{
		father = new AttributeFather(ENTITY_CLASSNAME);
		
		builder = new AttributeBuilder();
		
		mapper = new AttributeMapper();
	}

	/** 创建条目对应的DN */
	public DistinguishedName getDN(Object parameterObject, String primaryKey,
			String ouBase)
	{
		UserForLDAP userForLDAP = (UserForLDAP) parameterObject;

		// 设置在ou=user下查找对象
		DistinguishedName newContactDN = new DistinguishedName(ouBase);

		// 设置需要删除的条目的DN
		newContactDN.add(primaryKey, userForLDAP.getUserUid());

		return newContactDN;
	}

	/** 添加 */
	public int addUser(final Object parameterObject)
	{
		try
		{
			// 获取用户传来的属性集
			Attributes attri = builder.getUserAttrs(parameterObject,
					OBJECT_NAME);

			DistinguishedName newContactDN = getDN(parameterObject,
					PRIMARY_KEY, BASE);
			// 把新条目绑定到LDAP
			ldapTemplate.bind(newContactDN, null, attri);
			// 参数说明("userUid=liling,ou=user" , null(绑定对象) , 要添加的字段集)

			return 1;

		}
		catch (Exception e)
		{
			System.out.println("异常:" + e);
			return 0;
		}
	}

	/** 删除 */
	public int delUser(final Object parameterObject)
	{
		DistinguishedName newContactDN
				= getDN(parameterObject, PRIMARY_KEY,BASE);
		try
		{

			// 进行删除,其中true表示同时删除其孩子结点
			ldapTemplate.unbind(newContactDN, true);

			return 1;
			
		}
		catch (Exception e)
		{
			return 0;
		}
	}

	/** 修改 */
	public int updateUserInfo(final Object parameterObject, String updateType)
	{
		// 获取用户传来的属性集
		Attributes attri = builder.getUserAttrs(parameterObject,
				OBJECT_NAME);

		DistinguishedName newContactDN = getDN(parameterObject, PRIMARY_KEY,
				BASE);
		try
		{
			ldapTemplate.rebind(newContactDN, null, attri);
			// 参数说明("userUid=liling,ou=user" , null , 要添加的字段值)
			return 1;
		}
		catch (Exception e)
		{
			return 0;
		}
	}

	/** 查询 */
	public List getUserInfo(final Object parameterObject, int curPage,
			int pageSize)
	{
		// 用于存储条目列表
		List list = new ArrayList();
		long starTime = System.currentTimeMillis();

		// 设置filter
		String filter = "objectclass=" + OBJECT_NAME;

		// 声明搜索控件
		SearchControls searchControls = new SearchControls();

		// 指定检索范围
		searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
		/*
		 * 0:OBJECT_SCOPE,搜索指定的命名对象。 
		 * 1:ONELEVEL_SCOPE,只搜索指定命名对象的一个级别,这是缺省值。
		 * 2:SUBTREE_SCOPE,搜索以指定命名对象为根结点的整棵树
		 */
		
		// 声明属性名集合,并由Map类型转换为String类型数组
		Map attriMap = father.getAttriName();
		String returnedAtts[] = new String[attriMap.size()];
		
		for (int i = 0, size = attriMap.size(); i < size; i++)
		{
			returnedAtts[i] = (String) (attriMap.get(i));
		}
		// 设置要返回的属性,即所有
		searchControls.setReturningAttributes(returnedAtts);

		// 设置handler,handler里存储了条目的list
		CollectingNameClassPairCallbackHandler handler
				= ldapTemplate.new AttributesMapperCallbackHandler(mapper);

		// 设置页面大小
		PagedResultsRequestControl requestControl
				= new PagedResultsRequestControl(pageSize);

		// 分为两种情况,第一种只取第一页,第二种取其他页数
		if (curPage == 1)
		{
			try
			{
				// 只获取第一页
				ldapTemplate.search(BASE, filter, searchControls, handler,
						requestControl);
				list = handler.getList();
			}
			catch (Exception e)
			{
				System.out.println("分页查询异常1" + e);
			}
		}
		else
		{
			try
			{
				// 按分页搜索,并将结果存进handler,这里获取第一页
				ldapTemplate.search(BASE, filter, searchControls, handler,
						requestControl);

				// 循环获取其余的页数,直至目标页
				for (int i = 0, cur_1 = curPage - 1, cur_2 = curPage - 2; i < cur_1; i++)
				{
					// 声明临时变量handlerTemp。用于每次存储该次搜索的页面信息
					CollectingNameClassPairCallbackHandler handlerTemp
							= ldapTemplate.new AttributesMapperCallbackHandler(mapper);

					// 设置页面大小
					requestControl = new PagedResultsRequestControl(pageSize,
							requestControl.getCookie());

					// 在上次查询的基础上继续往后查询
					ldapTemplate.search(BASE, filter, searchControls,
							handlerTemp, requestControl);

					// 检测为当前页,获取当前页的条目列表
					if (i == cur_2)
						list = handlerTemp.getList();
				}
				long endTime = System.currentTimeMillis();
				System.out.println("查询所用时间:" + (endTime - starTime));
			}
			catch (Exception e)
			{
				System.out.println("分页查询异常2" + e);
			}
		}
		return list;
	}

	/** 查询表的行数 */
	public int getUserTotal(final Object parameterObject) {
		long starTime = System.currentTimeMillis();
		
		// 条目列表
		List list = null;
		// 设置filter
		String filter = "objectclass=" + OBJECT_NAME;

		// 声明搜索控件
		SearchControls searchControls = new SearchControls();

		// 指定检索范围
		searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
		// 0:OBJECT_SCOPE,搜索指定命名的对象。1:ONELEVEL_SCOPE,只搜索指定命名对象的一个级别,这是缺省值。2:SUBTREE_SCOPE,搜索指定命名对象的子树,包括指定的命名对象

		// 声明属性名集合,并转换为String数组

		// 不返回属性对
		searchControls.setReturningAttributes(null);

		// 设置handler,handler里存储了条目的list
		CollectingNameClassPairCallbackHandler handler
				= ldapTemplate.new AttributesMapperCallbackHandler(mapper);

		// 设置页面大小
		PagedResultsRequestControl requestControl
				= new PagedResultsRequestControl(MAX_PAGE);

		try
		{
			// 只获取第一页
			ldapTemplate.search(BASE, filter, searchControls, handler,
					requestControl);
			list = handler.getList();
			long endTime = System.currentTimeMillis();
			System.out.println("获得记录数所用时间:" + (endTime - starTime));
		}
		catch (Exception e)
		{
			System.out.println("分页查询异常1" + e);
		}

		return list.size();
	}

	/** 查询指定记录 */
	public Object getUserInfoById(final Object parameterObject) {
		
		// 条目列表
		List list = null;
		try
		{
			UserForLDAP userForLDAP = (UserForLDAP) parameterObject;

			// 过滤器
			AndFilter andFilter = new AndFilter();
			andFilter.and(new EqualsFilter("objectclass", OBJECT_NAME));

			// 添加userUid的过滤器设置
			if (userForLDAP.getUserUid() != "")
				andFilter.and(new EqualsFilter(PRIMARY_KEY, userForLDAP.getUserUid()));
			else
				return null;

			// 进行检索
			list = ldapTemplate.search(BASE, andFilter.encode(),mapper);
		}
		catch (Exception e)
		{
			System.out.println("查询指定记录异常" + e);
		}
		return list;
	}
}
分享到:
评论
4 楼 天草二十 2012-11-07  
newsletterBroker 写道
CollectingNameClassPairCallbackHandler handlerTemp 
                            = ldapTemplate.new AttributesMapperCallbackHandler(mapper); 

这句话会报错,不知道为什么


把dapTemplate.去掉就可以了,我实现了,可以给你源码~!
3 楼 javams 2011-12-07  
你好,你有没有用纯java实现对LDAP分页查询的代码呢?因为我们系统中没有用到spring,谢谢了
2 楼 javams 2011-12-07  
你好,我是最近才开始接触LDAP的,实在是不明白这个分页的原理。你可以把你分页的源码给我吗?谢谢了,我的QQ:573696448.如果不愿意,也不强求,还是谢谢你了
1 楼 newsletterBroker 2011-09-18  
CollectingNameClassPairCallbackHandler handlerTemp 
                            = ldapTemplate.new AttributesMapperCallbackHandler(mapper); 

这句话会报错,不知道为什么

相关推荐

    Ldap 分页问题

    压缩包中的`LdapDemo`可能是示例代码或测试用例,通常会包含如何设置分页控制项、执行查询、处理返回结果以及管理分页Cookie的代码片段。通过分析这些代码,我们可以深入理解在实际开发中如何解决LDAP分页问题。 总...

    用perl操作LDAP数据库

    在IT领域,LDAP(Lightweight Directory Access ...实践中,结合具体的业务需求和LDAP目录结构,调整代码以满足特定场景的需求。阅读和理解Net::LDAP模块的文档以及相关的Perl LDAP教程,将有助于进一步提升你的技能。

    jdbc连接 ldap jar 包

    使用这些jar包,开发者可以像操作数据库一样对LDAP目录进行操作,包括查询、插入、更新和删除数据。例如,你可以编写Java代码,创建一个JDBC连接,然后执行SQL-like的查询来查找 LDAP 目录中的用户信息。这对于那些...

    基于关系数据库的LDAP证书查询服务器的实现

    ### 基于关系数据库的LDAP证书查询服务器的实现 #### 概述 随着网络通信技术的迅速发展,网络安全已成为互联网应用中不可忽视的关键因素。公钥基础设施(Public Key Infrastructure, PKI)作为保障网络通信安全的...

    java连接和验证ldap文档

    Java 连接和验证 LDAP 文档 Java 连接和验证 LDAP 文档是一份关于 Java 语言连接和验证 LDAP 服务器的学习文档。LDAP(Lightweight Directory Access Protocol)是一种目录访问协议,用于管理和访问目录服务中的...

    使用Delphi连接LDAP服务器

    `TADOConnection`和`TADODataset`等组件是Delphi与数据库交互的基础,但它们并不直接支持LDAP。因此,通常会使用第三方组件如`ldap4delphi`或`Indy`库中的`TIdLDAP`来实现LDAP连接。 在Delphi中连接到LDAP服务器,...

    LDAP搭建及其Java代码连接

    **LDAP搭建及其Java代码连接** LDAP(Lightweight Directory Access Protocol)是一种轻量级目录访问协议,主要用于存储和检索用户信息、组织结构等元数据。它采用层次化的树状结构,便于管理和查找。在IT领域,...

    LDAP编辑器:可以连接LDAP和编辑LDAP数据

    1. **连接 LDAP 服务器**:LDAP 编辑器能够连接到各种 LDAP 服务器,包括但不限于 OpenLDAP、Active Directory、Novell eDirectory 等。它支持多种认证方式,如简单认证、Kerberos、证书等,确保安全的连接。 2. **...

    django-ldapdb, Django ldapdb,用于 Django的LDAP数据库后端.zip

    django-ldapdb, Django ldapdb,用于 Django的LDAP数据库后端 django-ldapdb django-ldapdb 是用于 Django的LDAP数据库后端,允许通过 Django 模型操作LDAP条目。它支持大多数与 Django 模型相同的api:MyModel.o

    java连接ldap所需jar包

    1. **JNDI(Java Naming and Directory Interface)**:Java连接LDAP的基础是JNDI,它为Java应用程序提供了一个统一的接口来访问不同的命名和目录服务,包括LDAP。JNDI允许开发者以一致的方式查找、绑定、更新和管理...

    java连接LDAP的jar包和实例

    这个主题涉及几个关键知识点,包括Java LDAP API、SSL安全连接以及如何通过代码操作LDAP目录。 首先,LDAP是一个开放标准的协议,用于存储和检索用户、组、计算机等对象的数据。这些数据通常分布在多台服务器上,...

    Spring Boot 连接LDAP的方法

    Spring Boot 连接LDAP是实现LDAP增删改查操作的重要方法,本文将详细介绍Spring Boot 连接LDAP的方法,包括使用ODM快速实现LDAP增删改查操作、配置Spring LDAP连接信息、创建实体类作为LDAP中的entry映射等。...

    什么是LDAP连接工具?如何利用好它.docx

    **LDAP 连接工具详解与应用** LDAP(Lightweight Directory Access Protocol)是一种网络协议,用于在互联网上查询和管理分布式目录服务。它提供了一种高效、简洁的方式,使得用户能够检索和更新存储在目录服务器中...

    有关ldap包的下载和oracle连接数据库oracle9i的包

    在编写代码时,可以使用JDBC的`DriverManager.getConnection()`方法来建立与Oracle数据库的连接,而使用Oracle LDAP客户端库则需要调用相应的API来执行LDAP操作。 总结来说,这个压缩包提供的是连接Oracle 9i数据库...

    java 连接ldap 服务器源码

    总的来说,Java通过JNDI连接到LDAP服务器涉及以下几个关键步骤:初始化上下文、配置连接属性、建立连接、执行查询和操作目录对象,以及关闭连接。这些步骤在提供的源代码中可能会有所体现,通过分析这些类文件,可以...

    Open_LDAP安装配置

    Open LDAP基于Berkeley DB作为其后端数据库,提供了一个标准的LDAP接口,用于查询和修改目录信息。它支持多种认证机制,包括简单的明文密码、SSL/TLS加密以及更复杂的认证方式,如Kerberos。 **二、Open LDAP的安装...

    AD域分页查询全部域用户数据

    这两种方法都可以实现分页查询,但JNDI更常见于轻量级应用,而JDBC-AD适合于需要数据库样式的查询操作。 在描述中提到的`ADConnectTest.java`文件可能是一个示例代码,用于演示如何通过编程方式执行AD分页查询。...

    LdapBrowser ldap连接工具

    LdapBrowser是一款专为开放源代码的OpenLDAP设计的连接工具,帮助管理员便捷地浏览、编辑和管理LDAP目录。 **一、LdapBrowser的功能特性** 1. **图形化界面**:LdapBrowser提供了直观的图形用户界面,使得非技术...

    非常好用的ldap连接工具

    **LDAP(Lightweight Directory Access Protocol)连接工具是用于管理和访问 LDAP 目录服务的重要软件,它使得用户可以方便地查询、编辑和管理存储在 LDAP 服务器中的数据。ApacheDirectoryStudio 是一个开源、跨...

Global site tag (gtag.js) - Google Analytics