我是这样使用SpringBoot(使用 Spring data jpa)

目录

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程序的面向对象操作无异。

你可能感兴趣的:(我是这样使用SpringBoot(使用 Spring data jpa))