Spring Boot整合 Jpa教程

Spring Boot整合 Jpa

Spring Boot中的數據持久化方案前面給大夥介紹了兩種
Spring Boot整合JdbcTemplate
Spring Boot配置JdbcTemplate之多數據源
SpringBoot整合MyBatis教程java

Spring Boot整合MyBatis多數據源python

一個是JdbcTemplate,還有一個MyBatis,JdbcTemplate配置簡單,使用也簡單,可是功能也很是有限,MyBatis則比較靈活,功能也很強大,據我所知,公司採用MyBatis作數據持久化的至關多,可是MyBatis並非惟一的解決方案,除了MyBatis以外,還有另一個東西,那就是Jpa。mysql

Jpa介紹

首先須要向大夥介紹一下Jpa,Jpa(Java Persistence API)Java持久化API,它是一套ORM規範,而不是具體的實現,Jpa的江湖地位相似於JDBC,只提供規範,全部的數據庫廠商提供實現(即具體的數據庫驅動),Java領域,小夥伴們熟知的ORM框架可能主要是Hibernate,實際上,除了Hibernate以外,還有不少其餘的ORM框架,例如:web

  • Batoo JPA
  • DataNucleus (formerly JPOX)
  • EclipseLink (formerly Oracle TopLink)
  • IBM, for WebSphere Application Server
  • JBoss with Hibernate
  • Kundera
  • ObjectDB
  • OpenJPA
  • OrientDB from Orient Technologies
  • Versant Corporation JPA (not relational, object database)

Hibernate只是ORM框架的一種,上面列出來的ORM框架都是支持JPA2.0規範的ORM框架。既然它是一個規範,不是具體的實現,那麼必然就不能直接使用(相似於JDBC不能直接使用,必需要加了驅動才能用),咱們使用的是具體的實現,在這裏咱們採用的實現實際上仍是Hibernate。spring

Spring Boot中使用的Jpa其實是Spring Data Jpa,Spring Data是Spring家族的一個子項目,用於簡化SQL和NoSQL的訪問,在Spring Data中,只要你的方法名稱符合規範,它就知道你想幹嗎,不須要本身再去寫SQL。sql

工程建立

建立Spring Boot工程,添加Web、Jpa以及MySQL驅動依賴,以下:數據庫

img

工程建立好以後,添加Druid依賴,完整的依賴以下:app

<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</artifactId>
            <version>1.1.18</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

如此,工程就算建立成功了。框架

基本配置

工程建立完成後,只須要在application.properties中進行數據庫基本信息配置以及Jpa基本配置,以下:ide

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=xiaoliu
spring.datasource.password=960614abcd
spring.datasource.url=jdbc:mysql:///ssm?serverTimezone=UTC

spring.jpa.show-sql=true
spring.jpa.database=mysql
spring.jpa.database-platform=mysql
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect

注意這裏和JdbcTemplate以及MyBatis比起來,多了Jpa配置,Jpa配置含義我都註釋在代碼中了,這裏再也不贅述,須要強調的是,最後一行配置,默認狀況下,自動建立表的時候會使用MyISAM作表的引擎,若是配置了數據庫方言爲MySQL57Dialect,則使用InnoDB作表的引擎。

好了,配置完成後,咱們的Jpa差很少就能夠開始用了。

基本用法

ORM(Object Relational Mapping)框架表示對象關係映射,使用ORM框架咱們沒必要再去建立表,框架會自動根據當前項目中的實體類建立相應的數據表。所以,我這裏首先建立一個Book對象,以下:

@Entity(name = "t_book")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String author;

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
}

首先@Entity註解表示這是一個實體類,那麼在項目啓動時會自動針對該類生成一張表,默認的表名爲類名,@Entity註解的name屬性表示自定義生成的表名。@Id註解表示這個字段是一個id,@GeneratedValue註解表示主鍵的自增加策略,對於類中的其餘屬性,默認都會根據屬性名在表中生成相應的字段,字段名和屬性名相同,若是開發者想要對字段進行定製,可使用@Column註解,去配置字段的名稱,長度,是否爲空等等。

作完這一切以後,啓動Spring Boot項目,就會發現數據庫中多了一個名爲t_book的表了。

針對該表的操做,則須要咱們提供一個Repository,以下:

public interface BookDao extends JpaRepository<Book,Integer> {
    Book findBookById(Integer id);
    List<Book> findBookByIdGreaterThan(Integer id);
    List<Book> findBookByIdLessThanOrNameContaining(Integer id,String name);
    @Query(value = "select * from t_book where id=(select max(id) from t_book)",nativeQuery = true)
    Book getMaxIdBook();
    @Query(value = "insert into t_book(name,author) values(?1,?2)",nativeQuery = true)
    @Modifying
    @Transactional
    Integer addBook(String name,String author);
    @Query(value = "insert into t_book(name,author) values(:name,:author)",nativeQuery = true)
    @Modifying
    @Transactional
    Integer addBook2(@Param("name") String name, @Param("author")String author);
}

這裏,自定義BookDao接口繼承自JpaRepository,JpaRepository提供了一些基本的數據操做方法,例如保存,更新,刪除,分頁查詢等,開發者也能夠在接口中本身聲明相關的方法,只須要方法名稱符合規範便可,在Spring Data中,只要按照既定的規範命名方法,Spring Data Jpa就知道你想幹嗎,這樣就不用寫SQL了,那麼規範是什麼呢?參考下圖:

img

固然,這種方法命名主要是針對查詢,可是一些特殊需求,可能並不能經過這種方式解決,例如想要查詢id最大的用戶,這時就須要開發者自定義查詢SQL了,如上代碼所示,自定義查詢SQL,使用@Query註解,在註解中寫本身的SQL,默認使用的查詢語言不是SQL,而是JPQL,這是一種數據庫平臺無關的面向對象的查詢語言,有點定位相似於Hibernate中的HQL,在@Query註解中設置nativeQuery屬性爲true則表示使用原生查詢,即大夥所熟悉的SQL。上面代碼中的只是一個很簡單的例子,還有其餘一些點,例如若是這個方法中的SQL涉及到數據操做,則須要使用@Modifying註解。

好了,定義完Dao以後,接下來就能夠在測試類中進行測試了

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

    @Autowired
    BookDao bookDao;
    @Test
    public 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(2);
        bookDao.saveAndFlush(book);
    }

    @Test
    public void delete(){
        bookDao.deleteById(2);
    }
    @Test
    public void find1(){
        Optional<Book> byId = bookDao.findById(3);
        System.out.println(byId.get());
        List<Book> all=bookDao.findAll();
        System.out.println(all);
    }
// @Test
// public void find2(){
// List<Book> list = bookDao.findAll(new Sort(Sort.Direction.DESC, "id"));
// System.out.println(list);
// }
    @Test
    public void find3(){
        Pageable pageable= PageRequest.of(0,2 );
        Page<Book> page = bookDao.findAll(pageable);
        System.out.println("總記錄數:"+page.getTotalElements());
        System.out.println("當前頁記錄數:"+page.getNumberOfElements());
        System.out.println("每頁記錄數:"+page.getSize());
        System.out.println("獲取總頁數:"+page.getTotalPages());
        System.out.println("查詢結果:"+page.getContent());
        System.out.println("當前頁(從0開始計):"+page.getNumber());
        System.out.println("是否爲首頁:"+page.isFirst());
        System.out.println("是否爲尾頁:"+page.isLast());
    }
    @Test
    public void find4(){
        Book book=bookDao.findBookById(3);
        System.out.println(book);
    }
    @Test
    public  void find5(){
        List<Book> list = bookDao.findBookByIdGreaterThan(4);
        System.out.println(list);
        List<Book> list1 = bookDao.findBookByIdLessThanOrNameContaining(5, "水");
        System.out.println(list1);

    }
    @Test
    public void find6(){
        Book book=bookDao.getMaxIdBook();
        System.out.println(book);
    }
    @Test
    public void test7(){
        Integer r1 = bookDao.addBook2("java", "小劉");
        System.out.println(r1);
        Integer r2 = bookDao.addBook("python", "老劉");
        System.out.println(r2);
    }
}

如此以後,便可查詢到須要的數據。

好了,本文的重點是Spring Boot和Jpa的整合,這個話題就先說到這裏。

相關文章
相關標籤/搜索