文章目录
- 一.基本概念
- 二.SpringBoot JPA整合hibernate -yml配置
- 三.SpringBoot整合MyBatisPlus
一.基本概念
Spring Data JPA | |
---|---|
作用: | 面向对象的ORM全自动化框架,简化持久化操作的开发工作:让开发者从繁琐的JDBC和SQL代码中解脱出来,直接面向对象持久化操作. |
特点: | 跨数据库换源方便 |
底层基于hibernate实现JPA实现 | |
MySql中新建数据库,命名为springbootjpa,不用建表,运行项目后会自动生成表。 | |
复杂sql支持原生语句 | |
具备多表关联操作.配置好关联关系,自动处理关联操作 | |
缺点: | 没有实现独立的增删改操作,必须先查询 |
复杂原生sql与代码耦合度高 | |
Id 雪花算法需要自己开发 | |
需要自己处理count查询 |
MyBatisPlus | |
---|---|
作用: | 面向对象的ORM全自动化框架,简化持久化操作的开发工作:让开发者从繁琐的JDBC和SQL代码中解脱出来,直接面向对象持久化操作. |
特点: | 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 |
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 | |
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器 | |
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件 | |
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence) | |
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作 | |
支持自定义全局通用操作:支持全局通用方法注入 | |
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎 | |
内置分页插件:基于 MyBatis 物理分页 | |
分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库 | |
内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询 | |
MySql中新建数据库,命名为springbootjpa,不用建表,运行项目后会自动生成表. | |
缺点: | 项目引入第三方插件包,未来升级有一定的兼容性问题. |
社区技术迭代行快,从而会导致有效部分技术文档得不到及时更新. |
总结: hibernate性能不如MyBatisPlus.但深刻体现面向对象编程的思想无需关注表结构和实体对象的关系.在小项目上hibernate更加方便.而对于复杂业务MyBatisPlus就更胜一筹;
详见hibernate与MyBatisPlus的优劣
二.SpringBoot JPA整合hibernate -yml配置
demo结构
pom
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.3</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-bom</artifactId>
<version>2022.0.1</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
yml
server:
port: 8080
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
username: root
password: root
jpa:
# 默认检测
database: mysql
# 默认检测 数据库名称
database-platform: test
# 是否在启动时候初始化架构 generate hibernate.auto二选一
# generate-ddl: true
# 表生成策略 默认none
# update 如果没有表就自动创建,有就检查更新
# create 创建
hibernate:
ddl-auto: update
# physical-strategy 默认直接映射
# SpringPhysicalNamingStrategy 驼峰命名映射为大写变下划线
# naming:
# physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
# properties 提供hibernate更多的原生配置
properties:
hibernate:
# 配置方言:选择数据库类型 查看Dialect类的所有接口实现.
dialect: org.hibernate.dialect.MySQL8Dialect
# 控制台显示sql
format_sql: true
# 允许在日志中记录sql语句 默认false
show-sql: true
主启动类
@SpringBootApplication
@EnableJpaRepositories(basePackages = "com.vector.dao")
@EnableTransactionManagement
public class HibernateApplication {
public static void main(String[] args) {
SpringApplication.run(HibernateApplication.class);
}
}
dao
@Repository
public interface CustomerDao extends PagingAndSortingRepository<Customer,Long> {
}
单元测试
@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class SpringDataJpaTest {
@Resource
CustomerDao repository;
@Test
public void testR() {
Optional<Customer> byId = repository.findById(1L);
System.out.println(byId.get());
}
@Test
public void testC() {
Customer customer = new Customer();
customer.setCustId(3L);
customer.setCustName("王五");
repository.save(customer);
}
@Test
public void testD() {
Customer customer = new Customer();
customer.setCustId(3L);
customer.setCustName("李四");
repository.delete(customer);
}
@Test
public void testE(){
log.info("查询所有数据: {}",repository.findAll());
}
}
三.SpringBoot整合MyBatisPlus
MyBatisPlus官方文档
MyBatisPlus逆向工程
pom
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
yml
## MyBatis配置
#mybatis:
# # 搜索指定包别名
# typeAliasesPackage: com.vector.**.domain
# # 配置mapper的扫描,找到所有的mapper.xml映射文件
# mapperLocations: classpath*:mapper/**/*Mapper.xml
# # 加载全局的配置文件
# configLocation: classpath:mybatis/mybatis-config.xml
# MyBatis-plus配置
mybatis-plus:
type-aliases-package: com.vector.**.pojo
# mapper-locations: classpath*全包依赖扫描; classpath自己的mapper
mapper-locations: classpath*:mapper/**/*Mapper.xml
# 统一设定自增主键
global-config:
db-config:
id-type: auto
logic-delete-value: 1
logic-not-delete-value: 0
main
@SpringBootApplication
@MapperScan("com.vector.**.dao")
@EnableTransactionManagement
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
dao
@Mapper
public interface CategoryMapper extends BaseMapper<Article> {
}