JavaEE 项目的三层架构(Web Service Dao)

本文详细介绍了JavaEE项目中采用的三层架构,包括Web层、Service层和DAO层,讲解了如何进行包结构设计、编写JdbcUtils工具类、实现BaseDao接口,以及UserDao、UserService的接口与实现,并提供了测试用例。通过这样的分层设计,实现了代码的解耦,便于项目维护和升级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图示

在这里插入图片描述
分层的目的是为了解耦。解耦就是为了降低代码的耦合度。方便项目后期的维护和升级。

包结构

在这里插入图片描述
web 层 com.atguigu.web/servlet/controller

service 层 com.atguigu.service Service 接口包
com.atguigu.service.impl Service 接口实现类
dao 持久层 com.atguigu.dao Dao 接口包
com.atguigu.dao.impl Dao 接口实现类

实体bean 对象com.atguigu.pojo/entity/domain/bean JavaBean 类

测试包com.atguigu.test/junit

工具类com.atguigu.utils

util

封装的工具包

test

测试文件

web

pages

在这里插入图片描述
pages各种页面

WEB-INF

安全目录
在这里插入图片描述
WEB-INF下的包:导入的jar包放这里面

编写工具类JdbcUtils

导入需要的jar 包(数据库和连接池需要):

druid-1.1.9.jar
mysql-connector-java-5.1.7-bin.jar
以下是测试需要:
hamcrest-core-1.3.jar
junit-4.12.jar

在src 源码目录下编写jdbc.properties 属性配置文件:

username=root
password=root
url=jdbc:mysql://localhost:3306/book
driverClassName=com.mysql.jdbc.Driver
initialSize=5
maxActive=10

编写JdbcUtils 工具类:

import java.sql.Connection;
import java.sql.SQLException;

import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * 获取数据库连接的工具类
 * 
 * @author wzg
 *
 */
public class JDBCUtils {
   
   

	private static ComboPooledDataSource dataSource = new ComboPooledDataSource("book_devoloper");
	/**
	 * 使用ThreadLocal保存Connection对象
	 */
	private static ThreadLocal<Connection> connectionThreadLocal = new ThreadLocal<Connection>();

	private JDBCUtils() {
   
   
	}

	/**
	 * 获取数据库连接
	 * 
	 * @return 如果获取连接成功,返回数据的连接对象。<br/>
	 *         如果获取数据库连接失败,则返回null
	 */
	public static Connection getConnection() {
   
   
		// 先从ThreadLocal中获取
		Connection connection = connectionThreadLocal.get();
		try {
   
   
			if (connection == null) {
   
   
				// 从c3p0中获取数据库连接
				connection = dataSource.getConnection();
				// 设置事务为手动提交
				connection.setAutoCommit(false);
				connectionThreadLocal.set(connection);
			}
		} catch (SQLException e) {
   
   
			e.printStackTrace();
		}
		return connection;
	}

	/**
	 * 释放数据库连接
	 */
	public static void closeConnection(Connection conn) {
   
   
		if (conn != null) {
   
   
			try {
   
   
				conn.close();
			} catch (SQLException e) {
   
   
				e.printStackTrace();
			}
		}
	}

	/**
	 * 释放数据库连接
	 */
	public static void closeConnection() {
   
   
		// 从线程ThreadLocal中获取
		Connection conn = connectionThreadLocal.get();
		if (conn != null) {
   
   
			try {
   
   
				// 事务提交
				conn.commit();
				// 事务关闭
				conn.close();
			} catch (SQLException e) {
   
   
				e.printStackTrace();
			}
		}
		// 移除
		connectionThreadLocal.remove();
	}

	public static void rollback() {
   
   
		// 从线程ThreadLocal中获取
		Connection conn = connectionThreadLocal.get();
		if (conn != null) {
   
   
			try {
   
   
				// 事务回滚
				conn.rollback();
				// 关闭连接
				conn.close();
			} catch (SQLException e) {
   
   
				e.printStackTrace();
			}
		}
		// 移除
		connectionThreadLocal.remove();
	}

编写BaseDao:

import java.lang.reflect.ParameterizedType;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import com.atguigu.util.JDBCUtils;

/**
 * 我们使用的是DBUtil操作数据库
 * 
 * @author wzg
 *
 * @param <T>
 */
public abstract class BaseDaoImpl<T> {
   
   

	/**
	 * DBUtils操作数据库需要使用的类
	 */
	protected QueryRunner queryRunner;
	/**
	 * 保存BaseDaoImpl类的泛型对象class类型
	 */
	protected Class<T> type;

	@SuppressWarnings("unchecked")
	public BaseDaoImpl() {
   
   
		// 创建一个QueryRunner对象实例
		queryRunner = new QueryRunner();
		// 获取父类中带有泛型的父类的class类型
		ParameterizedType supperClass = (ParameterizedType) getClass().getGenericSuperclass();
		
### JavaEE三层架构的组成和实现 JavaEE三层架构是一种经典的软件设计模式,旨在通过将应用程序划分为独立的功能模块来提高系统的可扩展性、可维护性和可重用性[^1]。这种架构通常被划分为以下三个主要层次: #### 表示层(Presentation Layer) 表示层是用户与系统交互的第一界面,负责向用户提供可视化的操作环境并接受用户的输入。这一层的主要功能包括页面展示、表单验证以及请求转发等。在JavaEE中,表示层常使用的技术包括JSP(JavaServer Pages)、Servlet以及现代前端框架如Thymeleaf或Spring MVC。 例如,在基于JSP和Servlet的应用中,可以定义如下简单的Servlet用于处理HTTP请求: ```java @WebServlet("/example") public class ExampleServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String message = "Welcome to the Presentation Layer!"; request.setAttribute("message", message); RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/result.jsp"); dispatcher.forward(request, response); } } ``` #### 业务逻辑层(Business Logic Layer 或 Service Layer) 业务逻辑层位于表示层和数据访问层之间,主要用于处理应用的核心业务逻辑。它封装了复杂的计算、决策流程以及其他特定于业务需求的操作。Service层的设计通常是无状态的,并且可以通过依赖注入的方式与其他组件协作。 下面是一个典型的Service类示例,展示了如何调用DAO层完成某些业务逻辑: ```java @Service public class UserService { @Autowired private UserDao userDao; public User findUserById(int id) { return userDao.findById(id); // 调用DAO层获取用户信息 } public boolean authenticate(String username, String password) { User user = userDao.findByUsername(username); return (user != null && user.getPassword().equals(password)); // 验证密码 } } ``` #### 数据访问层(Data Access Layer 或 DAO Layer) 数据访问层专注于与数据库或其他持久化存储介质之间的通信。它的职责是从底层数据库检索数据或将修改后的数据保存回数据库。为了简化开发过程,开发者经常采用ORM工具(如Hibernate或JPA),这些工具能够自动映射对象关系模型到SQL查询语句。 以下是利用JPA Repository接口的一个简单例子: ```java @Repository public interface UserDao extends JpaRepository<User, Integer> { Optional<User> findByUsername(String username); @Query("SELECT u FROM User u WHERE u.email = :email") List<User> findUsersByEmail(@Param("email") String email); } ``` 以上代码片段分别代表了不同层次中的典型实现方式。每一层都有明确的责任划分,从而降低了整体系统的耦合程度,使得未来升级或者替换某一层变得更为容易[^2]。 ### 总结 综上所述,JavaEE三层架构由表示层、业务逻辑层和数据访问层构成,每层承担不同的角色以支持高效灵活的应用构建。通过合理运用各种技术栈,可以使项目具备更强的生命力和发展潜力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值