每日三个JAVA经典面试题(二十四)

1.JDBC编程有哪些不足之处,MyBatis是如何解决的?

JDBC编程存在以下不足之处,而MyBatis框架针对这些问题提供了相应的解决方案:

  1. 数据库连接管理

    • 不足:在JDBC编程中,手动管理数据库连接时,频繁地创建和释放数据库连接会消耗大量系统资源,同时影响应用程序性能。
    • MyBatis解决:MyBatis支持配置和使用数据库连接池(如HikariCP、C3P0等),连接池能够复用已建立的数据库连接,避免频繁创建和关闭连接带来的性能开销。
  2. SQL语句硬编码

    • 不足:在JDBC中,SQL语句通常直接写在Java代码中,这会导致代码难以维护,尤其当SQL语句发生变化时,需要修改源代码,违背了"开闭原则"(Open/Closed Principle)。
    • MyBatis解决:MyBatis允许将SQL语句定义在XML映射文件或注解中,与Java代码分离,使得SQL更改无需修改Java业务逻辑代码。
  3. 参数传递复杂性

    • 不足:在JDBC中使用PreparedStatement时,为SQL语句传入参数相对繁琐,特别是在动态构建WHERE子句的情况下,需要手工处理不同数量和类型的参数。
    • MyBatis解决:MyBatis提供动态SQL标签和映射API,可以更灵活地处理SQL参数,根据传入的Java对象自动匹配和设置SQL语句中的占位符,简化了参数绑定的过程。
  4. 结果集处理

    • 不足:JDBC处理结果集时,通常需要手写代码来遍历结果集并转换为Java对象,不同的SQL查询可能需要编写不同的结果集处理逻辑。
    • MyBatis解决:MyBatis能够自动将查询结果映射到Java POJO(Plain Old Java Object)对象上,只需在映射文件中定义结果集与Java类属性之间的映射关系,即可方便地获取经过类型转换的对象集合,大大简化了结果集处理的代码。

通过上述改进,MyBatis减轻了程序员处理底层数据库交互的工作负担,提高了开发效率,并增强了代码的可读性和可维护性。

2.MyBatis和Hibernate的适用场景?

MyBatis 的编程步骤大致如下:

  1. 环境准备

    • 创建一个Java项目,可以是Maven项目或Gradle项目,确保包含MyBatis框架以及所使用的数据库驱动依赖。
    • 搭建数据库环境,创建所需的数据库及表结构。
  2. 添加依赖

    • 如果是Maven项目,在pom.xml文件中添加MyBatis和对应的数据库驱动依赖。
  3. 配置MyBatis核心文件

    • 编写mybatis-config.xml配置文件,用于配置MyBatis的核心行为,比如数据源(DataSource)、事务管理器、映射文件的位置等。
  4. 编写SQL映射文件

    • 根据数据库操作需求,创建若干个SQL映射文件(如UserMapper.xml),其中包含SQL语句以及结果映射规则。
  5. 编写Java接口

    • 定义一个或多个Mapper接口,接口方法对应SQL映射文件中的SQL语句,用于执行数据库操作。
  6. 创建实体类

    • 根据数据库表结构,创建Java实体类(POJO,即Plain Old Java Object),用于映射数据库表中的记录。
  7. 初始化SqlSessionFactory

    • 使用MyBatis配置文件创建SqlSessionFactory,这个工厂对象用于生成数据库会话(SqlSession)。
  8. 执行数据库操作

    • 通过SqlSessionFactory获取SqlSession实例。
    • 使用SqlSession执行CRUD操作,调用Mapper接口的方法,这些方法会映射到SQL映射文件中的相应SQL语句。
    • 执行完操作后,根据需要提交事务,并最终关闭SqlSession

以下是一个简化的流程示例:

java 复制代码
// 初始化SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

try (SqlSession session = sqlSessionFactory.openSession()) {
    // 获取Mapper接口的代理对象
    UserMapper mapper = session.getMapper(UserMapper.class);

    // 执行插入、更新、删除或查询操作
    User user = new User();
    // ... 设置用户信息
    mapper.insert(user);  // 插入用户
    session.commit();  // 提交事务

    // 查询用户信息
    User foundUser = mapper.findById(userId);
} catch (Exception e) {
    // 处理异常,回滚事务(如果开启了事务的话)
    session.rollback();
}

// 最终确保SqlSession被关闭

每个步骤的具体内容和细节可能因项目需求有所不同,但以上步骤概括了MyBatis编程的基本流程。

3.MyBatis编程步骤是什么样的?

MyBatis编程步骤概述如下:

  1. 环境配置与依赖添加

    • 准备Java开发环境,配置JDK并确保项目构建工具(如Maven或Gradle)正确设置。
    • 在项目中添加MyBatis及其所依赖的数据库驱动jar包。
  2. 数据库设计与连接

    • 设计并创建数据库表结构。
    • 配置数据库连接信息,包括URL、用户名、密码等。
  3. 编写MyBatis核心配置文件

    • 创建 mybatis-config.xml 文件,配置数据源(DataSource)、事务管理器、映射文件路径等。
  4. 编写实体类(POJO)

    • 根据数据库表结构编写Java实体类,用于表示数据库表中的每条记录。
  5. 编写Mapper接口与映射文件

    • 创建Mapper接口,声明与数据库操作相对应的方法。
    • 创建对应的XML映射文件(如 UserMapper.xml),在文件中编写SQL语句以及resultMap(结果映射)。
  6. 初始化SqlSessionFactory

    • 使用MyBatis配置文件创建一个 SqlSessionFactory 实例,该实例用于创建 SqlSession
  7. 执行数据库操作

    • 通过 SqlSessionFactory 打开一个新的 SqlSession
    • 通过 SqlSession 调用之前编写的Mapper接口方法来执行CRUD操作。
    • 操作完成后,根据业务逻辑选择是否提交事务。
java 复制代码
// 创建SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

try (SqlSession session = sqlSessionFactory.openSession()) {
    // 获取Mapper接口的代理对象
    UserMapper mapper = session.getMapper(UserMapper.class);

    // 执行数据库操作,例如插入用户
    User newUser = new User("username", "password");
    mapper.insert(newUser);

    // 提交事务
    session.commit();
} catch (Exception e) {
    // 若发生错误,回滚事务
    session.rollback();
}
  1. 资源释放

    • 确保在操作完毕后正确关闭 SqlSession
  2. 编写单元测试或集成测试

    • 为验证数据库操作是否正常工作,编写测试类和测试方法。

上述步骤提供了使用MyBatis进行数据库操作的基本流程,实际应用时还可能涉及到分页、动态SQL、缓存策略等更复杂的功能配置与使用。

相关推荐
吾日三省吾码38 分钟前
JVM 性能调优
java
stm 学习ing43 分钟前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc2 小时前
《Python基础》之字符串格式化输出
开发语言·python
弗拉唐2 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi772 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
mqiqe2 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin2 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
少说多做3432 小时前
Android 不同情况下使用 runOnUiThread
android·java