hql实例jpa_Springdatajpa的使⽤与详解(⼀):框架整合及
基本使⽤
1 什么是JPA
JPA全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。JPA的出现主要是为了简化持久层开发以及整合ORM技术,结束Hibernate、TopLink、JDO等ORM框架各⾃为营的局⾯。
JAP为我们提供了ORM映射元数据,JPA的API,JPQL查询语⾔等,但JPA仅仅是⼀种规范,也就是说JPA仅仅定义了⼀些接⼝,⽽接⼝是需要实现才能⼯作的。所以底层需要某种实现,⽽Hibernate就是实现了JPA接⼝的ORM框架。
2 什么是Hibernate框架
Hibernate是Java中的对象关系映射解决⽅案。对象关系映射或ORM是将应⽤程序域模型对象映射到关系数据库表的编程技术。Hibernate是⼀个基于Java的ORM⼯具,它提供了⼀个框架,⽤于将应⽤程序域对象映射到关系数据库表。
Hibernate提供了Java Persistence API的参考实现,使其成为具有松散耦合优势的ORM⼯具的绝佳选择。
3 什么是Spring Data JPA
Spring Data是Spring Framework的⼀部分。Spring Data存储库抽象的⽬标是显著减少为各种持久性存储实现数据访问层所需的代码量。
Spring Data JPA不是JPA提供者。它是⼀个库/框架,它在我们的JPA提供程序(如Hibernate)的顶部添加了⼀个额外的抽象层。
4 Hibernate和Spring Data JPA的关系
Hibernate是⼀个JPA实现,⽽Spring Data JPA是⼀个JPA数据访问抽象。Spring Data提供了GenericDao⾃定义实现的解决⽅案,它还可以通过⽅法名称约定代表您⽣成JPA查询。
Spring Data JPA不是⼀个实现或JPA提供者,它只是⼀个抽象,⽤于显著减少为各种持久性存储实现数据访问层所需的代码量。Spring Data JPA始终需要JPA提供程序,如Hibernate。
5 Spring data jpa概述
JPA Spring Data:致⼒于减少数据访问层(DAO)的开发量,开发者唯⼀要做的,就只是声明持久层的接⼝,其他都交给Spring Data JPA 来完成。
框架怎么可能代替开发者实现业务逻辑呢?⽐如:当有⼀个 UserDao.findUserById() 这样⼀个⽅法声明,⼤致应该能判断出这是根据给定条件的 ID 查询出满⾜条件的 User 对象。Spring Data JPA 做的便是规范⽅法的名字,根据符合规范的名字来确定⽅法需要实现什么样的逻辑。
5 Spring data JPA使⽤
5.1 jar包引⼊
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-data-jpa
mysql
mysql-connector-java
runtime
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-devtools
true
org.springframework.boot
spring-boot-starter-test
test
5.2 Spring data jpa配置
@Configuration
// 借助spring data实现⾃动化的jpa repository,只需编写接⼝⽆需编写实现类
// 相当于xml配置的
// repositoryImplementationPostfix默认就是Impl
// entityManagerFactoryRef默认就是entityManagerFactory
// transactionManagerRef默认就是transactionManager
@EnableJpaRepositories(basePackages = {"pository"}, repositoryImplementationPostfix = "Impl",
entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef = "transactionManager")
// 启⽤事务管理器
@EnableTransactionManagement
//审计功能 ⽤来⾃动填充@CreateDate等
@EnableJpaAuditing(dateTimeProviderRef = "dateTimeProvider")
public class SpringDataJpaConfig {
@Bean
public DateTimeProvider dateTimeProvider(DateTimeService dateTimeService) { return dateTimeService::getNow;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); // 设置数据库类型(可使⽤jpa.vendor包下的Database枚举类) jpaVendorAdapter.setDatab
ase(Database.MYSQL);
// 设置打印sql语句
jpaVendorAdapter.setShowSql(true);
// 设置不⽣成ddl语句
jpaVendorAdapter.setGenerateDdl(false);
// 设置hibernate⽅⾔
jpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5Dialect");
return jpaVendorAdapter;
}
// 配置实体管理器⼯⼚
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) { LocalContainerEntityManagerFactoryBean emfb = new LocalContainerEntityManagerFactoryBean(); // 注⼊数据源
emfb.setDataSource(dataSource);
// 注⼊jpa⼚商适配器
emfb.setJpaVendorAdapter(jpaVendorAdapter);
// 设置扫描基本包
emfb.setPackagesToScan("ity");
return emfb;
}
// 配置jpa事务管理器
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { JpaTransactionManager transactionManager = new JpaTransactionManager();
// 配置实体管理器⼯⼚
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
}
启⽤web⽀持还需要在Spring MVC配置类上添加@EnableSpringDataWebSupport注解
@Configuration
@ComponentScan(basePackages = {"ller"})
@EnableWebMvc // 启⽤spring mvc
@EnableSpringDataWebSupport // 启⽤springmvc对spring data的⽀持
public class WebMvcConfig extends WebMvcConfigurerAdapter {
mysql下载jar包}
配置⽂件
server:
port: 20000
servlet:
context-path: /
spring:
datasource:
url: jdbc:mysql://localhost:3306/mytest1?useUnicode=true&serverTimezone=UTC&characterEncodin
g=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
username: root
password: root
jpa:
database: MySQL
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
show-sql: true
hibernate:
ddl-auto: update
ddl-auto 解释:
create : 每次运⾏程序时,都会重新创建表,故⽽数据会丢失。
create-drop:每次运⾏程序时会先创建表结构,然后待程序结束时清空表。
upadte:每次运⾏程序,没有表时会创建表,如果对象发⽣改变会更新表结构,原有数据不会清空,只会更新(推荐使⽤)。
validate:运⾏程序会校验数据与数据库的字段类型是否相同,字段不同会报错。
none: 禁⽤DDL处理。
5.3 简单的Spring dat jpa例⼦
例⼦简单就不写service层了,直接在controller中调⽤。
创建实体类
@Data
@Entity
@Table(name = "account")
@ToString
public class Account {
@Id
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@GeneratedValue(generator = "idGenerator")
private String id;
@Column(name = "username", unique = true, nullable = false, length = 64)
private String username;
@Column(name = "password", nullable = false, length = 64)
private String password;
@Column(name = "email", length = 64)
private String email;
}
主键采⽤UUID策略
@GenericGenerator是Hibernate提供的主键⽣成策略注解,注意下⾯的@GeneratedValue(JPA注解)使⽤generator = "idGenerator"引⽤了上⾯的name = "idGenerator"主键⽣成策略。
JPA⾃带的⼏种主键⽣成策略
TABLE: 使⽤⼀个特定的数据库表格来保存主键。
SEQUENCE: 根据底层数据库的序列来⽣成主键,条件是数据库⽀持序列。这个值要与generator⼀起使⽤,generator 指定⽣成主键使⽤的⽣成器(可能是orcale中⾃⼰编写的序列)。
IDENTITY: 主键由数据库⾃动⽣成(主要是⽀持⾃动增长的数据库,如mysql)。
AUTO: 主键由程序控制,也是GenerationType的默认值。
dao层
@Repository
public interface AccountRepository extends JpaRepository {
}
controller层
@RestController
@RequestMapping(value = "/role")
public class AccountController {
@Autowired
private AccountRepository repository;
@PostMapping()
public Account save(@RequestBody Account account) {
return repository.save(account);
}
@DeleteMapping("/{id}")
public void delete(@PathVariable("id") String accountId) {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论