四:springboot 使用 SpringDataJpa

1. JPA相关简介

jpa 是 Java Persistence API 的简称,中文名 Java持久层API,在JDK5.0后提出的Java持久化规范。其目的是为了简化现有 JAVA EEJAVA SE 应用开发工作,以及整合现有的ORM技术,然后实现规范统一化的伟大目标。jpa 只是一种规范,从功能上来说,jpa 就是 Hibernate 功能的一个子集。

常见的ORM框架中 Hibernate 的 jpa 最为完整,因此 Spring Data JPA 是采用基于 jpa 规范的 Hibernate 框架基础下提供了Repository 层的实现。Spring Data Repository极大地简化了实现各种持久层的数据库访问而写的样板代码量,同时CrudRepository提供了丰富的CRUD功能。

当然了,它也有自身的缺点,学习这玩意儿,我们需要学习hql语句,然后配置上来说相对复杂一些(特别是在多表查询上啊...),还有就是它的性能不如mybatis 和jdbc啦

 2. 添加相关依赖

pom.xml中添加spring-boot-starter-data-jpa的依赖,添加 mysql 的依赖

<!-- spring-boot-starter-data-jpa 将会自动获得HikariCP依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MYSQL包 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

3. 配置数据源,连接数据库

application.properties 中添加如下配置。值得注意的是,SpringBoot默认会自动配置 DataSource,它将优先采用 HikariCP 连接池,如果没有该依赖的情况则选取 tomcat-jdbc,如果前两者都不可用最后选取 Commons DBCP2我们可以通过spring.datasource.type 属性来指定其它种类的连接池,这个就看个人喜好啦..

# JPA配置
spring.jpa.hibernate.ddl-auto=update
# 输出日志
spring.jpa.show-sql=true
# 数据库类型
spring.jpa.database=mysql

spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
spring.datasource.password=root
spring.datasource.username=root
# spring.datasource.type  该属性可指定其它种类的连接池

ddl-auto 几种属性

  1. create:每次运行程序时,都会重新创建表,所以数据会丢失
  2. create-drop:每次运行程序时会先创建表结构,然后待程序结束时清空表
  3. upadte:每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(我们一般都用这个的...)
  4. validate:运行程序会校验数据与数据库的字段类型是否相同,所以当字段不同的时候会报错的...

 4. 实体类

JPA规范注解在javax.persistence包下,注意 @Id 注解不要引用错了。@GeneratedValue(strategy = GenerationType.IDENTITY) 是自增策略,还有就是不需要映射的字段可以通过 @Transient 注解排除掉

常见的几种自增策略

  1. TABLE:使用一个特定的数据库表格来保存主键
  2. AUTO:主键由程序控制,也是GenerationType的默认值。
  3. IDENTITY:主键由数据库自动生成(主要是支持自动增长的数据库)
  4. SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。这个值要与generator一起使用,generator 指定生成主键使用的生成器。
@Setter //setter 和 getter 注解加上后可以不写get和set方法了
@Getter
@Entity // 指明这个是实体类,然后也可以写成这种 @Entity(name = "tb_user") tb_user 就是指的某张具体的表

public class TbUser implements Serializable {

    private static final long serialVersionUID = 8655851615465363473L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;
    private boolean sex;

    @Transient // 返回的数据中忽略该字段
    private String  email;

}

5. Repository

创建UserRepository数据访问层接口,需要继承JpaRepository<T,K>第一个泛型参数是实体对象的名称,第二个是主键类型JpaRepository本身就包含了常用的crud功能,JPA支持@Query注解写HQL,也支持findAllByUsername这种根据字段名命名的方式

@Repository
public interface TbUserRepository extends JpaRepository<TbUser, Long> {

    /**
     * 根据用户名查询用户信息
     *
     * @param username 用户名
     * @return 查询结果
     */
    List<TbUser> findByUsername(String username);
}

6. 测试

我们在springboot自带的测试类中进行测试,下面的 findByUsername 试类是我们自己写的,当然JpaRepository 自带的CRUD我这里就没写了,你们可以自己试一下...

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
    @Autowired
    private TbUserRepository tbUserRepository;

    @Test
    public void contextLoads() {
    }

    private static final Logger log = LoggerFactory.getLogger(SpringBootDataJpaApplicationTests.class);

    @Test
    public void test1() {

        final List<TbUser> user = tbUserRepository.findByUsername("1111");
        log.info("[根据用户名查询] - [{}]", user);

    }
}

7. controller层

当然,也可写在controller层里,我们使用postman等测试工具模拟接口访问进行测试

@RestController
@RequestMapping("/TbUser")
public class AccountController {
    @Autowired
    TbUserRepository tbUserRepository;

    @GetMapping(value = "/findAll")
    public List<TbUser> getAccounts() {
        return tbUserRepository.findByUsername("1111);
    }
}

8. 结语

按照惯例写个结语,嗯...看了很多大佬的教程,结合我自己的总结了一波,当然了,不足之处请多包涵,也请多指教...如有雷同,也请多包涵...嘻嘻...

最近一周都在改需求... 嗯...超级想打死产品经理...

注:如有需要,可自行转载,但是要加上原创作者及原文章链接哦...

发布了25 篇原创文章 · 获赞 28 · 访问量 5444

猜你喜欢

转载自blog.csdn.net/wzp12321/article/details/86132913