7数据访问
说明
常用MybatisPlus
7.1 使用JPA/Hibernate详解
Java Persistence API (JPA) 是Java EE规范的一部分,提供了一种方式来管理Java应用中的数据持久化。
-
实体(Entity):
- 实体是JPA中的一个核心概念,它代表了一个数据库表。
- 用
@Entity
注解标记的类表示一个实体。
-
持久化上下文(Persistence Context):
- 持久化上下文是一个特殊的容器,它包含实体的实例以及这些实例的持久化状态。
- 它负责实体的生命周期和缓存。
-
EntityManager:
EntityManager
是JPA用于与数据库交互的API。- 它提供了一系列的操作,用于创建、读取、更新和删除实体。
-
实体管理器工厂(EntityManagerFactory):
- 用于创建
EntityManager
的实例。 - 通常通过
persistence.xml
配置或Java Persistence API
的Persistence
类来访问。
- 用于创建
-
事务(Transaction):
- JPA的事务管理保证了数据库操作的ACID属性。
- 可以通过
@Transactional
注解来声明方法的事务边界。
案例: 创建一个简单的JPA实体
java
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters and Setters
}
在这个例子中,@Entity
注解标记了User
类为一个JPA实体,@Id
标记了实体的主键,@GeneratedValue
指定了主键的生成策略。
7.2 使用Spring Data JPA详解
Spring Data JPA 简化了JPA的使用,提供了一套便捷的数据访问抽象层。
-
Repository:
- 通过继承
JpaRepository
接口,可以获取标准的CRUD操作。 - 还可以添加自定义的方法。
- 通过继承
-
方法名查询:
- Spring Data JPA可以根据方法名自动生成查询。
- 例如,
findAllByUserName
方法名会生成一个查询,该查询查找所有用户名匹配的实体。
-
查询派生:
- 除了方法名查询,还可以使用
@Query
注解来执行更复杂的JPQL或SQL查询。
- 除了方法名查询,还可以使用
-
事务管理:
- 与Spring的声明式事务管理集成,可以使用
@Transactional
注解来管理事务。
- 与Spring的声明式事务管理集成,可以使用
案例: 创建一个Spring Data JPA仓库
java
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByUserName(String userName);
}
在这个例子中,UserRepository
接口继承自JpaRepository
,提供了基本的CRUD操作,并且定义了一个自定义查询方法findByUserName
。
7.3 集成其他ORM框架(如MyBatis)详解
MyBatis 是一个流行的Java ORM框架,它提供了SQL映射和对象关系映射的功能。
-
集成MyBatis:
- Spring Boot通过
spring-boot-starter-mybatis
Starter来集成MyBatis。
- Spring Boot通过
-
配置MyBatis:
- 在
application.properties
或application.yml
中配置MyBatis的SQL映射文件和相关设置。
- 在
-
Mapper接口:
- 定义数据访问接口,MyBatis会根据这些接口生成动态代理实现。
-
MyBatis配置类:
- 使用
@MapperScan
注解来指定MyBatis的Mapper接口所在的包路径。
- 使用
案例: 集成MyBatis并配置Mapper接口
java
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface UserMapper {
User selectUserById(Long id);
}
在这个例子中,@Mapper
注解标记了UserMapper
接口为MyBatis的映射接口,@Repository
注解将其标记为Spring的组件。
7.4 集成MyBatis-Plus详解
MyBatis-Plus (简称 MP) 是在 MyBatis 的基础上进行的扩展,它简化了 CRUD 操作,提供了一些额外的功能,使得数据库操作更加简单和高效。
核心功能
-
自动填充:
- MyBatis-Plus 支持自动填充字段,例如创建时间、更新时间等。
- 可以使用
@TableField
注解的fill
属性来指定字段的自动填充策略。
-
性能分析:
- 提供了 SQL 执行的性能分析,通过
@SqlParser
注解可以查看执行的 SQL 语句及其执行时间。
- 提供了 SQL 执行的性能分析,通过
-
逻辑删除:
- 支持逻辑删除,通过特定的字段(如
deleted
)来标识记录是否被删除,而不是从数据库中真正删除记录。
- 支持逻辑删除,通过特定的字段(如
-
乐观锁:
- 支持乐观锁,可以通过
@Version
注解来指定版本号字段,实现乐观锁机制。
- 支持乐观锁,可以通过
配置 MyBatis-Plus
在 pom.xml
文件中添加 MyBatis-Plus 的依赖:
xml
<dependencies>
<!-- MyBatis-Plus 依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>最新版本号</version>
</dependency>
<!-- 其他依赖 -->
</dependencies>
使用 MyBatis-Plus
- Mapper 接口 :
- 通过继承
BaseMapper
接口,可以快速获得对实体的 CRUD 操作支持。 - 可以添加自定义方法,MyBatis-Plus 会根据方法名动态生成 SQL。
- 通过继承
案例: 集成 MyBatis-Plus 并使用
java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import your.package.User;
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 自定义查询方法,例如根据用户名查询用户
User selectByUsername(String username);
}
在这个例子中,UserMapper
接口继承自 BaseMapper
,提供了对 User
实体的 CRUD 操作支持,并且可以添加自定义查询方法。
自动填充
使用 @TableField
注解的 fill
属性来指定自动填充策略:
java
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import java.time.LocalDateTime;
public class User {
// ... 其他字段 ...
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
// Getters and Setters
}
在这个例子中,createTime
字段会在插入时自动填充,而 updateTime
字段会在插入和更新时自动填充。
逻辑删除
通过添加一个字段来实现逻辑删除,例如 @TableLogic
注解:
java
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.Version;
public class User {
// ... 其他字段 ...
@TableLogic
private Integer deleted;
@Version
private Integer version;
// Getters and Setters
}
在这个例子中,deleted
字段用于标识记录是否被逻辑删除,version
字段用于乐观锁。
性能分析
通过 @SqlParser
注解查看 SQL 执行的详细信息:
java
@SqlParser
public interface UserMapper extends BaseMapper<User> {
// 接口方法
}
配置类
创建一个配置类来配置 MyBatis-Plus 的相关属性:
java
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("your.package.mapper")
public class MyBatisPlusConfig {
@Bean
public SqlSessionFactory sqlSessionFactory() {
MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
// 配置 MyBatis-Plus 相关属性
return sqlSessionFactory.getObject();
}
}
在这个例子中,MyBatisPlusConfig
类用于配置 MyBatis-Plus,@MapperScan
注解用于指定 Mapper 接口所在的包路径。
通过上述详细步骤和案例,MyBatis-Plus 提供了一个强大而灵活的方式来增强 MyBatis 的功能,使得开发者可以更加专注于业务逻辑,而不是底层的数据访问代码。
通过这些详细的解释和案例,我们可以看到Spring Boot提供了对JPA/Hibernate和MyBatis等ORM框架的全面支持,同时也支持了MyBatis-Plus这样的增强工具,使得数据访问层的开发更加高效和简单。