成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringDataA 和 Mybaits 有什么區別,如何使用?

開發 架構
jpq是面向對象的思想,一個對象就是一個表,強化的是你對這個表的控制。jpa繼承的那么多表約束注解也證明了jpa對這個數據庫對象控制很注重。

阿粉之前一直都是使用傳統的SSM進行開發,也就我們所說的 Spring,SpringMVC,Mybatis,即使使用的SpringBoot,無非也就是這么集中,對于持久層框架的選擇,也都是Mybaits,但是阿粉無意中發現,現在使用SpringDataJPA的公司也是非常的多的,所以,今天阿粉來講一下這個SpringDataJPA.

SpringDataJPA和Mybaits

什么是JPA

jpq是面向對象的思想,一個對象就是一個表,強化的是你對這個表的控制。jpa繼承的那么多表約束注解也證明了jpa對這個數據庫對象控制很注重。

其實,在阿粉的眼中,JPA好像就是和Hibernate是一樣的東西,區別并不大。

Spring Data JPA是Spring Data的子模塊。使用Spring Data,使得基于“repositories”概念的JPA實現更簡單和容易。Spring Data JPA的目標是大大簡化數據訪問層代碼的編碼。作為使用者,我們只需要編寫自己的repository接口,接口中包含一些個性化的查詢方法,Spring Data JPA將自動實現查詢方法.

也就是說是什么呢?如果我們要寫一個根據ID查對象的方法比如:

findUserById(String Id) 首先這個方法的名稱,阿粉起名起的還是比較標準的,如果你在使用SpringDataJPA的話,再repository中直接使用這個方法名,就可以了,但是如果你使用了 Mybaits 的話,可能你需要在xml文件中,或者再方法上寫SQL 就比如這個樣子,

  1. select * from User where id = "xxxxx"

什么是Mybaits

mybatis則是面向sql,你的結果完全來源于sql,而對象這個東西只是用來接收sql帶來的結果集。你的一切操作都是圍繞sql,包括動態根據條件決定sql語句等。mybatis并不那么注重對象的概念。只要能接收到數據就好。

而且MyBatis對于面向對象的概念強調比較少,更適用于靈活的對數據進行增、刪、改、查,所以在系統分析和設計過程中,要最大的發揮MyBatis的效用的話,一般使用步驟則與hibernate有所區別:

綜合整個系統分析出系統需要存儲的數據項目,并畫出E-R關系圖,設計表結構

根據上一步設計的表結構,創建數據庫、表

編寫MyBatis的SQL 映射文件、Pojos以及數據庫操作對應的接口方法

而且現在有很多的Mybaits的插件,用于逆向生成 Mybaits 的文件,比如直接通過你建立的表生成 Dao文件和 dao.xml文件。

但是今天阿粉的重點可不是說這個 Mybatis,而是SpringDataJPA

接下來阿粉就來詳細說說這個SpringDataJPA

什么是SpringDataJPA

官方文檔先放上

總的來說JPA是ORM規范,Hibernate是JPA規范的具體實現,這樣的好處是開發者可以面向JPA規范進行持久層的開發,而底層的實現則是可以切換的。Spring Data Jpa則是在JPA之上添加另一層抽象(Repository層的實現),極大地簡化持久層開發及ORM框架切換的成本。

為什么這么多公司會選擇 Mybaits ,而不選擇使用 SpringDataJPA 呢?

因為Spring Data Jpa的開發難度要大于Mybatis。主要是由于Hibernate封裝了完整的對象關系映射機制,以至于內部的實現比較復雜、龐大,學習周期較長。這對于現在的快捷式開發顯然并不適合,但是因為某些公司最早的開發,所以現在很多公司仍然延續使用 Spring Data Jpa 來進行開發,接下來阿粉就來說說這個 Spring Data Jpa 是如何使用的。

如何使用 SpringDataJPA

我們直接使用SpringBoot 整合一下Spring Data Jpa 來進行操作。來展示如何使用 Spring Data Jpa。

創建一個 SpringBoot 的項目,

然后加入我們的依賴,或者你在創建的時候就進行選擇,比如選擇好我們接下來所需要的所有依賴就像這個樣子。

這個時候我們就直接勾選上lombok,然后SpringWeb,還有我們的數據庫驅動的 Jpa 的依賴。

創建完成,我們就能看到已經為我們添加好了我們所需要的依賴環境

  1. <dependencies> 
  2.        <dependency> 
  3.            <groupId>org.springframework.boot</groupId> 
  4.            <artifactId>spring-boot-starter-data-jpa</artifactId> 
  5.        </dependency> 
  6.        <dependency> 
  7.            <groupId>org.springframework.boot</groupId> 
  8.            <artifactId>spring-boot-starter-web</artifactId> 
  9.        </dependency> 
  10.  
  11.        <dependency> 
  12.            <groupId>mysql</groupId> 
  13.            <artifactId>mysql-connector-java</artifactId> 
  14.            <scope>runtime</scope> 
  15.        </dependency> 
  16.        <dependency> 
  17.            <groupId>org.projectlombok</groupId> 
  18.            <artifactId>lombok</artifactId> 
  19.            <optional>true</optional> 
  20.        </dependency> 
  21.        <dependency> 
  22.            <groupId>org.springframework.boot</groupId> 
  23.            <artifactId>spring-boot-starter-test</artifactId> 
  24.            <scope>test</scope> 
  25.        </dependency> 
  26.    </dependencies> 

 

 

如果不會選依賴的,各位,這肯定是一個非常好的方式。

接下來配置一下 yml 文件

  1. server: 
  2.   port: 8080 
  3.   servlet: 
  4.     context-path: / 
  5. spring: 
  6.   datasource: 
  7.     url: jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false 
  8.     username: root 
  9.     password: 123456 
  10.   jpa: 
  11.     database: MySQL 
  12.     database-platform: org.hibernate.dialect.MySQL5InnoDBDialect 
  13.     show-sql: true 
  14.     hibernate: 
  15.       ddl-auto: update 

看,最后有個hibernate,這就是之前阿粉說的,hibernate提供規范,

ddl-auto

這個參數也是有很多值的,不同的值代表著不同的內容。

  • create:每次運行程序時,都會重新創建表,故而數據會丟失
  • create-drop:每次運行程序時會先創建表結構,然后待程序結束時清空表
  • upadte:每次運行程序,沒有表時會創建表,如果對象發生改變會更新表結構,原有數據不會清空,只會更新(推薦使用)
  • validate:運行程序會校驗數據與數據庫的字段類型是否相同,字段不同會報錯
  • none: 禁用DDL處理

然后啟動一下,看看是否成功,如果出現數據庫啥的不合適的,肯定是帳號和密碼寫錯了,或者連接的數據庫不對,看著改一下。有問題就改嘛,這才是好朋友。

看阿粉啟動的還是相對來說很成功的,接下來我們就得安排一下這個 JPa 的使用方式了。

接下來我們創建好一組內容,Controller,Service,Dao,Entry,

然后是我們實體類的內容和表

  1. @Data 
  2. @Entity 
  3. @Table(name = "user"
  4. public class User { 
  5.     @Id 
  6.     @GenericGenerator(name = "idGenerator", strategy = "uuid"
  7.     @GeneratedValue(generator = "idGenerator"
  8.     private String id; 
  9.     @Column(name = "user_name"unique = true, nullable = false, length = 64) 
  10.     private String userName; 
  11.     @Column(name = "user_password"unique = true, nullable = false, length = 64) 
  12.     private String userPassword; 

這時候主鍵阿粉使用的事uuid的策略,但是 Jpa 也是自帶主鍵生成策略的。

  • TABLE:使用一個特定的數據庫表格來保存主鍵
  • SEQUENCE:根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列。這個值要與generator一起使用,generator 指定生成主鍵使用的生成器(可能是orcale中自己編寫的序列)
  • IDENTITY:主鍵由數據庫自動生成(主要是支持自動增長的數據庫,如mysql)
  • AUTO:主鍵由程序控制,也是GenerationType的默認值

這時候 Dao 需要繼承一下 Jpa 的接口了。

  1. public interface UserDao extends JpaRepository<User, String> {} 

JpaRepository里面可是自帶了不少方法的,

  1. List<T> findAll(); 
  2.  
  3.  List<T> findAll(Sort sort); 
  4.  
  5.  List<T> findAllById(Iterable<ID> ids); 
  6.  
  7.  <S extends T> List<S> saveAll(Iterable<S> entities); 
  8.  
  9.  void flush(); 
  10.  
  11.  <S extends T> S saveAndFlush(S entity); 
  12.  
  13.  <S extends T> List<S> saveAllAndFlush(Iterable<S> entities); 
  14.  
  15.  /** @deprecated */ 
  16.  @Deprecated 
  17.  default void deleteInBatch(Iterable<T> entities) { 
  18.      this.deleteAllInBatch(entities); 
  19.  } 
  20.  
  21.  void deleteAllInBatch(Iterable<T> entities); 
  22.  
  23.  void deleteAllByIdInBatch(Iterable<ID> ids); 
  24.  
  25.  void deleteAllInBatch(); 
  26.  
  27.  /** @deprecated */ 
  28.  @Deprecated 
  29.  T getOne(ID id); 
  30.  
  31.  T getById(ID id); 
  32.  
  33.  <S extends T> List<S> findAll(Example<S> example); 
  34.  
  35.  <S extends T> List<S> findAll(Example<S> example, Sort sort); 

方法是真的不少,主要還是看你怎么使用,

我們來試試吧。

  1. @RestController 
  2. @RequestMapping("/users"
  3. public class UserController { 
  4.  
  5.     @Autowired 
  6.     private UserService userService; 
  7.  
  8.     @RequestMapping(value = "/save"
  9.     public User saveUser() { 
  10.         User user = new User(); 
  11.         user.setUserName("zhangSan"); 
  12.         user.setUserPassword("123456"); 
  13.         return userService.saveUser(user); 
  14.     } 

Service 方法直接調用 UserDao 中的保存,也就是父類中的save方法。

  1. public interface UserService { 
  2.     User saveUser(User user); 
  3.  
  4.  
  5. @Service 
  6. public class UserServiceImpl implements UserService { 
  7.  
  8.     @Autowired 
  9.     private UserDao userDao; 
  10.  
  11.     @Override 
  12.     public User saveUser(User user) { 
  13.         return userDao.save(user); 
  14.     } 

然后我們調用方法,再看看數據庫

我們成功插入進去了一條數據,也就是說,這個方法是沒什么毛病的呀,那是不是可以把所有的方法都挨著試一遍。

阿粉這里就不再一一的演示了,畢竟很簡單的。

如果你覺得這些方法不能夠滿足你的使用,那么你就得繼續看了,畢竟確實不能滿足日常需求呀。就比如說多參數的,查詢,這時候就有And出現,如果有需要,你就得專門的再去 官方文檔中查看了

Jpa官方文檔

如果你想使用一下SQL語句呢?

這時候,你就得寫一個自定義的方法,然后再 Dao 你自定義方法上面加入 @Query注解然后在其中寫你的 SQL 語句。

  1. @Query("select * from User where u.user_password = ?1"
  2. User getByPassword(String password); 

?1這個實際上就是代表的參數,如果有多個參數,可以使使用?2

其實和 Mybaits 的 #{0} 看起來很類似。

Jpa的簡單使用,你學會了么?說實在的,感覺這種方式,把代碼和SQL都融合在了一起,感覺確實不是很好,至少從觀看上面來說,體驗就非常不好。

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2021-05-16 14:26:08

RPAIPACIO

2024-05-27 00:40:00

2021-12-17 14:40:02

while(1)for(;;)語言

2022-08-02 08:23:37

SessionCookies

2024-09-09 13:10:14

2024-03-05 18:59:59

前端開發localhost

2022-02-27 15:33:22

安全CASBSASE

2020-11-09 14:07:53

PyQtQt編程

2020-03-09 20:56:19

LoRaLoRaWAN無線技術

2022-09-07 18:32:57

并發編程線程

2022-09-08 18:38:26

LinuxWindowsmacOS

2022-06-06 14:53:02

LoRaLoRaWAN

2024-11-01 09:03:41

varGo語言

2024-03-08 08:26:20

防抖節流delay?

2023-12-15 09:21:17

ObjectJavaString

2022-08-22 07:06:32

MyBatisSQL占位符

2022-08-31 08:33:54

Bash操作系統Linux

2025-03-10 09:30:00

SpringJava開發

2016-12-07 19:55:33

大數據深度學習

2022-01-14 11:23:57

區塊鏈比特幣加密貨幣
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九热精品视频在线观看 | 精品少妇一区二区三区日产乱码 | 国产精品久久久久一区二区三区 | 国产亚洲一级 | 婷婷毛片| 精品欧美乱码久久久久久1区2区 | 91中文| 久久性| 欧美综合国产精品久久丁香 | 国产精品国产三级国产a | 国产91色在线 | 亚洲 | 欧美一级欧美一级在线播放 | 欧美福利 | 爱爱小视频 | 97视频在线免费 | 日韩一二三区视频 | 午夜在线视频 | h视频在线免费观看 | 成人性视频免费网站 | 成人三区 | 欧美日韩一区二区在线 | 国产成人精品久久二区二区 | 国产yw851.c免费观看网站 | 99精品免费视频 | h视频在线免费 | 伊人影院在线观看 | 久久与欧美 | 久草成人网| 国产在线精品一区二区三区 | 一区二区三区在线免费观看 | 日韩欧美精品一区 | 第一区在线观看免费国语入口 | 国产精品欧美一区二区 | 欧美 日韩 视频 | 欧美激情一区二区三区 | av一区在线观看 | 精品久久99| 黄色网络在线观看 | 中文字幕久久精品 | 亚洲精品二三区 | 精品国产免费人成在线观看 |