Spring-boot整合druid+jpa+tx
jpa
jpa简介
java persistence API
是一个java
持久化规范,其主要目的有两个:
- 为
java
应用开发人员提供了o/r mapping
的工具来管理java
应用中的关系数据,简化了开发持久化的工作。 - 整合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能够提供强大的监控和扩展功能。
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
两种方式
-
声明式事务
@EnableTransactionManagement(proxyTargetClass,mode,order)
@Transactional(transactionManager,propagation,isolation,timeout,readOnly,rollbackFor)
-
编程式事务:
-
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(); })
-