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

MyBatis框架 与 传统JDBC连接数据库的对比

1. 基本概念
  • JDBC (Java Database Connectivity):JDBC 是 Java 提供的标准数据库访问 API,开发者使用它直接与数据库交互。你需要手动编写 SQL 查询、管理数据库连接、处理事务等。
  • MyBatis:MyBatis 是一种 Java 持久化框架,简化了数据库交互过程。它允许开发者通过 XML 或注解来定义 SQL 查询,并且通过映射将查询结果转换为 Java 对象。MyBatis 封装了很多底层的数据库操作,使得开发者不需要手动编写大量样板代码。

2. SQL 执行方式
  • JDBC:开发者需要手动编写每条 SQL 语句,管理数据库连接,并处理 SQL 执行结果。每个查询都需要一整套的代码:创建连接、准备 SQL、执行查询、处理结果集、关闭连接等。

    JDBC 示例

    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password");
    String sql = "SELECT * FROM users WHERE id = ?";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setInt(1, 1);  // 设置参数
    ResultSet rs = ps.executeQuery();
    while (rs.next()) {
        System.out.println(rs.getString("username"));
    }
    rs.close();
    ps.close();
    conn.close();
    
  • MyBatis:MyBatis 通过 XML 或注解来定义 SQL 查询,查询结果会自动映射为 Java 对象。你只需要关注数据映射和 SQL 定义,框架会处理数据库连接、事务和结果集等底层操作。

    MyBatis 示例

    1. 配置文件(mybatis-config.xml)
    <configuration>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
                    <property name="username" value="root"/>
                    <property name="password" value="password"/>
                </dataSource>
            </environment>
        </environments>
    </configuration>
    
    1. Mapper 接口(UserMapper.java)
    public interface UserMapper {
        User selectUserById(int id);
    }
    
    1. 映射文件(UserMapper.xml)
    <mapper namespace="com.example.UserMapper">
        <select id="selectUserById" resultType="com.example.User">
            SELECT id, username FROM users WHERE id = #{id}
        </select>
    </mapper>
    
    1. 使用 MyBatis
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession session = sqlSessionFactory.openSession();
    
    UserMapper userMapper = session.getMapper(UserMapper.class);
    User user = userMapper.selectUserById(1);
    
    System.out.println("User: " + user.getUsername());
    
    session.close();
    

3. 代码简洁性
  • JDBC:由于需要手动管理数据库连接、SQL 执行和事务等,JDBC 的代码通常非常冗长、重复,并且容易出错。每次查询都需要编写很多样板代码。
  • MyBatis:MyBatis 将数据库操作封装成映射文件和接口,极大地减少了代码的冗余性。开发者只需定义 SQL 查询,MyBatis 会自动处理底层的数据库连接和事务等。

4. 事务管理
  • JDBC:事务管理由开发者手动控制,需要显式调用 commit()rollback(),并确保在异常发生时能够回滚事务。
  • MyBatis:MyBatis 默认支持事务管理,开发者只需要在 SqlSession 上调用 commit()rollback(),框架会自动处理事务的开始和提交,简化了事务管理。

5. 动态 SQL 支持
  • JDBC:在 JDBC 中,开发者需要手动编写复杂的动态 SQL。你必须根据不同的查询条件手动拼接 SQL 字符串,这样既容易出错,也不易维护。

  • MyBatis:MyBatis 提供了强大的动态 SQL 支持,通过 XML 中的 <if>, <choose>, <foreach> 等标签,开发者可以轻松构建复杂的动态 SQL,而不需要手动拼接 SQL 字符串。

    动态 SQL 示例(MyBatis)

    <select id="selectUser" resultType="User">
        SELECT id, username FROM users
        <where>
            <if test="username != null">AND username = #{username}</if>
            <if test="age != null">AND age = #{age}</if>
        </where>
    </select>
    

6. 性能和灵活性
  • JDBC:JDBC 提供完全的灵活性,开发者可以完全控制 SQL 语句的执行和数据库连接,适合对性能要求非常高的场景。但缺点是代码较为繁琐。
  • MyBatis:MyBatis 增加了一个抽象层,可能会导致一定的性能开销,但在大多数情况下,这个性能开销是微不足道的。MyBatis 还提供了缓存机制、批量操作和连接池等优化手段,能够提升性能。

7. 错误处理
  • JDBC:JDBC 需要开发者手动捕获和处理 SQLException,需要对每个数据库操作进行错误处理,代码繁琐且容易出错。
  • MyBatis:MyBatis 会自动捕获数据库异常,并封装为 PersistenceException,使得错误处理更加统一和简洁。

比较表格

特性JDBCMyBatis
配置方式手动编写连接代码、SQL语句,较为繁琐使用 XML 或注解配置 SQL,简化代码
SQL执行开发者手动编写 SQL 语句,管理连接和事务通过映射文件和接口自动执行 SQL
动态SQL需要手动拼接 SQL提供动态 SQL 标签(如 <if><foreach>
事务管理由开发者手动控制事务自动管理事务,简化事务控制
代码冗余需要重复写大量连接、结果处理等代码通过接口和映射文件减少冗余代码
错误处理需要手动捕获 SQL 异常 (SQLException)自动封装为 PersistenceException
性能灵活但较为复杂,开发者可进行精细优化抽象层略微增加性能开销,但有缓存等优化
适用场景对 SQL 控制要求高,复杂查询场景适合快速开发,简化数据库操作和映射

总结:

  • JDBC:适合对数据库操作有高度定制要求的场景。开发者可以完全控制 SQL 执行、性能优化和事务管理,但代码较为繁琐,需要处理大量样板代码。
  • MyBatis:适合快速开发和简化数据库操作的场景。通过提供 SQL 映射和动态 SQL 支持,开发者可以更加专注于业务逻辑,而不必重复编写繁琐的数据库操作代码。虽然它有一定的性能开销,但在大多数应用场景中,MyBatis 提供了更高的开发效率和可维护性。

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

相关文章:

  • Golang教程第24篇(语言接口)
  • java将word docx pdf转换为图片(不需要额外下载压缩包,直接导入maven坐标)
  • nlp培训重点
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(6)
  • 混沌工程/混沌测试/云原生测试/云平台测试
  • 【ROS 机器人快速入门】
  • selenium动态判断滚轮方向样例
  • 【深度学习|特征增强模块】AttentionEnhancementModule模块和普通 QKV Attention模块的在深度学习网络中的作用-2
  • 自动化是语法,智能化是语义与语用
  • 使用Python和OpenAI Whisper为视频生成字幕
  • Vue文字转语音实现
  • 二阶信息在机器学习中的优化;GPTQ算法利用近似二阶信息;为什么要求近似二阶(运算量大,ReLu0点不可微)
  • 【智商检测——DP】
  • 一些基于宏基因组的巨型病毒研究
  • Python parsel库学习总结
  • 使用 OpenCV 进行车辆跟踪
  • 深入理解CSS语法:掌握Web开发的基石
  • docker x86环境构建arm镜像出现failed to fetch oauth token问题
  • 爬虫专栏第二篇:Requests 库实战:从基础 GET 到 POST 登录全攻略
  • 【maven-6】Maven 生命周期相关命令演示
  • XELA - uSkin 三轴触觉传感器:为机器人赋予敏锐触感
  • 永磁同步电机负载估计算法--滑模扰动观测器
  • 【合作原创】使用Termux搭建可以使用的生产力环境(一)
  • golang用errgroup的一个小小坑
  • UIlicious - 自动化端到端测试
  • Oracle 建表的存储过程