spring?jpa集成依賴的環(huán)境準(zhǔn)備及實體類倉庫編寫教程
一、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"
)
二、環(huán)境準(zhǔn)備
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.創(chuàng)建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:一些假數(shù)據(jù),每次重啟清空重新插入
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的繼承結(jié)構(gòu)(如下),其實就可以發(fā)現(xiàn)仍然是JPA的一套Reposiroty,那我們其實就可以用JPA的一套接口操作進(jìn)行數(shù)據(jù)的增刪改查,
spring會自動根據(jù)方法名為我們生成對應(yīng)的代理類去實現(xiàn)這些方法。

2.CRUD基礎(chǔ)操作
先來看看JpaRepository已經(jīng)實現(xiàn)的一些基礎(chǔ)方法,這些方法的名稱已經(jīng)具有很好的說明解釋了,那么大家自己看看,很容易就能理解

3.稍微復(fù)雜操作
jpa自帶的這些方法肯定是不能滿足我們的業(yè)務(wù)需求的,那么我們?nèi)绾巫远x方法呢?我們只要使用特定的單詞對方法名進(jìn)行定義,那么Spring就會對我們寫的方法名進(jìn)行解析,
生成對應(yīng)的實例進(jìn)行數(shù)據(jù)處理,有木有很簡單?那么接下來就使用Spring官方文檔中的實例進(jìn)行演示。
先來看下官方關(guān)鍵字的說明
| 邏輯操作 | 在定義方法時使用的關(guān)鍵詞 |
|---|---|
| AND | And |
| OR | Or |
| AFTER | After , IsAfter |
| BEFORE | Before , IsBefore |
| CONTAINING | Containing , IsContaining , Contains |
| BETWEEN | Between , IsBetween |
| ENDING_WITH | EndingWith , IsEndingWith , EndsWith |
| EXISTS | Exists |
| FALSE | False , IsFalse |
| GREATER_THAN | GreaterThan , IsGreaterThan |
| GREATER_THAN_EQUALS | GreaterThanEqual , IsGreaterThanEqual |
| IN | In , IsIn |
| IS | Is , Equals , (or no keyword) |
| IS_EMPTY | IsEmpty , Empty |
| IS_NOT_EMPTY | IsNotEmpty , NotEmpty |
| IS_NOT_NULL | NotNull , IsNotNull |
| IS_NULL | Null , IsNull |
| LESS_THAN | LessThan , IsLessThan |
| LESS_THAN_EQUAL | LessThanEqual , IsLessThanEqual |
| LIKE | Like , IsLike |
| NEAR | Near , IsNear |
| NOT | Not , IsNot |
| NOT_IN | NotIn , IsNotIn |
| NOT_LIKE | NotLike , IsNotLike |
| REGEX | Regex , MatchesRegex , Matches |
| STARTING_WITH | StartingWith , IsStartingWith , StartsWith |
| TRUE | True , IsTrue |
| WITHIN | Within , IsWithin |
舉幾個方法的栗子:
| 使用示例 | 說明 |
|---|---|
| findByNameAndPrice(String name,Double price) | 根據(jù)用戶名和價格進(jìn)行查詢 |
| findByNameOrPrice(String name,Double price) | 根據(jù)用戶名或者價格進(jìn)行查詢 |
| findByName(String name) | 根據(jù)用戶名進(jìn)行查找 |
| findByNameNot(String name) | 查找用戶名!=name的用戶 |
| findByPriceBetween(Double a, Double b) | 查詢價格區(qū)間 |
| findByPriceLessThan(Double price) | 查詢價格小于price,不包含price |
| findByPriceGreaterThan(Double price) | 查詢價格大于price,不包含price |
| findByPriceBefore(Double price) | 查詢價格小于price,包含price |
| findByPriceAfterDouble price | 查詢價格大于price,包含price |
| findByNameLike(String name) | 根據(jù)用戶名查詢??????這個我實驗了下,是完全匹配查詢,并沒有模糊查詢 |
| findByNameStartingWith(String name) | 用戶名以name開頭的用戶 |
| findByNameEndingWith(String name) | 用戶名以name結(jié)尾的用戶 |
| findByNameContaining(String name) | 用戶名包含name的用戶,相當(dāng)于sql中的like %name% |
| findByNameIn(Collectionnames) | 查詢用戶名在名稱列表的用戶 |
| findByNameNotIn(Collectionnames) | 查詢用戶名不在名稱列表的用戶 |
| findByAvailableTrue | 查詢avaliable屬性為true的用戶 |
| findByAvailableFalse | 查詢avaliable屬性為false的用戶 |
| findByAvailableTrueOrderByNameDesc() | 查詢avaliable屬性為true的用戶,并按用戶名排序 |
如果需要分頁功能的話,只需要在方法的最后一個參數(shù)加上Pageable就可以了,下面的示例中有演示
下面寫幾個示例進(jìn)行演示,只把倉儲層的列出來了,整體運(yùn)行是測試過的,沒問題,如果需要整體代碼請到本文頂部的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結(jié)尾的用戶
* @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);
/**
*最后來個復(fù)雜點的:查詢年齡小于ageTo,姓名以start開頭,id大于idTo的用戶,并且按照年齡倒序
* @return
*/
List<User> findByAgeBeforeAndUsernameStartingWithAndIdGreaterThanOrderByAgeDesc(Integer ageTo, String start, Long idTo);
}
4.更復(fù)雜一點的操作
我們可以使用@Query注解進(jìn)行查詢,這樣要求我們自己寫查詢語句,需要會hqlS查詢才可以,其實也很簡單,不會寫查就是了。
注意:hql的方式仍然可以在參數(shù)最后一個加Pageable進(jìn)行分頁,但是nativeQuery不可以。
public interface BookRepository extends ElasticsearchRepository<Book, String> {
/**
* 使用@Query和hql進(jìn)行查詢
* @param name
* @return
*/
@Query("from User where username = :name")
List<User> findByNameHQL(@Param(value = "name") String name, Pageable pageable);
/**
* 使用原生sql進(jìn)行查詢
* @param name
* @return
*/
@Query(value = "select * from user where username = :name", nativeQuery = true)
List<User> findByNameNative(@Param(value = "name") String name);
}
5.這種通過接口方法的方式也可以進(jìn)行聯(lián)表查詢,以后有機(jī)會再補(bǔ)充
以上就是spring jpa集成依賴的環(huán)境準(zhǔn)備及實體類倉庫編寫教程的詳細(xì)內(nèi)容,更多關(guān)于spring jpa集成環(huán)境實體類倉庫編寫教程的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java并發(fā)編程——volatile關(guān)鍵字
這篇文章主要介紹了Java并發(fā)編程——volatile關(guān)鍵字的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java并發(fā)編程,感興趣的朋友可以了解下2020-10-10

