springBoot系列之十六-----整合JPA

首先需要向大伙介绍一下 Jpa,Jpa(Java Persistence API)Java 持久化 API,它是一套 ORM 规范,而不是具体的实现,Jpa 的江湖地位类似于 JDBC,只提供规范,所有的数据库厂商提供实现(即具体的数据库驱动),Java 领域,小伙伴们熟知的 ORM 框架可能主要是 Hibernate。

第一步:添加pom依赖。

       
        
            mysql
            mysql-connector-java
            5.1.47
        
        
        
            com.alibaba
            druid-spring-boot-starter
            1.1.10
        
        
        
            org.springframework.boot
            spring-boot-starter-data-jpa
        

第二步:配置数据源及jpa的一些配置。

#mysql 连接配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=qq123456
spring.datasource.url=jdbc:mysql://localhost:3306/account_a?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=GMT%2B8&useSSL=false

#========================springDataJPA 的一些配置========================
#打印sql日志
spring.jpa.show-sql=true
#指定数据库
spring.jpa.database=mysql
spring.jpa.database-platform=mysql
#创建实体类自动生成表  每次启动如果表存在不生成,不存在生成,
spring.jpa.hibernate.ddl-auto=update
#指定mysql 方言   早期的mysql 的存储引擎是MyISAM 后来才成为InnoDB 不指定mysql方言的话 创建的表的存储引擎是MyISAM
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect

相关的配置说明在注释上面。

第三步:创建实体类并且加入注解。

package com.ja.spring_boot_dome.jpa.bean;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 * 书
 *
 * @author xingChunWei
 */

@Data
@Entity(name = "t_book")  //生成的表名
public class Book {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)  //自增长ID
    private Integer id;
    private String name;
    private String author;
}

实体类上加上@Entity 这个注解才能被JPA扫描到来生成表,不指定表名的以类名来做表名,还要指定一个id主键。

这样直接项目启动就可以自动创建表。打印sql语句。

编写dao层

import com.ja.spring_boot_dome.jpa.bean.Book;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * @author xingChunWei
 */
public interface BookDao extends JpaRepository {
}

编写的数据库交互的接口需要 继承这个类JpaRepository,泛型里面的参数一个是需要操作的实体类,和表的id的类型。

测试接口讲解:

import com.ja.spring_boot_dome.jpa.bean.Book;
import com.ja.spring_boot_dome.jpa.dao.BookDao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;
import java.util.Optional;

/**
 * @author xingChunWei
 */

@RunWith(SpringRunner.class)
@SpringBootTest
public class JpaTest {

    @Autowired
    private BookDao bookDao;

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

    @Test
    public void update() {
/**
 * saveAndFlush() 方法根据Id 判断这条数据是否存在  存在就 更新 不存在添加
 */
        Book book = new Book();
        book.setId(1);
        book.setName("sanguoyanyi");
        book.setAuthor("luoguanzhong");
        bookDao.saveAndFlush(book);
    }

    /**
     * 根据Id 查询
     */
    @Test
    public void findById() {
        Optional book = bookDao.findById(1);
        Book book1 = book.get();
        System.out.println(book1);
    }

    /**
     * 查询所有数据
     */
    @Test
    public void find() {
        List all = bookDao.findAll();
        System.out.println(all);
    }

    /**
     * 根据一个字段  升序或者降序 查询所有
     */
    @Test
    public void find1() {
        Sort sort = new Sort(Sort.Direction.DESC, "id");
        List all = bookDao.findAll(sort);
        System.out.println(all);
    }

    /**
     * 分页查询
     */
    @Test
    public void find2() {
        Pageable pageable = PageRequest.of(0, 2);
        Page books = bookDao.findAll(pageable);

        System.out.println("总记录数:"+books.getTotalElements());
        System.out.println("当前页记录数:"+books.getNumberOfElements());
        System.out.println("每页记录数:"+books.getSize());
        System.out.println("获取总页数:"+books.getTotalPages());
        System.out.println("查询结果:"+books.getContent());
        System.out.println("当前页(从0开始计算):"+books.getNumber());
        System.out.println("是否是首页:"+books.isFirst());
        System.out.println("是否是尾页:"+books.isLast());

    }
}

自定义 BookDao 接口继承自 JpaRepository,JpaRepository 提供了一些基本的数据操作方法,例如保存,更新,删除,分页查询等。但是远远不够的  ,有时候还需要自己自定义一些方法。而JPA自定义方法是有一些规则的。

按照 Spring Data 的规范,查询方法以 find | read | get开头, 涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写。

springBoot系列之十六-----整合JPA_第1张图片

springBoot系列之十六-----整合JPA_第2张图片

例如:

/**
 * @author xingChunWei
 */
public interface BookDao extends JpaRepository {
    /**
     * 根据作者和id查询
     * @param author
     * @param id
     * @return
     */
    List findBookByAuthorOrId(String author, Integer id);
}

测试结果:

 @Test
    public void findBookByAuthorAndId(){
        List books = bookDao.findBookByAuthorOrId("罗贯中", 3);
        System.out.println(books);
    }

 

相应的编写方法 可以根据上面的表格里面的内容来对应操作。

自定义SQL:

1.查询:

 /**
     * 原生sql  查询 数据
     * @param id
     * @return
     */
   // @Query(value = "select * from t_book where id=?1",nativeQuery = true)
    @Query(value = "select * from t_book where id=:id",nativeQuery = true)
    Book  findBookId(@Param("id") Integer id);

使用@Query()注解 来编写sql ,他默认支持Hql格式的sql语句,需要用nativeQuery = true 这个属性来标记成原生sql使用。

2:update/delect /insert

关于自定义sql 添加,删除或者修改的是是否,需要注意一点,必须要在自定义的方法上添加两个注解。

    @Transactional
    @Modifying

  /**
     * 删除
     * @param id
     * @return
     */
    @Query(nativeQuery = true ,value="delete  from t_book where id=?1 ")
    @Transactional
    @Modifying
    Integer delBook(@Param("id") Integer id);

 

 

 

你可能感兴趣的:(springBoot系列之十六-----整合JPA)