目录
Spring data jpa是Spring使用jpa的组件。采用Hibernate实现jpa能力。但是比自行Spring和Hibernate整合使用方便很多。
引入组件
在pom.xml中加入组件,这里连接MySQL数据库,所以引入mysql-connector-java
org.springframework.boot
spring-boot-starter-data-jpa
mysql
mysql-connector-java
创建模型
jpa讲究的是面向对象的思维,降低了数据库的可见性。它可以完全不去写SQL语句完成对数据库中数据的增删改查操作。一个数据模型对应一个数据表。我们对数据的操作关心对这个对象的业务过程。
创建一个模型,名称为Account。这个对象是用于描述系统中的账户。创建名称为com.biboheart.demos.domain的package,在此package中新建类Account。如下:
package com.biboheart.demos.domain;
import lombok.Data;
import javax.persistence.*;
@Data
@Entity // 表示这是一个jpa模型
@Table(name = "bh_account") // 表示对应数据表bh_account
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id; // ID
private String sn; // 账户编号
private String username; // 用户名
private String mobile; // 手机号
private String password; // 密码
private Long createTime; // 创建时间
}
创建接口
创建模型后,执行数据增删查改操作。spring data jpa提供了约定的方式来简化使用。它约定,继承JpaRepository的接口,在接口中定义的函数名称就可以执行不同的数据操作。复杂的可以用注解来完成。如findBySn函数,就可以实现用户sn匹配查找账户。通过这样约定的情况下使用spring data jpa,不需要实现这个接口。写了这个接口,就可以将这个接口注入到业务中使用。
在com.biboheart.demos.repository中创建AccountRepository。如下代码:
package com.biboheart.demos.repository;
import com.biboheart.demos.domain.Account;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public interface AccountRepository extends JpaRepository, JpaSpecificationExecutor {
Account findBySn(String sn);
}
在业务代码中如下方法注入,就可以通过accountRepository.findBySn(sn)查找匹配到sn的用户。
@Autowired
private AccountRepository accountRepository;
配置连接
这时候,jpa并不知道Account对应的是哪个数据库的表。要配置数据库连接。在application.yml中配置spring.datasource,spring boot中项目中许多框架就可以自动得到数据库的连接参数。配置spring.jpa设置spring data jpa的属性。
server:
port: 80
spring:
profiles:
active: dev
resources:
static-locations: file:/usr/local/bhhello/static, classpath:/static/
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/bh_springbootdemo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true
username: root
password: root
jpa:
database: MYSQL
database-platform: org.hibernate.dialect.MySQL5Dialect
show-sql: false
hibernate:
ddl-auto: update
properties:
hibernate:
format_sql: false
custom:
name: bhhello-app
测试连接
在com.biboheart.demos.service中创建接口AccountService,在com.biboheart.demos.service.impl中创建实现AccountServiceImpl。代码如下:
package com.biboheart.demos.service;
import com.biboheart.demos.domain.Account;
public interface AccountService {
/**
* 保存账户
* @param account 账户对像
* @return 保存后的账户对像,如果保存失败返回null
*/
Account save(Account account);
/**
* 查询账户
* @param sn 账户编号
* @return 查询结果,账户对像
*/
Account load(String sn);
}
实现(这里未做容错处理):
package com.biboheart.demos.service.impl;
import com.biboheart.brick.utils.CheckUtils;
import com.biboheart.demos.domain.Account;
import com.biboheart.demos.repository.AccountRepository;
import com.biboheart.demos.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.UUID;
@Service
public class AccountServiceImpl implements AccountService {
// 注入account数据库访问对象
@Autowired
private AccountRepository accountRepository;
@Override
public Account save(Account account) {
if (CheckUtils.isEmpty(account.getSn())) {
// 生成账户编号
String sn = UUID.randomUUID().toString().replace("-", "").toUpperCase();
while (null != accountRepository.findBySn(sn)) {
sn = UUID.randomUUID().toString().replace("-", "").toUpperCase();
}
account.setSn(sn);
}
account = accountRepository.save(account);
return account;
}
@Override
public Account load(String sn) {
Account account = accountRepository.findBySn(sn);
return account;
}
}
开放两个API,实现创建账户与查询账户的功能。在com.biboheart.demos.controller中创建AccountController类。
package com.biboheart.demos.controller;
import com.biboheart.brick.model.BhResponseResult;
import com.biboheart.demos.domain.Account;
import com.biboheart.demos.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AccountController {
@Autowired
private AccountService accountService;
@RequestMapping(value = "/public/userapi/account/save", method = {RequestMethod.POST, RequestMethod.GET})
public BhResponseResult> save(Account account) {
account = accountService.save(account);
return new BhResponseResult<>(0, "success", account);
}
@RequestMapping(value = "/public/userapi/account/load", method = {RequestMethod.POST, RequestMethod.GET})
public BhResponseResult> load(String sn) {
Account account = accountService.load(sn);
return new BhResponseResult<>(0, "success", account);
}
}
为了方便测试,配置SecurityConfiguration,使"/public"开头的api不需要安全认证。
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.authorizeRequests()
.antMatchers("/", "/home", "/mobileCodeLogin", "/public/**").permitAll() // 这三个目录不做安全控制
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")// 自定义的登录页面
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/");
http.addFilterBefore(mobileCodeAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
// @formatter:on
}
结尾
这章中,通过spring data jpa对数据库进行创建表,增加数据,查询数据的操作。从头到尾没有使用SQL语句。除了配置文件中配置了数据库连接参数,业务过程与java程序的面向对象操作无异。