首頁 > 軟體

spring jpa整合依賴的環境準備及實體類倉庫編寫教學

2022-03-23 13:01:25

一、SpringBoot整合Hibernate JPA的依賴

    compile(
            //hibernate
            'org.springframework.boot:spring-boot-starter-data-jpa',
            'org.hibernate:hibernate-java8',
            'mysql:mysql-connector-java',
            //springmvc
            'org.springframework.boot:spring-boot-starter-web',
            "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
            "com.kingboy:common:$commonVersion"
    )

二、環境準備

1.組態檔

server:
  port: 8080
spring:
  application:
    name: kingboy-springboot-data
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///jpa?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: 123456
    schema: classpath:shema.sql
    data: classpath:data.sql
  jpa:
    hibernate:
      ddl-auto: none

2.建立data.sql和schema.sql

scheme.sql:建表語句,我沒有使用hibernate的建表

CREATE TABLE IF NOT EXISTS `user` (
  `id` bigint(20) NOT NULL,
  `age` int(11) DEFAULT NULL,
  `birth` datetime DEFAULT NULL,
  `password` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `realname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `username` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

data.sql:一些假資料,每次重啟清空重新插入

DELETE FROM `user`;
INSERT INTO `user`
VALUES
        ('1', '56', '2016-09-12 12:12:00', 'king123', '小明', 'boy'),
        ('2', '12', '1993-08-12 07:12:00', 'king123', '小南', 'kingboy'),
        ('3', '11', '1992-05-12 23:12:00', 'king123', '小孩', 'boyking'),
        ('4', '2', '2006-12-13 20:12:00', 'king123', '金子', 'kiboy'),
        ('5', '66', '2012-09-12 05:12:00', 'king123', '哈嘍小金', 'baby'),
        ('6', '12', '2000-02-13 06:12:00', 'king123', 'Baby', 'xiaohong'),
        ('7', '24', '2017-12-12 11:12:00', 'king123', '小金', 'king');

三、實體類

@Entity
public class User {
    @Id
    private Long id;
    private String username;
    private String realname;
    private String password;
    private Integer age;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    private LocalDateTime birth;
    //Setter Getter ...
}

四、編寫倉庫

1.程式碼編寫

寫一個類繼承JpaRepository<T, ID>,需要寫兩個泛型,第一個代表要儲存的實體型別,第二個代表主鍵型別,例如寫一個User類的倉儲如下:

public interface UserRepository extends JpaRepository<User, Long> {
    
}

我們來看一下JpaRepository的繼承結構(如下),其實就可以發現仍然是JPA的一套Reposiroty,那我們其實就可以用JPA的一套介面操作進行資料的增刪改查,
spring會自動根據方法名為我們生成對應的代理類去實現這些方法。

2.CRUD基礎操作

先來看看JpaRepository已經實現的一些基礎方法,這些方法的名稱已經具有很好的說明解釋了,那麼大家自己看看,很容易就能理解

3.稍微複雜操作

jpa自帶的這些方法肯定是不能滿足我們的業務需求的,那麼我們如何自定義方法呢?我們只要使用特定的單詞對方法名進行定義,那麼Spring就會對我們寫的方法名進行解析,
生成對應的範例進行資料處理,有木有很簡單?那麼接下來就使用Spring官方檔案中的範例進行演示。

先來看下官方關鍵字的說明

邏輯操作在定義方法時使用的關鍵詞
ANDAnd
OROr
AFTERAfter , IsAfter
BEFOREBefore , IsBefore
CONTAININGContaining , IsContaining , Contains
BETWEENBetween , IsBetween
ENDING_WITHEndingWith , IsEndingWith , EndsWith
EXISTSExists
FALSEFalse , IsFalse
GREATER_THANGreaterThan , IsGreaterThan
GREATER_THAN_EQUALSGreaterThanEqual , IsGreaterThanEqual
INIn , IsIn
ISIs , Equals , (or no keyword)
IS_EMPTYIsEmpty , Empty
IS_NOT_EMPTYIsNotEmpty , NotEmpty
IS_NOT_NULLNotNull , IsNotNull
IS_NULLNull , IsNull
LESS_THANLessThan , IsLessThan
LESS_THAN_EQUALLessThanEqual , IsLessThanEqual
LIKELike , IsLike
NEARNear , IsNear
NOTNot , IsNot
NOT_INNotIn , IsNotIn
NOT_LIKENotLike , IsNotLike
REGEXRegex , MatchesRegex , Matches
STARTING_WITHStartingWith , IsStartingWith , StartsWith
TRUETrue , IsTrue
WITHINWithin , IsWithin

舉幾個方法的栗子:

使用範例說明
findByNameAndPrice(String name,Double price)根據使用者名稱和價格進行查詢
findByNameOrPrice(String name,Double price)根據使用者名稱或者價格進行查詢
findByName(String name)根據使用者名稱進行查詢
findByNameNot(String name)查詢使用者名稱!=name的使用者
findByPriceBetween(Double a, Double b)查詢價格區間
findByPriceLessThan(Double price)查詢價格小於price,不包含price
findByPriceGreaterThan(Double price)查詢價格大於price,不包含price
findByPriceBefore(Double price)查詢價格小於price,包含price
findByPriceAfterDouble price查詢價格大於price,包含price
findByNameLike(String name)根據使用者名稱查詢??????這個我實驗了下,是完全匹配查詢,並沒有模糊查詢
findByNameStartingWith(String name)使用者名稱以name開頭的使用者
findByNameEndingWith(String name)使用者名稱以name結尾的使用者
findByNameContaining(String name)使用者名稱包含name的使用者,相當於sql中的like %name%
findByNameIn(Collectionnames)查詢使用者名稱在名稱列表的使用者
findByNameNotIn(Collectionnames)查詢使用者名稱不在名稱列表的使用者
findByAvailableTrue查詢avaliable屬性為true的使用者
findByAvailableFalse查詢avaliable屬性為false的使用者
findByAvailableTrueOrderByNameDesc()查詢avaliable屬性為true的使用者,並按使用者名稱排序

如果需要分頁功能的話,只需要在方法的最後一個引數加上Pageable就可以了,下面的範例中有演示

下面寫幾個範例進行演示,只把倉儲層的列出來了,整體執行是測試過的,沒問題,如果需要整體程式碼請到本文頂部的github倉庫檢視。

public interface UserRepository extends JpaRepository<User, Long> {
    /**
     * 查詢使用者名稱為username的使用者
     * @param username
     * @return
     */
    List<User> findByUsername(String username);
    /**
     * 查詢使用者名稱為username的使用者,帶分頁
     * @param username
     * @return
     */
    List<User> findByUsername(String username, Pageable pageable);
    /**
     * 查詢使用者名稱為username並且真實姓名為realname的使用者
     * @param username
     * @param realname
     */
    List<User> findByUsernameAndRealname(String username, String realname);
    /**
     * 查詢使用者名稱為username或者姓名為realname的使用者
     */
    List<User> findByUsernameOrRealname(String username, String realname);
    /**
     * 查詢使用者名稱不是username的所有使用者
     * @param username
     * @return
     */
    List<User> findByUsernameNot(String username);
    /**
     * 查詢年齡段為ageFrom到ageTo的使用者
     * @param ageFrom
     * @param ageTo
     * @return
     */
    List<User> findByAgeBetween(Integer ageFrom, Integer ageTo);
    /**
     * 查詢生日小於birthTo的使用者
     */
    List<User> findByBirthLessThan(LocalDateTime birthTo);
    /**
     * 查詢生日段大於birthFrom的使用者
     * @param birthFrom
     * @return
     */
    List<User> findByBirthGreaterThan(LocalDateTime birthFrom);
    /**
     * 查詢年齡小於或等於ageTo的使用者
     */
    List<User> findByAgeBefore(Integer ageTo);
    /**
     * 查詢年齡大於或等於ageFrom的使用者
     * @param ageFrom
     * @return
     */
    List<User> findByAgeAfter(Integer ageFrom);
    /**
     * 使用者名稱模糊查詢
     * @param username
     * @return
     */
    List<User> findByUsernameLike(String username);
    /**
     * 查詢以start開頭的使用者
     * @param start
     * @return
     */
    List<User> findByUsernameStartingWith(String start);
    /**
     * 查詢以end結尾的使用者
     * @return
     */
    List<User> findByUsernameEndingWith(String end);
    /**
     * 查詢使用者名稱包含word的使用者
     * @param word
     * @return
     */
    List<User> findByUsernameContaining(String word);
    /**
     * 查詢名字屬於usernames中的使用者
     * @param usernames
     * @return
     */
    List<User> findByUsernameIn(Collection<String> usernames);
    /**
     * 查詢名字不屬於usernames中的使用者
     * @param usernames
     * @return
     */
    List<User> findByUsernameNotIn(Collection<String> usernames);
    /**
     *最後來個複雜點的:查詢年齡小於ageTo,姓名以start開頭,id大於idTo的使用者,並且按照年齡倒序
     * @return
     */
    List<User> findByAgeBeforeAndUsernameStartingWithAndIdGreaterThanOrderByAgeDesc(Integer ageTo, String start, Long idTo);
}

4.更復雜一點的操作

我們可以使用@Query註解進行查詢,這樣要求我們自己寫查詢語句,需要會hqlS查詢才可以,其實也很簡單,不會寫查就是了。

注意:hql的方式仍然可以在引數最後一個加Pageable進行分頁,但是nativeQuery不可以。

public interface BookRepository extends ElasticsearchRepository<Book, String> {
       /**
        * 使用@Query和hql進行查詢
        * @param name
        * @return
        */
       @Query("from User where username = :name")
       List<User> findByNameHQL(@Param(value = "name") String name, Pageable pageable);
   
       /**
        * 使用原生sql進行查詢
        * @param name
        * @return
        */
       @Query(value = "select * from user where username = :name", nativeQuery = true)
       List<User> findByNameNative(@Param(value = "name") String name);
}

5.這種通過介面方法的方式也可以進行聯表查詢,以後有機會再補充

以上就是spring jpa整合依賴的環境準備及實體類倉庫編寫教學的詳細內容,更多關於spring jpa整合環境實體類倉庫編寫教學的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com