在 Spring Boot 中使用 Spring Data JPA

准备工作

所需依赖:

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.23</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <version>8.0.21</version>
        </dependency>

application.properties 配置文件如下:

# 连接数据库的基本配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=Test@123456
spring.datasource.url=jdbc:mysql://xxx.xxx.xxx.xxx:3306/example?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8

# JPA的一般配置
# 打印 SQL 语句
spring.jpa.show-sql=true
# 指定数据库平台
spring.jpa.database=mysql
spring.jpa.database-platform=mysql
# 每次使用时,如果表已经存在,使用更新模式,而不是重新创建一个表
spring.jpa.hibernate.ddl-auto=update
# 指定MySQL的方言版本
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

示例

实体类

新建 bean 包,在 bean 下,新建实体类 Book:

@Data
@Entity(name = "t_book")
public class Book {
    @Id
    // IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式,mysql 支持这种方式
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String author;
}

注解 @Data,来自依赖 lombok,作用是自动生成 getting/setting 方法和 tostring 方法。

注解 @Entity(name = "t_book")表示这是个实体类,并自动在数据库中生成名为 t_book 的表。

注解 @Id 表示 该表的主键是id。

注解 @GeneratedValue(strategy = GenerationType.IDENTITY),表示主键由数据生成,采用数据库自增长。

关于 @GeneratedValue 的详细用法,参考文章:@GeneratedValue 注解详解

数据访问层(Dao层)

新建 dao 包,在 dao 下,新建接口 BookDao:

/**
 *  接口 BookDao 继承接口 JpaRepository
 *  JpaRepository有两个参数:一个是实体类的名称,一个是主键的数据类型
 */
public interface BookDao extends JpaRepository<Book,Integer> {

}

运行启动类,即可在数据库创建出对应的表。

测试

接口 JpaRepository 的源码如下:

@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
    List<T> findAll();

    List<T> findAll(Sort var1);

    List<T> findAllById(Iterable<ID> var1);

    <S extends T> List<S> saveAll(Iterable<S> var1);

    void flush();

    <S extends T> S saveAndFlush(S var1);

    void deleteInBatch(Iterable<T> var1);

    void deleteAllInBatch();

    T getOne(ID var1);

    <S extends T> List<S> findAll(Example<S> var1);

    <S extends T> List<S> findAll(Example<S> var1, Sort var2);
}

如上,它自带了增删改查的方法。

在测试类中,写一个增加数据的方法:

@SpringBootTest
class JpaApplicationTests {
    @Autowired
    BookDao bookDao;

    @Test
    void contextLoads() {
        Book book = new Book();
        book.setName("三国演义");
        book.setAuthor("罗贯中");
        bookDao.save(book);
    }
}

类似的,更新的方法如下:

    @Test
    public void update(){
        Book book = new Book();
        book.setAuthor("luoguanzhong");
        book.setName("sanguoyanyi");
        book.setId(1);
        bookDao.saveAndFlush(book);
    }

删除的方法如下:

    @Test
    public void delete(){
        bookDao.deleteById(2);
    }

查询方法如下:

    @Test
    public void find1(){
        // 按照 id 查询
        Optional<Book> byId = bookDao.findById(2);
        System.out.println(byId.get());
        // 查询所有
        List<Book> all = bookDao.findAll();
        System.out.println(all);
    }

每天学习一点点,每天进步一点点。

posted @ 2020-10-24 23:13  爱吃西瓜的番茄酱  阅读(160)  评论(0编辑  收藏  举报