`
cevin15
  • 浏览: 25919 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

web应用dao层的开发经验小结

阅读更多
框架用多了,也有些腻。虽然struts2,spring,hibernate,ibatis等等都是一些很优秀的框架。不过,发现很多框架的功能都没用到,感觉有些浪费啊!于是,想着是不是自己学习用过框架的思想,然后用传统的无框架来进行开发。

这两天利用路上两个小时的坐公车时间,思考了如何去开发dao层。总结如下:
1、使用模板模式来开发通用的JdbcTemplate,简单的写了下jdbc模板类
public class JdbcTemplate<T> {
	
	/**
	 * 查找表对象列表
	 */
	@SuppressWarnings("unchecked")
	public List<T> query(String sql, Object[] args, BaseDao dao){
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<T> list = new ArrayList<T>();
		try {
			conn = DBUtils.getConnectionByC3P0();
			ps = conn.prepareStatement(sql);
			if(args!=null){
				for(int i=0; i<args.length; i++){
					ps.setObject(i+1, args[i]);
				}
			}
			rs = ps.executeQuery();
			while(rs.next()){
				T obj = dao.rowMapper(rs);
				list.add(obj);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			try {
				if(conn.getAutoCommit()){
					DBUtils.release(rs, ps, conn);
				}else{
					DBUtils.release(rs, ps, null);
				}
			} catch (Exception e2) {
				e2.printStackTrace();
			} 
		}
		return list;
	}
	
	/**
	 * 更新表对象
	 */
	public void update(String sql, Object[] args){
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = DBUtils.getConnectionByC3P0();
			ps = conn.prepareStatement(sql);
			if(args!=null){
				for(int i=0; i<args.length; i++){
					ps.setObject(i+1, args[i]);
				}
			}
			ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			try {
				if(conn.getAutoCommit()){
					DBUtils.release(null, ps, conn);
				}else{
					DBUtils.release(null, ps, null);
				}
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}
}

在这个模板类中数据库连接没有直接关闭的原因,是为了之后的事务管理。当然,模板类肯定不能只是这两个方法,具体可以参考spring的jdbctemplate来进行模板类的开发。
BaseDao是个接口,完成rs到bean的映射,代码如下:
public interface BaseDao<T> {
	public T rowMapper(ResultSet rs);
}

2、其它dao层类使用JdbcTemplate来进行开发。下面举个简单的例子:
	public List<SearchUpdate> findBySql(String sql, Object[] objs) {
		return jt.query(sql, objs, new BaseDao<User >() {
			public User rowMapper(ResultSet rs) {
				User user = new User ();
				try {
					user.setName(rs.getString("name"));
					user.setId(rs.getInt("id"));
				} catch (Exception e) {
					e.printStackTrace();
				}
				return user;
			}
		});
	}

3、使用代理模式来进行事务的处理。下面是,关于业务代理类的代码,在里面进行了事务的开启,提交或者回滚。
public class TransactionProxy implements InvocationHandler {
	private Object targetObject;

	public Object bind(Object targetObject) {
		this.targetObject = targetObject;
		return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
				targetObject.getClass().getInterfaces(), this);
	}

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		TransactionManager tm = DBUtils.getTransactionManager();
		tm.beginTransaction();
		Object result = null;
		try {
			result = method.invoke(targetObject, args);
			tm.commitTransaction();
		} catch (Exception e) {
			tm.rollBackTransaction();
		}
		return result;
	}
}

这种代理方式,前提是代理对象必须是相应的接口的实现。如果代理对象没有接口的话,可以利用第三方包cglib来实现对象的代理。

以上纯粹只是个人的经验之谈,作为自己的小小的记录。如有错漏,望提出。完整的代码在附件中,包含了一个数据库链接池的包和cglib包。
分享到:
评论

相关推荐

    基于JSP+Servlet+JavaBean+JDBC+DAO的Web图书管理架构设计该系统

    基于JSP+Servlet+JavaBean+JDBC+DAO的Web架构设计该系统,进一步了解并掌握如何对数据库进行操作,以及如何分析、设计一个应用系统。 需求要求: 该系统的基本需求是,系统要实现如下的基本管理功能: (1)用户分为...

    Spring3.x企业应用开发实战(完整版) part1

    1.8 小结 第2章 快速入门 2.1 实例功能概述 2.1.1 比Hello World更适用的实例 2.1.2 实例功能简介 2.2 环境准备 2.2.1 创建库表 2.2.2 建立工程 2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 ...

    Spring.3.x企业应用开发实战(完整版).part2

    1.8 小结 第2章 快速入门 2.1 实例功能概述 2.1.1 比Hello World更适用的实例 2.1.2 实例功能简介 2.2 环境准备 2.2.1 创建库表 2.2.2 建立工程 2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 ...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    该案例采用目前最流行、最规范的java ee架构,整个应用分为jpa实体层、eao层、业务逻辑层、mvc层和视图层,各层之间分层清晰,层与层之间以松耦合的方法组织在一起。该案例既提供了ide无关的、基于ant管理的项目源码...

    Spring 2.0 + Struts 1.2 + Hibernate 3.2 + DWR 2.0 的JavaEE应用示例

    总结,该例示注释非常详细,演示Spring托管Hibernate和Struts的Action, 以及Spring的事务声明(包括1.x与2.x的用法)与非事务声明的使用方式。 使用DWR可以方便的使用Spring托管的持久层功能。 目的:希望广大Java...

    Spring开发指南

    Web 应用中模板技术与 JSP 技术的对比 输入验证与数据绑定 异常处理 国际化支持 WebWork2 & Spring Quick Start WebWork 高级特性 Action 驱动模式 XWork 拦截器体系 输入校验 国际化支持 Webwork2...

    Java Web程序设计教程

    第1章web应用开发简介 1 1.1何为web应用 1 1.1.1web的概念及发展 1 1.1.2web应用程序 2 1.2使用java开发web应用 3 1.2.1面向对象的编程语言 3 1.2.2丰富的框架技术 4 1.2.3xml、css的应用 4 1.2.4使用...

    JAVA程序开发大全---上半部分

    6.3 使用MyEclipse开发Web应用程序 86 6.3.1 创建Web项目 87 6.3.2 创建HTML静态页面 88 6.3.3 创建JSP页面 90 6.3.4 创建Servlet 91 6.3.5 创建Web项目中的Java类文件 92 6.3.6 发布和运行Web项目 94 6.4 Web应用...

    JavaWeb数据库应用开发基础

    JavaWeb数据库应用JavaWeb数据库应用开发的几种方式一、JSP+JDBC二、JSP+Servlet(+JDBC)三、JSP+Servlet+DAO(+JDBC)四、JSP+Servlet+DAO(+JDBC)+JavaBean JavaWeb数据库应用开发的几种方式 以下总结了课程中...

    javaee 实验报告 实验一 JSP+Servlet+Javabean+jdbc-基于MVC模式的数据库的应用

    实验一 JSP+Servlet+Javabean+jdbc-基于MVC模式的数据库的应用 实验二 JSF+JPA实现用户注册 实验三 struts+spring+hibernate框架访问数据库的应用 实验四 使用WebService和EJBean访问数据库的应用

    《MyEclipse 6 Java 开发中文教程》前10章

    第八章 开发Web应用 142 8.1介绍 142 8.2 Web项目和术语 142 8.2.1 Java EE 中的Web项目结构 142 8.2.2 MyEclipse Web 项目介绍 144 8.3 创建Web项目 144 8.4 创建HTML页面 146 8.5 创建JSP页面 148 8.6 创建Servlet...

    MyEclipse 6 Java EE 开发中文手册 第九章完整

    163 9.5 编写Struts整合Hibernate的分页应用 163 9.5.1 分页应用的设计思路 163 9.5.2 创建StrutsPageDemo项目,加入Hibernate开发功能 169 9.5.3 反向工程生成DAO层 169 9.5.4 编写分页应用层 170...

    JavaEE-SpringMVC-云借阅图书管理系统(包含源码、数据库sql文件、报告)

    Web表现层:该层主要包括Spring MVC中的Controller类和JSP页面。 总结: 云借阅图书管理系统主要实现了两大功能模块:用户登录模块和图书管理模块,用户登录模块主要用于实现用户的登录与注销;图书管理模块主要...

    JAVA WEB典型模块与项目实战大全

    1.1 java web应用概述  1.2 配置开发环境  1.3 基础技术简单简介  1.4 核心框架初步认识  1.5 小结  第2章 myedipse开发工具对各种框架的支持  2.1 使用jsp的两种模式  2.2 struts框架的实现  2.3...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    4.4 创建和发布Web应用 4.4.1 创建和发布JSP应用程序 4.4.2 创建和发布Servlet应用程序 4.5 小结 第五章 Eclipse使用指南 5.1 Eclipse简介 5.1.1 Eclipse的历史 5.1.2 Eclipse的运行机制 5.2 建立Eclipse的开发环境 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    4.4 创建和发布Web应用 4.4.1 创建和发布JSP应用程序 4.4.2 创建和发布Servlet应用程序 4.5 小结 第五章 Eclipse使用指南 5.1 Eclipse简介 5.1.1 Eclipse的历史 5.1.2 Eclipse的运行机制 5.2 建立Eclipse的开发环境 ...

Global site tag (gtag.js) - Google Analytics