当前位置: 首页 > article >正文

了解EJB两种主要类型:BMP与CMP

        EJB(Enterprise JavaBeans)是Java EE(Enterprise Edition)平台的核心组件技术之一,旨在简化企业级应用程序的开发、部署和管理。EJB技术通过封装业务逻辑和数据访问逻辑,提高了代码的可重用性、可维护性和可扩展性。在EJB中,有两种主要的持久化类型:BMP(Bean-Managed Persistence)和CMP(Container-Managed Persistence)。这两种类型各有优缺点,适用于不同的应用场景。本文将对BMP和CMP进行详细阐述,并结合实践进行说明,以便读者能够更好地理解和选择适合的持久化方式。

 

BMP(Bean-Managed Persistence)

        BMP,即Bean管理的持久化,是一种由EJB组件自身负责数据持久化的方式。在BMP中,开发者需要在实体Bean中直接编写SQL语句,并通过JDBC(Java Database Connectivity)API进行数据库操作。这意味着开发者需要负责获取数据库连接、执行SQL语句以及处理结果集。

BMP的优点
  1. 灵活性
    BMP允许开发者完全控制SQL语句和数据访问逻辑,这使得在复杂查询、优化SQL语句和进行特定数据库操作时具有很高的灵活性。开发者可以根据具体的业务需求,编写最适合的SQL语句,从而提高系统的性能和响应速度。

  2. 可控性
    在BMP中,开发者可以明确知道何时何地进行了数据库操作,便于调试和排查问题。此外,由于SQL语句和数据访问逻辑都在Bean中明确编写,这也有助于代码的可读性和可维护性。

  3. 跨数据库支持
    由于BMP允许开发者直接编写SQL语句,因此可以更容易地支持多种数据库。当需要更换数据库时,只需修改SQL语句,而无需对EJB容器或持久化框架进行大的改动。

BMP的缺点
  1. 代码冗余
    BMP需要在每个Bean中编写大量的数据库操作代码,这会导致代码冗余和难以维护。特别是在大型系统中,这种情况尤为突出。

  2. 资源管理复杂
    开发者需要自行管理数据库连接、事务和异常处理等资源,这增加了代码的复杂性和出错的可能性。

  3. 移植性差
    由于BMP依赖于具体的SQL语句和数据库特性,因此当需要将系统移植到其他数据库时,可能需要修改大量的代码。

BMP的实践应用

        在实际应用中,BMP通常用于以下几种情况:

  • 复杂查询:当需要执行复杂的SQL查询时,BMP提供了更高的灵活性和可控性。
  • 性能优化:在需要优化数据库操作性能的场景中,BMP允许开发者根据具体的业务需求,编写最优的SQL语句。
  • 特定数据库特性:当需要使用特定数据库特性(如存储过程、触发器等)时,BMP可以更方便地实现这些需求。

        例如,在一个电子商务系统中,需要计算某个商品在一段时间内的销售情况。由于这个查询涉及到多个表的联接和聚合操作,使用BMP可以更方便地编写和执行这个复杂查询。

public class ProductSalesBean implements EntityBean {
    // 省略其他方法和属性

    public void calculateSales(Date startDate, Date endDate) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            conn = // 获取数据库连接
            String sql = "SELECT SUM(sales_amount) FROM sales WHERE product_id = ? AND sale_date BETWEEN ? AND ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, this.productId);
            pstmt.setDate(2, new java.sql.Date(startDate.getTime()));
            pstmt.setDate(3, new java.sql.Date(endDate.getTime()));
            rs = pstmt.executeQuery();

            if (rs.next()) {
                this.salesAmount = rs.getDouble(1);
            }
        } catch (SQLException e) {
            // 异常处理
        } finally {
            // 关闭资源
        }
    }
}

CMP(Container-Managed Persistence)

        CMP,即容器管理的持久化,是一种由EJB容器负责数据持久化的方式。在CMP中,开发者无需编写数据库操作代码,只需在实体Bean中定义业务方法和属性,然后在EJB部署描述符(ejb-jar.xml)中配置CMP字段即可。EJB容器会自动处理数据库连接、SQL语句执行和结果集处理等工作。

CMP的优点
  1. 简化开发
    CMP大大简化了开发工作,开发者无需编写数据库操作代码,只需关注业务逻辑的实现。这降低了代码的复杂性和出错的可能性。

  2. 提高可维护性
    由于CMP将数据库操作逻辑封装在EJB容器中,因此当数据库结构发生变化时,只需修改部署描述符,而无需修改Bean代码。这提高了代码的可维护性和可扩展性。

  3. 事务管理
    EJB容器负责事务的管理和提交,确保了数据的一致性和完整性。开发者无需担心事务的边界和回滚等问题。

CMP的缺点
  1. 灵活性差
    CMP限制了开发者对SQL语句和数据访问逻辑的控制,使得在复杂查询和性能优化方面存在困难。

  2. 学习成本高
    由于CMP涉及EJB容器的内部机制和部署描述符的配置,因此初学者可能需要花费更多的时间和精力来理解和掌握。

  3. 依赖性强
    CMP对EJB容器的依赖较强,当需要使用其他持久化框架或技术时,可能需要进行较大的改动。

CMP的实践应用

        在实际应用中,CMP通常用于以下几种情况:

  • 简单CRUD操作:对于基本的创建、读取、更新和删除操作,CMP提供了简单而有效的解决方案。
  • 业务逻辑为主:当业务逻辑是系统的核心时,CMP可以让开发者更专注于业务逻辑的实现,而无需关注数据持久化的细节。
  • 快速开发:在需要快速开发和部署系统的场景中,CMP可以显著提高开发效率。

        例如,在一个用户管理系统中,需要实现用户的注册、登录和修改密码等功能。这些功能主要涉及对用户表的简单CRUD操作,因此可以使用CMP来实现。

<!-- ejb-jar.xml -->
<ejb-jar>
    <entity>
        <ejb-name>UserBean</ejb-name>
        <primkey-class>java.lang.String</primkey-class>
        <cmp-field>
            <field-name>userId</field-name>
        </cmp-field>
        <!-- 其他配置 -->
    </entity>
</ejb-jar>
public class UserBean implements EntityBean {
    private String userId;
    private String username;
    private String password;

    // 省略其他方法和属性

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getUserId() {
        return userId;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUsername() {
        return username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPassword() {
        return password;
    }
}

        在这个例子中,我们只需在UserBean中定义业务方法和属性,并在ejb-jar.xml中配置CMP字段即可。EJB容器会自动处理数据库操作,无需编写额外的数据库操作代码。

总结

        BMP和CMP是EJB技术中的两种主要持久化方式,各有优缺点。BMP提供了更高的灵活性和可控性,适用于复杂查询、性能优化和特定数据库特性的场景;而CMP则简化了开发工作,提高了可维护性,适用于简单CRUD操作、业务逻辑为主和快速开发的场景。在选择持久化方式时,需要根据具体的业务需求和技术特点进行权衡和选择。同时,随着Java EE技术的发展和演进,越来越多的持久化框架和技术(如JPA、Hibernate等)涌现出来,为开发者提供了更多的选择和解决方案。


http://www.kler.cn/a/509435.html

相关文章:

  • 【Unity】使用Canvas Group改变UI的透明度
  • QrCode.js 技术文档:二维码生成与导出工具类
  • LocalSend - 免费、开源、跨平台的局域网文件传输工具
  • leetcode206-反转链表
  • 数字化转型的新引擎:开源AI智能名片2+1链动模式S2B2C商城小程序源码的应用与实践
  • 年后找工作需要注意的事项
  • java每日精进1.17(用户登录,登出,Token相关)
  • Scala语言的编程范式
  • HTML格式
  • PCL 快速均匀采样【2025最新版】
  • 【C++基础】enum,union,uint8_t,static
  • Java集合 - LinkedHashMap
  • Java复习第二天
  • mongoose 支持https踩坑纪实
  • Spring Boot 整合 Knife4j:打造更优雅的 API 文档
  • 代码中使用 Iterable<T> 作为方法参数的解释
  • 卸载 MySQL
  • Flutter ListView进阶:如何实现根据索引值滚动到列表特定位置
  • C++实现设计模式---装饰器模式 (Decorator)
  • 舵机驱动---HAL库