`
酷的飞上天空
  • 浏览: 521887 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

DAO层的代码介绍

阅读更多

DAO层的作用不多说了,大家都知道

说下我的DAO层结构

BaseDao<T> 泛型类,模板类的基类

BaseDaoImpl<T> 泛型模板类

ResultHandle<T>  一个接口, 负责对结果集进行解析。

AbstractResultHandle<T> 抽象类,把公用的提取出来

 

BaseDao

public interface BaseDao<T> {
	/**
	 * 查询单条记录的sql语句,如返回多条则只取第一条记录,没有记录返回null
	 */
	public T executeQueryForEntity(String sql,Integer identity);
	/**
	 * 一些不需要返回值的非query语句
	 */
	public void executeUpdate(String sql,Object... params);
	/**
	 * 查询只返回一个整数值的sql,没有则返回0
	 */

	public Integer executeQueryForInteger(String sql,Object... params);
	/**
	 * 返回插入数据的自增ID
	 */
	public Integer executeInsertForInteger(String sql,Object... params);
	/**
	 * 返回一个查询的列表,没有数据则返回空的list
	 */
	public List<T> executeQueryForListEntity(String sql,Object... params);
	
}

 

BaseDaoImpl

public class BaseDaoImpl<T> implements BaseDao<T>{

	//从filter中获得连接,最后又filter进行释放,见BlogFilter
	Connection conn = BlogFilter.getConnection();
	
	ResultHandle<T> handle;
	//通过构造方法传入相应的结果集解析实现
	public BaseDaoImpl(ResultHandle<T> handle){
		this.handle=handle;
	}

	//第一个参数为sql语句,第二个为参数数组,和sql中?位置对应
	@Override
	public void executeUpdate(String sql,Object... params){
		try {
			PreparedStatement pstat = conn.prepareStatement(sql);
			for(int i=1;i<=params.length;i++)
				pstat.setObject(i, params[i-1]);
			pstat.executeUpdate();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	@Override
	public T executeQueryForEntity(String sql, Integer identity) {
		try {
			PreparedStatement pstat = conn.prepareStatement(sql);
			pstat.setObject(1,identity);
			ResultSet res = pstat.executeQuery();
			//调用恰当的方法,用解析器进行解析
			return handle.getBean(res);
		} catch (SQLException e) {
			throw new RuntimeException(e);	
		} 
	}
	@Override
	public Integer executeQueryForInteger(String sql, Object... params) {
		try {
			PreparedStatement pstat = conn.prepareStatement(sql);
			for(int i=1;i<=params.length;i++)
				pstat.setObject(i, params[i-1]);
			ResultSet res = pstat.executeQuery();
			//如果查询的结果集为空,则返回0。貌似没有为空的
			if(!res.next()) return 0; 
			return res.getInt(1);
		} catch (SQLException e) {
			throw new RuntimeException(e);				
		}
	}
	@Override
	public Integer executeInsertForInteger(String sql, Object... params) {
		try {
			PreparedStatement pstat = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
			for(int i=1;i<=params.length;i++)
				pstat.setObject(i, params[i-1]);
			pstat.executeUpdate();
			//取得插入数据后包含,主键值的结果集
			ResultSet res = pstat.getGeneratedKeys();
			res.next();
			return res.getInt(1);
		} catch (SQLException e) {
			throw new RuntimeException(e);				
		}
	}
	@Override
	public List<T> executeQueryForListEntity(String sql, Object... params) {
		try {
			PreparedStatement pstat = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
			for(int i=1;i<=params.length;i++)
				pstat.setObject(i, params[i-1]);
			ResultSet res = pstat.executeQuery();
			return handle.getBeanList(res);
		} catch (SQLException e) {
			throw new RuntimeException(e);				
		}
	}
	/**
	 * 后增加的,多处用到,所有提起到了模板类里面
	 * @param sql  一个sql语句,不含参数。如:select count(*) from table; 用于取得可计算的结果总数
	 * @param pageSize  每页的现实数
	 * @return 最少返回1
	 */
	public Integer getMaxPageNum(String sql,Integer pageSize) {
		Integer total = executeQueryForInteger(sql, new Object[]{});
		if(total==0) return 1;
		//计算一共有多少页
		int maxNum = total/pageSize;
		//不足一页,则返回1
		if(total%pageSize!=0) maxNum+=1;
		return maxNum;
	}
}

 

具体使用以评论表为例子

CommentDao

public interface CommentDao {

	public void addComment(Comment comment);
	public void deleteComment(Integer commentId);
	public List<Comment> getListComment(Integer articleId);
	public Integer getNumOfCommentForArticle(Integer articleId);
	public List<Comment> getLaterCommentList(Integer size);
}

CommentDaoImpl

public class CommentDaoImpl extends BaseDaoImpl<Comment> implements CommentDao {

	public CommentDaoImpl( ) {
		super(new CommentResultHandle());
	}

	@Override
	public void addComment(Comment comment) {
		String sql = "insert into comment(comment_body,comment_date,comment_name,comment_image,article_id) values(?,?,?,?,?)";
		Object []params = {comment.getCommentBody(),comment.getCommentDate(),
							comment.getCommentName(),comment.getCommentImage(),comment.getArticleId()};
		Integer id = super.executeInsertForInteger(sql, params);
		comment.setCommentId(id);
	}

	@Override
	public void deleteComment(Integer commentId) {
		String sql = "delete from comment where comment_id = ?";
		super.executeUpdate(sql, commentId);
	}

	@Override
	public List<Comment> getListComment(Integer articleId) {
		String sql = "select * from comment where article_id = ?";
		return super.executeQueryForListEntity(sql, articleId);
	}

	@Override
	public Integer getNumOfCommentForArticle(Integer articleId) {
		String sql = "select count(*) from comment where article_id = ?";
		return super.executeQueryForInteger(sql, articleId);
	}

	@Override
	public List<Comment> getLaterCommentList(Integer size) {
		String sql = "select * from comment order by comment_date desc limit ?";
		return super.executeQueryForListEntity(sql, size);
	}

}

 下面贴出结果集解析的代码

ResultHandle<T>

public interface ResultHandle<T> {

	public T getBean(ResultSet res);
	public List<T> getBeanList(ResultSet res);
}

 

AbstractResultHandle

public abstract class AbstractResultHandle<T> implements ResultHandle<T> {


	/**
	 * 为了提高代码的再利用所以,把getBeanList方法提取到了这个抽象类中
	 */
	@Override
	public List<T> getBeanList(ResultSet res) {
		try {
			//如果不存在任何数据则返回空的list
			if(!res.first()){
				return Collections.emptyList();
			}
			//将当前游标移动到第一行之上
			res.previous();
		} catch (SQLException e) {
			throw new RuntimeException(e);			
		}
		List<T> list = new ArrayList<T>();
		//将每行数据封装成实体对象并添加到list,c为null时表示所给全部记录封装完毕
		T c = getBean(res);
		while(c!=null){
			list.add(c);
			c = getBean(res);
		}
		return list;
	}

}

 CommentResultHandle

public class CommentResultHandle extends AbstractResultHandle<Comment> {

	@Override
	public Comment getBean(ResultSet res) {
		try {
			if(res.next()){
				Comment c = new Comment();
				c.setArticleId(res.getInt("article_id"));
				c.setCommentBody(res.getString("comment_body"));
				c.setCommentDate(new Date(res.getTimestamp("comment_date").getTime()));
				c.setCommentId(res.getInt("comment_id"));
				c.setCommentImage(res.getString("comment_image"));
				c.setCommentName(res.getString("comment_name"));
				return c;
			}else return null;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

 虽然比价简陋,都还能凑合着用。一旦表的数量太多,那恐怕就成负担了。

分享到:
评论

相关推荐

    图书管理系统DAO层代码

    DAO层主要用于处理数据存储和检索,它隔离了业务逻辑层与数据库交互的细节,使得代码更加灵活和可维护。本项目是关于一个图书管理系统的DAO层实现,适合初学者理解和学习。 首先,"图书管理系统"是一个常见的应用...

    经典泛型dao层代码,非常好用简易

    通过上述分析,我们可以看出,合理设计和运用泛型DAO层,不仅可以显著提高代码的复用性和维护性,还能极大地简化复杂的数据库操作,使得开发人员能够更加专注于业务逻辑的实现。因此,对于那些追求高质量、高效率的...

    泛型通用DAO,可以很简化DAO层的代码

    泛型通用DAO是这种模式的一种优化,它利用了Java 5.0引入的泛型和反射机制,大大简化了DAO层的编码工作,提高了代码的可复用性和可维护性。 泛型是Java中的一种类型系统扩展,它允许在编译时声明参数化的类型,从而...

    自动生成MVC中的Service层、Dao层及Model层代码

    通过自动生成Dao层代码,我们可以快速得到数据库操作的模板,如查询、插入、更新和删除等方法。 Model层,也称为实体层,它代表了数据库中的表或集合对象。Model类通常包含与数据库表字段相对应的属性,并提供...

    Service层和DAO层解析

    Service层和DAO层是软件开发中常见的两种设计模式,主要用于分离业务逻辑和数据访问操作。在Java Web开发中,它们通常被应用于三层架构或MVC(Model-View-Controller)模型中。 DAO(Data Access Object)层是负责...

    java 实体类和Dao层代码生成器

    Java实体类和DAO层代码生成器是一个强大的工具,它极大地提高了开发效率,特别是在处理大量数据库表映射到Java对象的工作时。这个工具的核心功能是自动根据数据库中的表结构生成对应的实体类(Entity)和数据访问...

    项目model、Dao层、业务层建模工具类

    本资源提供了一种用于项目model、Dao层、业务层建模的工具类,旨在简化开发流程,提高代码复用性。下面我们将详细探讨这些知识点。 首先,"model"层通常指的是领域模型(Domain Model),它是业务逻辑的核心,包含...

    C#特性标签实现通用Dao层

    总结起来,通过C#的特性标签和反射技术,我们可以构建一个灵活且可扩展的通用Dao层,大大减少了重复代码,提高了开发效率。这种方法的关键在于利用元数据(特性)来描述实体类和数据库之间的关系,以及利用反射在...

    javadao层的编写

    Java的dao层和service层,很不错的哦!

    简单DAO层示例

    在IT行业中,DAO(Data Access Object)层是软件设计模式中的一个重要组成部分,它主要用于数据库操作,...在实际项目中,我们需要根据具体需求选择合适的数据库访问技术,并确保DAO层的代码结构清晰、易于测试和扩展。

    action层,dao层 ,service层,entity层1

    DAO层的设计应尽可能与业务逻辑分离,这样可以提高代码的可重用性和可测试性。在Java中,我们可以使用JDBC或者ORM框架(如Hibernate、MyBatis)来实现DAO层。 3. **Service层(业务层)**: Service层是整个应用的...

    SpringBoot 多模块Dao层单元测试

    通过上述步骤,我们可以有效地对Spring Boot多模块项目中的Dao层进行单元测试,确保数据访问逻辑的正确性,提高代码质量。在实际开发中,还可以结合其他测试框架,如Spring Test,实现更复杂的集成测试和端到端测试...

    自动生成DAO源代码

    本主题主要介绍如何利用Eclipse的Java Text Templates (JET)功能自动生成DAO源代码,以及如何结合Spring和Hibernate框架实现高效的DAO层。 首先,DAO是Data Access Object的缩写,它是业务逻辑层和持久化层之间的...

    java代码生成器(dao层service层)

    总的来说,Java代码生成器(dao层service层)是一种高效开发工具,能够帮助开发者快速生成符合项目规范的DAO和服务层代码,提高开发效率,减少重复劳动,同时也能保证代码质量。通过合理利用代码生成器,开发团队可以...

    一个的DAO数据访问层的实现

    在这个“一个的DAO数据访问层的实现”中,我们可以探讨DAO模式的核心概念、实现方法以及它在实际项目中的应用。 首先,DAO模式的基本思想是创建一个专门负责与数据库进行交互的接口或类,即DAO接口或DAO实现类。这...

    dao层自动生成

    例如,MyBatis Generator就是这样一款工具,它可以与Eclipse、IntelliJ IDEA等IDE集成,一键生成DAO层代码。 总的来说,DAO层自动生成技术有助于提升开发效率,降低错误率,让开发者能更专注于业务逻辑的实现。同时...

    junit测试spring,hibernate的dao层代码

    首先,`DAO` 层是业务逻辑和数据库操作之间的隔离层,通常包含了增删改查等基本操作。在 `Spring` 框架中,`DAO` 类会被配置为 `Spring` 的bean,通过依赖注入来获取数据库连接或其他依赖。在测试 `DAO` 层时,我们...

    封装好的dao层

    自己做项目每次用jdbc访问数据库都要进行get和set方法的交互,麻烦,就设计了一个封装类,可以直接把sql语言或对象参数传进去不用那些方法了,不过1.0版本只针对classes12.jar包可以用,开发了2.0版本可以兼容各种...

    mybatisDAO层自动生成插件

    通过合理利用MyBatis DAO层自动生成插件,开发者可以更专注于业务逻辑的实现,减少在基础代码编写上花费的时间。同时,由于代码由插件自动生成,减少了人为错误,提高了代码质量。总的来说,这是一个对于提升开发...

    自动生成dao层和service层代码demo

    闲暇时间,想撸一下代码的时候,可以拿这个练手;...配置好数据库,自动生成dao层和service层代码,可以优化结构,输出自己想要的内容,也可控制不生成service层,或者进一步开发,生成controller层代码,欢迎更新;

Global site tag (gtag.js) - Google Analytics