美文网首页
Spring-boot整合druid+jpa+tx

Spring-boot整合druid+jpa+tx

作者: Shawn_Shawn | 来源:发表于2020-09-03 00:07 被阅读0次

Spring-boot整合druid+jpa+tx

jpa

jpa简介

java persistence API

是一个java持久化规范,其主要目的有两个:

  1. java应用开发人员提供了o/r mapping的工具来管理java应用中的关系数据,简化了开发持久化的工作。
  2. 整合ORM技术。像Hibernate(版本3.2)和TopLink Essentials这样的项目已经实现Java Persistence API规范。

Hibernate

  • Hibernate为Java提供了一个开源的对象关系映射框架

  • Gavin King创立了Hibernate项目。

  • Hibernate开发团队加入了jboss。

  • 版本3.2及更高版本提供了Java 持久化 API的实现。

spring data

Spring Data是用于简化数据库访问,支持云服务的开源框架。

在保留底层存储特性的同时,提供了相对一致的。基于spring的编程模型。

主要模块:

  • Spring data jdbc
  • spring data jpa
  • spring data redis
  • spring data mongodb
  • spring data keyvalue
  • ....

spring-boot-starter-data-jpa

定义实体对象

// 父类
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Data
public abstract class BaseEntity implements Serializable {

  @Column(name = "create_time", updatable = false)
  @CreationTimestamp
  private Date createTime;

  /** 上次更新时间 */
  @Column(name = "update_time")
  @UpdateTimestamp
  private Date updateTime;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
@Table(name = "T_MENU")
public class Menu extends BaseEntity {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long menuId;

  @Column(name = "parent_id")
  private Long parentId;

  private String name;

  private String url;

  private Integer type;

  @Column(name = "order_num")
  private Integer orderNum;

  @Column(name = "is_deleted")
  private int isDeleted;
}

常用注解:

@Entity:标志着这个类为一个实体 bean

@Table:用于配置表与类的映射关系

@Column:用于指定某一列与某一个字段或是属性映射的细节信息,其中比较常用的属性:

  • name 属性允许显式地指定列的名称。
  • length 属性为用于映射一个值,特别为一个字符串值的列的大小。
  • nullable 属性允许当生成模式时,一个列可以被标记为非空。
  • unique 属性允许列中只能含有唯一的内容
  • updatable 属性是否可以被修改

@Id:主键

@GeneratedValue:主键生成策略

  • TABLE:使用一个特定的数据库表格来保存主键。
  • SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
    • @SequenceGenerator: 指定序列名
  • IDENTITY:主键由数据库自动生成(主要是自动增长型)
  • AUTO:主键由程序控制。

@CreationTimestamp:创建时间

@UpdateTimestamp:更新时间

@OrderBy

下面均为表与表之间关系的注解

1对1,1对多,多对1,多对多

继承

@JoinTable

@JoinColumn

@OneToOne

@OneToMany

@ManyToOne

@ManyToMany

@MappedSuperclass

@EntityListeners(AuditingEntityListener.class)

Repository

@EnableJpaRepositories

@NoRepositoryBean

接口:

PagingAndSortingRepository<T, ID>

CrudRepository<T, ID>

JpaRepository<T, ID>

方法定义

  • 查询方法定义

    find..By... / get...By... / query...By... / read...By...

  • 统计方法定义

    count...By...

  • 排序方法定义

    ...OrderBy...[Asc/Desc]

  • 条件拼接

Keyword Sample JPQL snippet
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is,Equals findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age ⇐ ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull findByAgeIsNull … where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection age) … where x.age not in ?1
TRUE findByActiveTrue() … where x.active = true
FALSE findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)
  • 分页

    Pageable/Sort/Slice/Page

  • 其余

    Top/Distinct/First

@NoRepositoryBean
public interface BaseRepository<T, Long> extends PagingAndSortingRepository<T, Long> {}
public interface MenuRepository extends BaseRepository<Menu, Long> {}

druid

Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。

druid.wiki

spring.datasource.url: jdbc:mysql://127.0.0.1:3306/spring-boot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8
spring.datasource.username: root
spring.datasource.password: Gepoint
spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
spring.datasource.type: com.alibaba.druid.pool.DruidDataSource ## 指定连接池,默认是Hikari

spring.datasource.druid.initial-size: 5
spring.datasource.druid.max-active: 5
spring.datasource.druid.min-idle: 5
spring.datasource.druid.max-wait: 60000
spring.datasource.druid.filters: conn,config,stat,slf4j
spring.datasource.druid.test-on-borrow: true
spring.datasource.druid.test-on-return: true
spring.datasource.druid.test-while-idle: true

transaction

spring transaction传播特性

传播性 描述
PROPAGATION_REQUIRED 0 如果不存在外层事务,就主动创建事务;否则使用外层事务
PROPAGATION_SUPPORTS 1 如果不存在外层事务,就不开启事务;否则使用外层事务
PROPAGATION_MANDATORY 2 如果不存在外层事务,就抛出异常;否则使用外层事务
PROPAGATION_REQUIRES_NEW 3 总是主动开启事务;如果存在外层事务,就将外层事务挂起
PROPAGATION_NOT_SUPPORTED 4 总是不开启事务;如果存在外层事务,就将外层事务挂起
PROPAGATION_NEVER 5 总是不开启事务;如果存在外层事务,则抛出异常
PROPAGATION_NESTED 6 如果不存在外层事务,就主动创建事务;否则创建嵌套的子事务

Spring transaction核心接口

  • PlatformTransactionManager
    • DataSourceTransactionManager
    • HibernateTransactionManager
    • JtaTransactionManager
  • TransactionDefinition
    • Propagation
    • Isolation
    • Timeout
    • Read-only Status

两种方式

  1. 声明式事务

    @EnableTransactionManagement(proxyTargetClass,mode,order)

    @Transactional(transactionManager,propagation,isolation,timeout,readOnly,rollbackFor)

  2. 编程式事务:

    • TransactionTemplate

      TransactionCallback

      TransactionCallbackWithoutResult

    • PlatformTransactionManager

      TransactionDefinition

    @Autowired
    private TransactionTemplate txTemplate;
    
    @Autowired
    private JdbcTemplate template;
    
    txTemplate.execute(status->{
        template.execute("insert into t (id) values (1)");
        status.setRollbackOnly();
    })
    

示例代码

相关文章