2020:0704--13--SpringBoot整合JPA

687 阅读4分钟

主要内容

1.  Spring Data

2.  引入spring-boot-starter-data-jpa

3.  配置文件打印SQL语句

4.  创建Entity标注JPA注解

5.  创建Repository接口继承JpaRepository

6.  测试方法

1. SpringData简介

    SpringData是SpringBoot底层进行数据访问默认采用的技术。它是Spring官方开发出来用来简化数据访问
的一个项目。

    在这个项目中有非常多的模块能简化各种数据(库)访问操作:
    
        Spring Data Commons:
        让我们在使用关系型或者非关系型数据访问技术时都基于Spring提供的统一标准,
        标准包含了CRUD(创建、获取、更新、删除)、查询、排序和分页的相关操作。
    
        Spring Data JPA: 简化关系型数据库访问的操作
        
        Spring Data MongoDB :   简化MongoDB数据库访问的操作
        
        Spring Data Redis:  简化Redis数据库的访问操作
        
    SpringData的理想是统一我们数据访问的API,怎么统一呢?
    
        
    1.  SpringData会提供统一的Repository接口:
        Repository<T, ID extends Serializable>:最顶层的统一接口
        CrudRepository<T, ID extends Serializable>:基本CRUD操作
        PagingAndSortingRepository<T, ID extends Serializable>:基本CRUD及分页
        
    
        那么今后我们再对数据库进行增删改查,
        我们只要写一个接口继承CrudRepository<T, ID extends Serializable>,我们这个接口就具有了
        基本的增删改查操作,不用关心任何的实现。

        如果我们写一个repository类继承了JpaRepository,那么这个repository既有分页排序功能,
        也有CRUD等功能
        
        这是SpringData为我们提供的统一的Repository接口
        
    2.  Spring还为我们提供了统一的模板类
    
        操作Rides: RedisTemplate模版
        
        操作MongoDB:    MongoTemplate模版
        
        来帮我们简化对相关数据库的操作
        
    3.  有了SpringData,我们只需要面向SpringData编程。我们用好SpringData为我们统一提供的API即可。

2. SpringBoot整合JPA

2.1 概述

        我们的课程操作的时关系型数据库,所以主要学习JPA
        
        JPA:Java Persistence API   JAVA持久化API
        
        它是J2EE的一个规范,也称为JSR 317规范。
        
        
        这个规范的实现有很多:
            SpringBoot JPA的实现
            Hibernate的实现
            Toplink的实现
            OpenJPA的实现
            
        如果没有SpringData,我们学习一个框架就要学习对应这个框架的JPA实现。
        SpringData默认底层使用Hibernate对于JPA的实现
        有了SpringData就相当于对这些实现进行了一个再封装。

        Jpa、Hibernate、Spring Data Jpa三者之间的关系:
        
        总的来说JPA是ORM规范,Hibernate、TopLink等是JPA规范的具体实现,这样的好处是开发者
        可以面向JPA规范进行持久层的开发,而底层的实现则是可以切换的。Spring Data Jpa
        则是在JPA之上添加另一层抽象(Repository层的实现),极大地简化持久层开发及ORM框架切
        换的成本

2.2 整合JPA

1.  创建工程
    
    注意:如果导JPA包导不进去,可以将pom.xml中的<parent/>版本调低一点(2.2.2)试试
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

2.  整合Druid数据源

3.  JPA也是基于ORM思想的(Object Relational Mapping)

4.  编写一个实体类(Bean)和数据表进行映射,并且配置好映射关系
        //使用JPA注解配置映射关系
        @Entity //告诉JPA这是一个实体类(和数据库表映射的类,不是一个普通的类)
        @Table(name = "tbl_user")   //指定和哪个数据表对应,如果省略默认表名是类名小写
        public class User {
            
            @Id //这是一个主键
            @GeneratedValue(strategy = GenerationType.IDENTITY) //主键生成策略:自增主键
            private Integer id;
            
            @Column(name = "last_name", length = 50) //和数据表对应的列
            private String lastName;
            @Column //省略默认列名就是属性名
            private String email;
        }
5.  编写一个Dao/Repository接口来操作实体类对应的数据表
    继承JpaRepository,那么这个Repository既有分页排序功能,也有CRUD功能

public interface UserRepository extends JpaRepository<User, Integer>

    //操作数据表的Repository继承JpaRepository来完成对数据库的操作
    public interface UserRepository extends JpaRepository<User, Integer> {
    
        //它里面有各种CRUD方法和分页排序方法
    }
    注意两个泛型:
        1.  要操作的实体类。
        2.  实体类的主键类型。
        
6.  基本的JPA配置:JpaProperties类中
        spring:
          jpa:
            hibernate:
              # 更新或者创建数据表结构:如果创建过了就不再创建了
              ddl-auto: update
              # 在控制台显示sql
            show-sql: true
7.  启动测试一下
    
    1. 表已经创建了

8.  写一个UserController测试一下能不能操作数据库
        @RestController
        public class UserController {
        
            @Autowired
            UserRepository userRepository;
        
            @GetMapping("/user/{id}")
            public User getUser(@PathVariable("id") Integer id){
        
                User user = userRepository.findById(id).get();
        
                return user;
            }
        
            @GetMapping("/user")
            public User insertUser(User user){
                User saveUser = userRepository.save(user);
                return saveUser;
            }
        }

    测试成功,但是发现插入时中文乱码。
    
9.  解决插入时中文乱码