《JAVA八股真解》八、服务框架
#JAVA##JAVA面经##JAVA内推#
1. MyBatis 是什么?有什么优势?
MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
核心特性:
- SQL 映射:将 SQL 语句与 Java 方法绑定,实现灵活的数据库操作。
- 动态 SQL:支持
if、choose、foreach等标签,编写复杂查询。 - 结果映射:通过
resultMap将数据库字段映射到 Java 对象。 - 缓存机制:提供一级缓存(Session)和二级缓存(Mapper),提升查询性能。
优点:
- 轻量级,易于集成。
- SQL 可读性强,便于调试。
- 支持自定义 SQL,灵活性高。
缺点:
- 需要手动编写 SQL,维护成本较高。
- 不适合复杂业务逻辑。
2. MyBatis 的核心组件
MyBatis 主要由以下几部分组成:
- SqlSessionFactoryBuilder:用于创建
SqlSessionFactory。 - SqlSessionFactory:创建
SqlSession的工厂类。 - SqlSession:执行 SQL 操作的核心接口,包含
selectOne()、selectList()、insert()、update()、delete()等方法。 - Executor:执行器,负责 SQL 的执行和结果处理。
- StatementHandler:处理 SQL 语句的生成和执行。
- ParameterHandler:处理参数绑定。
- ResultSetHandler:处理查询结果集。
流程简述:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
try {
User user = session.selectOne("com.example.UserMapper.selectById", 1);
} finally {
session.close();
}
3. ResultType 和 ResultMap 的区别
| 特性 | ResultType | ResultMap |
|---|---|---|
| 用途 | 直接映射简单类型(如 String、Integer)或 POJO 类型 | 处理复杂映射关系,如嵌套对象、关联查询 |
| 配置方式 | 在 <select> 标签中使用 resultType="xxx" |
使用 <resultMap> 定义映射规则 |
| 灵活性 | 简单,适用于一对一映射 | 强大,支持一对多、多对一等复杂关系 |
示例:
<!-- ResultType -->
<select id="selectUser" resultType="com.example.User">
SELECT id, name FROM user WHERE id = #{id}
</select>
<!-- ResultMap -->
<resultMap id="userResultMap" type="com.example.User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<collection property="orders" ofType="com.example.Order">
<id property="id" column="order_id"/>
<result property="amount" column="amount"/>
</collection>
</resultMap>
建议:
- 简单场景使用
resultType。 - 复杂场景使用
resultMap。
4. MyBatis Plus 的常用注解
MyBatis Plus 是 MyBatis 的增强工具,提供了丰富的注解简化开发。
| 注解 | 说明 |
|---|---|
@TableName |
指定实体类对应的数据库表名 |
@TableId |
指定主键字段,支持自增、UUID、雪花算法等 |
@TableField |
指定字段与数据库列的映射关系 |
@Version |
实现乐观锁,自动更新版本号 |
@TableLogic |
实现逻辑删除,标记为“已删除”而非物理删除 |
示例:
@TableName("user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField("name")
private String name;
@Version
private Integer version;
@TableLogic
private Boolean deleted;
}
5. MyBatisPlus 的常用注解
MyBatis Plus 提供了多种注解,简化 CRUD 操作。
- @TableName:指定表名。
- @TableId:指定主键,支持自增、UUID、雪花算法。
- @TableField:指定字段映射。
- @Version:实现乐观锁。
- @TableLogic:实现逻辑删除。
优势:
- 减少 XML 配置,提高开发效率。
- 支持通用 CRUD 方法,无需手动编写 SQL。
6. Spring Boot 是什么?
Spring Boot 是 Spring 的子项目,旨在简化 Spring 应用的初始搭建和开发过程。
核心特性:
- 自动配置:根据依赖自动配置组件。
- 起步依赖:简化 Maven/Gradle 配置。
- 内嵌服务器:支持 Tomcat、Jetty 等,无需部署 WAR 包。
- Actuator:提供生产级监控和管理功能。
优点:
- 快速启动,减少配置。
- 内置大量常用功能,开箱即用。
7. Spring Boot 的启动方式
Spring Boot 支持多种启动方式:
- IDE 启动:直接运行
main方法。 - Maven/Gradle 命令:
mvn spring-boot:run ./gradlew bootRun - 打包运行:
java -jar myapp.jar
建议:生产环境推荐使用
jar包方式部署。
8. Spring Boot 的常用注解
| 注解 | 说明 |
|---|---|
@SpringBootApplication |
启动类注解,包含 @Configuration、@EnableAutoConfiguration、@ComponentScan |
@RestController |
标记控制器类,返回 JSON 数据 |
@RequestMapping |
映射请求路径 |
@GetMapping |
映射 GET 请求 |
@PostMapping |
映射 POST 请求 |
@RequestBody |
绑定请求体数据 |
@ResponseBody |
返回响应体数据 |
示例:
@RestController
@RequestMapping("/api")
public class UserController {
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
}
9. Spring Boot 的自动配置原理
Spring Boot 的自动配置基于 @Conditional 注解实现。
- 条件判断:根据类路径、配置文件、Bean 存在与否等条件决定是否启用某个配置。
- 自动配置类:位于
META-INF/spring.factories文件中,定义了所有自动配置类。 - 配置优先级:用户配置 > 自动配置。
示例:
@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
publi
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
【八股真解】精炼最新高频面经 文章被收录于专栏
本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏
查看25道真题和解析