javascript
Spring Data JPA 解析
大人時代變了
過去單應用,已經不能滿足當前的發展了,微服務的時代到來,數據的儲存和讀取需求多樣化,新型數據庫發展迅速,技術也是日新月異。
舊時代JDBC
是我愛死了昨天,誓言割碎你的臉。一切都回不到那是昨天美好的畫面。
一行代碼十個錯的時代遠去了…
public static final String URL = “jdbc:mysql://localhost:3306/test”;
public static final String USER = “root”;
public static final String PASSWORD = “123456”;
public static void main(String[] args) throws Exception {
//1.加載驅動程序
Class.forName(“com.mysql.jdbc.Driver”);
//2. 獲得數據庫連接
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
//3.操作數據庫,實現增刪改查
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(“SELECT * FROM user”);
//如果有數據,rs.next()返回true
while(rs.next()){
System.out.println(rs.getString(“name”)+" 年齡:"+rs.getInt(“age”));
}
雖然新時代里還有白胡子的地位,但是終究他不屬于這個時代。JDBC也一樣,雖然JPA框架底層都是使用了他,但是他終究很難出現在滿足目前的軟件編程需求了。如果現在一個復雜的應用用JDBC寫的話,
新四皇
JDBC完全滿足原來越快的需求,新的框架自然產生了,站在JDBC的基礎之上,站在巨人的肩膀之上,自然望得更遠。
然JDBC肱股之臣,自是不能忘,事物的發展和程序的迭代一樣,不斷的向前。
- MyBatis(iBatis): 依靠簡單的XML或基于注解的配置,將Java POJO映射到數據庫
- Hibernate: ORM框架,比Mybatis難點
- Spring Data JPA: 作為新四皇,還是得到了Hibernate的支持,底層有Hibernate,在Hibernate的基礎之上,進行了封裝,自然大話不說了,簡單就夠了。
四皇呢,
我相信隨著技術的發展,還會有新的身影出現的
Spring Data
Spring Data JPA 是 Spring Data 底下的一個模塊。
Spring Data 的使命是為數據訪問提供熟悉且一致的基于 Spring 的編程模型,同時仍保留底層數據存儲的特??殊特征。
它使使用數據訪問技術、關系和非關系數據庫、map-reduce 框架和基于云的數據服務變得容易。這是一個傘形項目,其中包含許多特定于給定數據庫的子項目。這些項目是通過與這些令人興奮的技術背后的許多公司和開發商合作開發的。
Spring data 官方介紹
Spring Data JPA中的家族
Repository 標記接口,核心
@Indexed public interface Repository<T, ID> {}CrudRepository 接口
定義了增刪改查
@NoRepositoryBean public interface CrudRepository<T, ID> extends Repository<T, ID> {<S extends T> S save(S entity);<S extends T> Iterable<S> saveAll(Iterable<S> entities);Optional<T> findById(ID id);boolean existsById(ID id);Iterable<T> findAll();Iterable<T> findAllById(Iterable<ID> ids);long count();void deleteById(ID id);void delete(T entity);void deleteAllById(Iterable<? extends ID> ids);void deleteAll(Iterable<? extends T> entities);void deleteAll(); }PagingAndSortingRepository
定義分頁查詢和排序的接口
JpaSpecificationExecutor
這個就是開啟新世界的大門,這個類非常的重要。
Jpa中自帶的方法
這里用Spring Boot中使用Spring Data JPA為例子擴展。
通過年齡查找用戶
List findByAge(Integer age);
通過年齡或者姓名查詢
List findByAgeOrName(Integer age,String name);
通過日期區間查詢
List findByBirthBetween(Date birthStart,Date birthStop);
返回類型可以是List也可以是單個實體,如果寫成單個實體,返回是list,則會直接報錯。
自己寫sql語句查詢
/*** 通過年齡查找用戶** @param age 年齡* @return*/@Query(value = "select * from user where age = ?1", nativeQuery = true)List<User> selectByAge(Integer age);寫個@Query把自己的sql方法,在對應需要入參的地方寫上和你參數對應的數字即可,表名寫實際的表名。nativeQuery表名這是原生的Sql,默認是false,這里使用的user表名,故而設置為true。
注意這里的方法和原生的方法最好區別開來。
這里貼上對應的代碼
IUserService
/*** 通過年齡查找用戶*/List<UserDto> selectByAge(Integer age);UserServiceImpl
@Overridepublic List<UserDto> selectByAge(Integer age) {List<UserDto> userDtoList = new ArrayList<UserDto>();List<User> userList= userRepository.selectByAge(age);for(User user : userList) {UserDto userDto = new UserDto();userDto.setAge(user.getAge());userDto.setBirth(user.getBirth());userDto.setId(user.getId());userDto.setName(user.getName());userDtoList.add(userDto);}return userDtoList;}UserController
@RequestMapping(value = "/selectByAge", method = RequestMethod.GET)@ApiOperation(value = "通過年齡查找用戶自定義", httpMethod = "GET")@ApiImplicitParam(name = "age",value = "用戶年齡",required = true,dataType = "Integer")public List<UserDto> selectByAge(@RequestParam(value = "age") Integer age) {return userService.selectByAge(age);}
如果我們把nativeQuery = true 去掉呢。啟動就直接報錯了。
這樣就可以了
@Querty 如果沒有設置nativeQuery = true ,那么就是原生的sql可以直接在數據庫執行,將對應的參數替換即可。未設置的話,就是表是實體的class名字。
這個類叫UserText,select age from UserText where age = 8 就可以這樣寫。age字段就是實際對應的字段。
@Query 主要也就value和nativeQuery兩個屬性比較常用。
總結
以上是生活随笔為你收集整理的Spring Data JPA 解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [附源码]计算机毕业设计springbo
- 下一篇: (02)Cartographer源码无死