持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
简概
对象与关系的范式间的对比
| Object | RDBMS | |
|---|---|---|
| 粒度 | 类 | 表 |
| 继承 | 有 | 没有 |
| 唯一性 | a==b或a.equals(b) | 主键 |
| 关联 | 引用 | 外键 |
| 数据访问 | 逐级访问(如 a.b.c) | SQL |
JPA (Java Persistence API )
JPA 为对象关系映射提供了⼀种基于 POJO 的持久化模型
- 简化数据持久化代码的开发⼯作
- 为 Java 社区屏蔽不同持久化 API 的差异
2006 年,JPA 1.0 作为 JSR 220 的⼀部分正式发布 。也正是同年,Hibernate 3.2 成为 JPA 实现 。
Hibernate
官网地址:hibernate.org/
简概
- ⼀款开源的对象关系映射(Object / Relational Mapping)框架
- 将开发者从 95% 的常⻅数据持久化⼯作中解放出来
- 屏蔽了底层数据库的各种细节
发展历程
- 2001年,Gavin King 发布第⼀个版本
- 2003年,Hibernate 开发团队加⼊ JBoss
- 2006年,Hibernate 3.2 成为 JPA 实现
使用参考
定义 JPA 实体对象
常⽤ JPA 注解
实体
@Entity,表明该类是一个实体类@MappedSuperclass,有多个实体类,这些类有一个父类,可以在父类上标注这个注解@Table(name),把实体跟对应的表关联起来
主键
@Id,每个表都有主键,通过该注解来定义主键
-
@GeneratedValue(strategy, generator),指定自增主键的生成策略和生成器。@SequenceGenerator(name, sequenceName),使用序列的情况下,指明使用的是什么序列。
映射
@Column(name, nullable, length, insertable, updatable)@JoinTable(name),使用 @JoinTable 注解将创建一个连接表,也称为“中间表”。可参考:www.hxstrive.com/subject/ope…@JoinColumn(name)
关系
@OneToOne、@OneToMany、@ManyToOne、@ManyToMany@OrderBy
参考:
通过 Spring Data JPA 操作数据库
Repository
@EnableJpaRepositories开启扫描。- 实现 Repository 接⼝ ,以下任意一个皆可。
-
CrudRepositoryPagingAndSortingRepository<T, ID>JpaRepository<T, ID>
定义查询
根据⽅法名定义查询
- find…By… / read…By… / query…By… / get…By…
- count…By…
- …OrderBy…[Asc / Desc]
- And / Or / IgnoreCase
- Top / First / Distinct
分⻚查询
- PagingAndSortingRepository
- Pageable / Sort
- Slice / Page
保存实体
Repository 是怎么从接⼝变成 Bean 的
Repository Bean 是如何创建的
- JpaRepositoriesRegistrar
-
- 激活了 @EnableJpaRepositories
- 返回了 JpaRepositoryConfigExtension
- RepositoryBeanDefinitionRegistrarSupport.registerBeanDefinitions
-
- 注册 Repository Bean(类型是 JpaRepositoryFactoryBean )
- RepositoryConfigurationExtensionSupport.getRepositoryConfigurations
-
- 取得 Repository 配置
- JpaRepositoryFactory.getTargetRepository
-
- 创建了 Repository
- 接⼝中的⽅法是如何被解释的
-
- RepositoryFactorySupport.getRepository 添加了Advice
- DefaultMethodInvokingMethodInterceptor
- AbstractJpaQuery.execute 执⾏具体的查询
- 语法解析在 Part 中
通过 MyBatis 操作数据库
认识 MyBatis
MyBatis(github.com/mybatis/myb…
- ⼀款优秀的持久层框架
- ⽀持定制化 SQL、存储过程和⾼级映射
在 Spring 中使⽤ MyBatis
- MyBatis Spring Adapter(github.com/mybatis/spr…
- MyBatis Spring-Boot-Starter(github.com/mybatis/spr…
简单配置
像其他的 Spring Boot 应用一样,配置参数在 application.properties (或 application.yml )。
MyBatis 在它的配置项中,使用 mybatis 作为前缀。
mybatis.mapper-locations = classpath*:mapper/**/*.xml。XML 映射文件的路径。mybatis.type-aliases-package= 类型别名的包名。搜索类型别名的包名。(包使用的分隔符是 ",; \t\n")mybatis.type-handlers-package = TypeHandler扫描包名。搜索类型处理器的包名。(包使用的分隔符是 ",; \t\n")mybatis.configuration.map-underscore-to-camel-case = true。是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。
Mapper 的定义与扫描
- @MapperScan 配置扫描位置
- @Mapper 定义接⼝
- 映射的定义—— XML 与注解
MyBatis Generator
认识 MyBatis Generator
MyBatis Generator(www.mybatis.org/generator/)
- MyBatis 代码⽣成器
- 根据数据库表⽣成相关代码
-
- POJO
- Mapper 接⼝
- SQL Map XML
运⾏ MyBatis Generator
命令⾏
java -jar mybatis-generator-core-x.x.x.jar -configfile generatorConfig.xml
Maven Plugin(mybatis-generator-maven-plugin)
- mvn mybatis-generator:generate
- ${basedir}/src/main/resources/generatorConfig.xml
Eclipse Plugin
Java 程序
Ant Task
配置 MyBatis Generator
- generatorConfiguration
- context
-
- jdbcConnection
- javaModelGenerator
- sqlMapGenerator
- javaClientGenerator (ANNOTATEDMAPPER / XMLMAPPER / MIXEDMAPPER)
- table
⽣成时可以使⽤的插件
内置插件都在 org.mybatis.generator.plugins 包中
- FluentBuilderMethodsPlugin
- ToStringPlugin
- SerializablePlugin
- RowBoundsPlugin
- ……
使⽤⽣成的对象
- 简单操作,直接使⽤⽣成的 xxxMapper 的⽅法
- 复杂查询,使⽤⽣成的 xxxExample 对象
MyBatis PageHelper
认识 MyBatis PageHelper
MyBatis PageHepler(pagehelper.github.io)
- ⽀持多种数据库
- ⽀持多种分⻚⽅式
- SpringBoot ⽀持(github.com/pagehelper/… )
-
- pagehelper-spring-boot-starter
Lombok
Lombok 能够⾃动嵌⼊ IDE 和构建⼯具,提升开发效率
maven依赖
SpringBoot中
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
常用注解
@Getter/@Setter@ToString,默认不会打印父类的属性,可以将callSuper设置为true进行打印。@NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor@Data,该注解中包含了@Getter,@Setter和@ToString@Builder,可参考:www.jianshu.com/p/d08e25531…@Slf4j/@CommonsLog/@Log4j2
H2 Database
H2 Database是一个开源的嵌入式数据库引擎,采用java语言编写,不受平台的限制,同时H2 Database提供了一个十分方便的web控制台用于操作和管理数据库内容。H2 Database还提供兼容模式,可以兼容一些主流的数据库,因此采用H2 Database作为开发期的数据库非常方便。