在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一文詳談Spring JPA

如意 ? 來源:CSDN ? 作者:阿文 ? 2020-06-30 17:29 ? 次閱讀

什么是 JPA

大家好,今天我和大家聊一下關于Spring JPA 的相關知識,我們先來了解下什么是 JPA ?

JPA (Java Persistence API) 是 Sun 官方提出的 Java 持久化規范。它為 Java 開發人員提供了一種對象/關聯映射工具來管理 Java 應用中的關系數據。他的出現主要是為了簡化現有的持久化開發工作和整合 ORM 技術,結束現在 Hibernate,TopLink,JDO 等 ORM 框架各自為營的凌亂局面。JPA 在充分吸收了現有 Hibernate,TopLink,JDO 等ORM框架的基礎上發展而來的,具有易于使用,伸縮性強等優點。從上面的解釋中我們可以了解到JPA 是一套規范,而類似 Hibernate,TopLink,JDO 這些產品是實現了 JPA 規范。

了解了什么是 JPA,我們來看看本文的主角——spring data jpa。

spring data jpa

Spring Data JPA 是 Spring 基于 ORM 框架、JPA 規范的基礎上封裝的一套 JPA 應用框架,底層使用了 Hibernate 的 JPA 技術實現,可使開發者用極簡的代碼即可實現對數據的訪問和操作。它提供了包括增刪改查等在內的常用功能,且易于擴展!學習并使用 Spring Data JPA 可以極大提高開發效率。

什么意思呢?如果用過Hibernate或者MyBatis的話,就會知道對象關系映射(ORM)框架有多么方便。但是Spring Data JPA框架功能更進一步,為我們做了 一個數據持久層框架幾乎能做的任何事情。以Springboot整合MyBatis為例,比如我們要向數據庫中插入一些用戶的數據,那么我們需要先定義用戶的實體類,然后我們要定義一個UserDao:

@RepositorypublicclassUserDao{@Autowired JdbcTemplate jdbcTemplate;publicintaddUser(User user){return jdbcTemplate.update(“INSERT INTO t_user(username,jobs,phone) VALUE (?,?,?)”,user.getName(),user.getJobs(),user.getPhone()); }publicintupdateUser(User user){return jdbcTemplate.update(“UPDATE t_user SET username=?,jobs=?,phone=? WHERE id=?”, user.getName(),user.getJobs(),user.getPhone(),user.getId());}publicintdeleteUser(Integer id){return jdbcTemplate.update(“DELETE FROM t_user WHERE id=?”,id); }public User getUserById(Integer id){return jdbcTemplate.queryForObject(“SELECT * FROM t_user WHERE id =?”,new BeanPropertyRowMapper《》(User.class),id); }public List《User》 getAllUser(){return jdbcTemplate.query(“SELECT * FROM t_user”,new BeanPropertyRowMapper《》(User.class)); }}

以及UserService

@ServicepublicclassUserService{@Autowired UserDao userDao;publicintaddUser(User user){return userDao.addUser(user);}publicintupdateUser(User user){return userDao.updateUser(user);}publicintdeleteUser(Integer id){return userDao.deleteUser(id); }public User getUserById(Integer id){return userDao.getUserById(id); }public List《User》 getAllUser(){return userDao.getAllUser(); }}

最后,我們在去調用對應的service 中的方法。這是傳統的方式,如果使用mapper,會稍微簡單一些,比如我們要添加mapper

@MapperpublicinterfaceUserMapper{intaddUser(User user);intdeleteUser(int id);intupdateUser(User user);User getUserById(Integer id);List《User》 getAllUsers();}

然后定義一個UserMapper.xml ,添加對應的CURD SQL語句,做好映射,然后改造service,例如

@ServicepublicclassUserService{@Autowired UserMapper userMapper;publicintaddUser(User user){return userMapper.addUser(user);}publicintupdateUser(User user){return userMapper.updateUser(user);}publicintdeleteUser(Integer id){return userMapper.deleteUser(id); }public User getUserById(Integer id){return userMapper.getUserById(id); }public List《User》 getAllUser(){return userMapper.getAllUsers(); }}

發現什么問題了嗎?如果我們要去實現多個表的操作,我們需要定義不同的實體類,然后實現對應的mapper,然后寫同樣的增刪改查方法,最后調用。這也太麻煩了些,而Spring data jpa 則可以輕松的幫我們實現這些繁瑣重復且沒有技術含量的操作。我們一起看下吧!

案例演示

1.首先,我們需要配置pom.xml

《dependency》《groupId》mysql《/groupId》《artifactId》mysql-connector-java《/artifactId》《/dependency》《dependency》《groupId》org.springframework.boot《/groupId》《artifactId》spring-boot-starter-data-jpa《/artifactId》《/dependency》

2.然后是application.properties 的配置

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=truespring.datasource.username=rootspring.datasource.password=123456spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.jpa.properties.hibernate.hbm2ddl.auto=createspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialectspring.jpa.show-sql=true

這里重點簡單介紹下spring.jpa.properties.hibernate.hbm2ddl.auto有幾種配置:

create:表示每次加載Hibernate時都會刪除上一次生成的表(包括數據),然后重新生成新表,即使兩次沒有任何修改也會這樣執行。適用于每次執行單測前清空數據庫的場景。

create-drop:表示每次加載Hibernate時都會生成表,但當SessionFactory關閉時,所生成的表將自動刪除。

update:最常用的屬性值,第一次加載Hibernate時創建數據表(前提是需要先有數據庫),以后加載Hibernate時不會刪除上一次生成的表,會根據實體更新,只新增字段,不會刪除字段(即使實體中已經刪除)。

validate:每次加載Hibernate時都會驗證數據表結構,只會和已經存在的數據表進行比較,根據model修改表結構,但不會創建新表。

不配置此項,表示禁用自動建表功能

spring.jpa.show-sql=true 該配置當在執行數據庫操作的時候會在控制臺打印 sql 語句,方便我們檢查排錯等。

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect 這是數據庫的方言配置。

3.接下來我們建立用戶實體類

@EntitypublicclassUser{@Id@GeneratedValueprivatelong id;@Column(nullable = false, unique = true)private String userName;@Column(nullable = false)private String password;@Column(nullable = false)privateint age;}

這里的一些注解解釋如下:

@Entity 是一個類注解,用來注解該類是一個實體類用來進行和數據庫中的表建立關聯關系,首次啟動項目的時候,默認會在數據中生成一個同實體類相同名字的表(table),也可以通過注解中的 name 屬性來修改表(table)名稱, 如@Entity(name=“user”) , 這樣數據庫中表的名稱則是 user 。該注解十分重要,如果沒有該注解首次啟動項目的時候你會發現數據庫沒有生成對應的表。

@Table 注解也是一個類注解,該注解可以用來修改表的名字,該注解完全可以忽略掉不用,@Entity 注解已具備該注解的功能。

@Id 類的屬性注解,該注解表明該屬性字段是一個主鍵,該屬性必須具備,不可缺少。

@GeneratedValue 該注解通常和 @Id 主鍵注解一起使用,用來定義主鍵的呈現形式,該注解通常有多種使用策略,先總結如下:

@GeneratedValue(strategy= GenerationType.IDENTITY) 該注解由數據庫自動生成,主鍵自增型,在 mysql 數據庫中使用最頻繁,oracle 不支持。

@GeneratedValue(strategy= GenerationType.AUTO) 主鍵由程序控制,默認的主鍵生成策略,oracle 默認是序列化的方式,mysql 默認是主鍵自增的方式。

@GeneratedValue(strategy= GenerationType.SEQUENCE) 根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列,Oracle支持,Mysql不支持。

@GeneratedValue(strategy= GenerationType.TABLE) 使用一個特定的數據庫表格來保存主鍵,較少使用。

上面這些主鍵生成策略中,以 mysql 為例, IDENTITY 和 AUTO 用的較多,二者當中 IDENTITY 用的多些,以下文章當中演示的 demo 主鍵均使用 @GeneratedValue(strategy= GenerationType.IDENTITY) 的生成策略。

@Column 是一個類的屬性注解,該注解可以定義一個字段映射到數據庫屬性的具體特征,比如字段長度,映射到數據庫時屬性的具體名字等。

@Transient 是一個屬性注解,該注解標注的字段不會被映射到數據庫當中。

4. 聲明 `UserRepository`接口,繼承`JpaRepository`,如下所示

publicinterfaceUserRepositoryextendsJpaRepository《User, Long》 {}

這里的 JpaRepository繼承了接口PagingAndSortingRepository和QueryByExampleExecutor。而,PagingAndSortingRepository又繼承CrudRepository。

因此,JpaRepository接口同時擁有了基本CRUD功能以及分頁功能。因此,這里我們可以繼承JpaRepository,從而獲得Spring為我們預先定義的多種基本數據操作方法。

5.然后我們定義一個測試類, 這里我們演示下添加操作, @Transactional 表示開啟事務防止出現臟數據。

……@Autowiredprivate UserRepository userRepository;@Test@TransactionalpublicvoiduserAddTest(){ User user = new User(); user.setUserName(“吳彥祖”); user.setAge(30); user.setPassword(“123456”);userRepository.save(user); User item = userRepository.findByUserName(“wyk”);log.info(JsonUtils.toJson(item)); }

6.接下來我們說下查詢,查詢可以分為基本查詢和自定義查詢,一種是 spring data 默認已經實現,只需要要繼承`JpaRepository`,一種是根據查詢的方法來自動解析成 SQL。

@TestpublicvoidtestQuery()throws Exception { User user=new User();userRepository.findAll(); userRepository.findOne(1l); userRepository.save(user);userRepository.delete(user); userRepository.count(); userRepository.exists(1l); ……}

7.自定義的簡單查詢就是根據方法名來自動生成SQL,主要的語法是`findXXBy,readAXXBy,queryXXBy,countXXBy, getXXBy`后面跟屬性名稱,舉幾個例子:

User findByUserName(String userName);User findByUserNameOrEmail(String username, String email);Long deleteById(Long id);Long countByUserName(String userName);List《User》 findByEmailLike(String email);User findByUserNameIgnoreCase(String userName);List《User》 findByUserNameOrderByEmailDesc(String email);

8.接下來,我們說下復雜的查詢,在實際的開發中我們需要用到分頁、刪選、連表等查詢的時候就需要特殊的方法或者自定義 SQL,以分頁查詢為例,分頁查詢在實際使用中非常普遍了,spring data jpa已經幫我們實現了分頁的功能,在查詢的方法中,需要傳入參數Pageable,當查詢中有多個參數的時候Pageable建議做為最后一個參數傳入。Pageable是 spring 封裝的分頁實現類,使用的時候需要傳入頁數、每頁條數和排序規則

Page《User》 findALL(Pageable pageable);Page《User》 findByUserName(String userName,Pageable pageable);

9.我們看下下面的測試用例

@TestpublicvoidtestPageQuery()throws Exception {int page=1,size=5; Sort sort = new Sort(Direction.DESC, “id”); Pageable pageable = new PageRequest(page, size, sort); userRepository.findALL(pageable);userRepository.findByUserName(“testName”, pageable);}

10. Spring data 大部分的 SQL 都可以根據方法名定義的方式來實現,但是由于某些原因我們想使用自定義的 SQL 來查詢,spring data 也是完美支持的,如下所示:

@Modifying@Query(“update User u set u.userName = ?1 where c.id = ?2”)int modifyByIdAndUserId(String userName, Long id);@Transactional@Modifying@Query(“delete from User where id = ?1”)void deleteByUserId(Long id);@Transactional(timeout = 10)@Query(“select u from User u where u.emailAddress = ?1”)User findByEmailAddress(String emailAddress);

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2967

    瀏覽量

    104751
  • spring
    +關注

    關注

    0

    文章

    340

    瀏覽量

    14343
  • JAVA開發
    +關注

    關注

    0

    文章

    13

    瀏覽量

    7561
收藏 人收藏

    評論

    相關推薦

    Spring Boot Starter需要些什么

    pulsar-spring-boot-starter是非常有必要的,在此之前,我們先看看個starter需要些什么。 Spring Boot Starter spring-boot的
    的頭像 發表于 09-25 11:35 ?765次閱讀
    <b class='flag-5'>Spring</b> Boot Starter需要些什么

    Spring事務失效的十種常見場景

    Spring針對Java Transaction API (JTA)、JDBC、Hibernate和Java Persistence API(JPA)等事務 API,實現了致的編程模型,而
    的頭像 發表于 12-11 15:03 ?915次閱讀

    java spring教程

    java spring教程理解Spring 實現原理掌握Spring IOC,AOP掌握Spring的基礎配置和用法熟練使用SSH開發項目Sprin
    發表于 09-11 11:09

    什么是java spring

    什么是java springSpring是個開源框架,它由Rod Johnson創建。它是為了解決企業應用開發的復雜性而創建的。Spring使用基本的JavaBean來完成以前只可能由EJB完成
    發表于 09-11 11:16

    如何用ACM簡化你的Spring Cloud微服務環境配置管理

    摘要: 本文我們就如何使用阿里云ACM這樣的配置管理產品在Spring Cloud中替代Spring Cloud Config幫助簡化環境配置管理做個簡單的示例,幫助你理解基于ACM來簡化微服
    發表于 02-02 14:18

    使用阿里云ACM簡化你的Spring Cloud微服務環境配置管理

    創建了個標準的jpa應用(類似Spring官網的樣例工程 Accessing data with MySQL,我們的工程結構如下圖所示:引入JPA、MySQL、連接池HikariCP
    發表于 07-04 17:16

    JPA分頁查詢的常用方法

    JPA分頁查詢與條件分頁查詢
    發表于 10-23 17:10

    使用jpa和thymeleaf做增刪改查示例

    【本人禿頂程序員】springboot專輯:springboot+jpa+thymeleaf增刪改查示例
    發表于 04-01 11:49

    springboot spring data jpa使用總結

    【本人禿頂程序員】springboot專輯:spring data jpa的使用
    發表于 04-15 11:38

    解析Spring框架

    Spring框架詳解 - 03
    發表于 06-17 17:15

    詳談波峰焊接工藝資料下載

    電子發燒友網為你提供詳談波峰焊接工藝資料下載的電子資料下載,更有其他相關的電路圖、源代碼、課件教程、中文資料、英文資料、參考設計、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發表于 04-29 08:48 ?37次下載
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>詳談</b>波峰焊接工藝資料下載

    Spring認證_什么是Spring GraphQL

    GraphQL 支持通過 HTTP 和 WebSocket 的 GraphQL 請求。 HTTP GraphQlHttpHandler 通過 HTTP 請求處理 GraphQL,并委托給 Web 攔截執行請求。有兩種變體,種用于 Spring MVC,
    的頭像 發表于 08-06 14:30 ?715次閱讀
    <b class='flag-5'>Spring</b>認證_什么是<b class='flag-5'>Spring</b> GraphQL

    Spring認證_什么是Spring GraphQL?

    數據整合 Spring GraphQL 支持使用 Querydsl 通過 Spring Data Querydsl 擴展 來獲取數據。Querydsl 提供了種靈活但類型安全的方法,通過使用注釋
    的頭像 發表于 08-09 11:31 ?625次閱讀
    <b class='flag-5'>Spring</b>認證_什么是<b class='flag-5'>Spring</b> GraphQL?

    使用JPA訪問數據的過程

    本指南將引導您完成構建應用程序的過程,該應用程序使用#spring# #spring認證# Spring Data JPA 在關系數據庫中存儲和檢索數據。
    的頭像 發表于 09-06 15:48 ?641次閱讀

    JPA基礎概念

    些問題隱藏,需要更多的時間去理解、分析才能找到病根。 JPA簡介 JPA全稱(Java Persistence API),通常叫持久層API。它提供面向對象的編程模型,讓使用者更容易理解與上手;底層也提供了通用接口,可以實現與
    的頭像 發表于 10-08 14:36 ?691次閱讀
    <b class='flag-5'>JPA</b>基礎概念
    主站蜘蛛池模板: 狠狠色噜狠狠狠狠| www.午夜| 在线观看国产一级强片| 成人丁香| 美女扒开尿囗给男生桶爽| 看a网站| 亚洲国内精品| 在线观看日本免费视频大片一区| 在线看视频你懂的| 涩久久| 尻老逼| freesex性| 天堂8资源8在线| 国产―笫一页―浮力影院xyz| 综合7799亚洲伊人爱爱网| 中文字幕第一区| 日本三级视频在线播放| 久久黄色精品视频| 伊人网综合在线观看| 久久人人视频| 最猛91大神ben与女教师| 一本到卡二卡三卡免费高| 日本三级香港三级三级人!妇久| 伊人网在线观看| 免费看h的网站| 亚洲婷婷在线视频| 噜噜嘿| 午夜香蕉视频| 动漫精品成人免费网站| 68日本xxxxxxxxx18能看的| 日本免费的一级绿象| 天天爱天天做天天爽天天躁 | 亚洲一区二区三区在线播放| 在线播放色| 国产精品三区四区| 久久久久久久久久免观看| 欧美性黑人极品hd网站| 伊人一区二区三区| 免费观看四虎精品成人| 午夜国产精品福利在线观看| 五月激情网站|