【SpringBoot】O/R Mapping框架

126 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情

简概

对象与关系的范式间的对比

ObjectRDBMS
粒度
继承没有
唯一性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 实现

使用参考

www.cnblogs.com/mq0036/p/85…

定义 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

参考:

juejin.cn/post/684490…

blog.csdn.net/qq_38157516…

通过 Spring Data JPA 操作数据库

Repository

  1. @EnableJpaRepositories 开启扫描。
  2. 实现 Repository 接⼝ ,以下任意一个皆可。
    1. CrudRepository
    2. PagingAndSortingRepository<T, ID>
    3. 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

简单配置

像其他的 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)

    • 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作为开发期的数据库非常方便。

参考:blog.csdn.net/qq_29645505…