偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

SpringDataA 和 Mybaits 有什么區(qū)別,如何使用?

開(kāi)發(fā) 架構(gòu)
jpq是面向?qū)ο蟮乃枷?,一個(gè)對(duì)象就是一個(gè)表,強(qiáng)化的是你對(duì)這個(gè)表的控制。jpa繼承的那么多表約束注解也證明了jpa對(duì)這個(gè)數(shù)據(jù)庫(kù)對(duì)象控制很注重。

阿粉之前一直都是使用傳統(tǒng)的SSM進(jìn)行開(kāi)發(fā),也就我們所說(shuō)的 Spring,SpringMVC,Mybatis,即使使用的SpringBoot,無(wú)非也就是這么集中,對(duì)于持久層框架的選擇,也都是Mybaits,但是阿粉無(wú)意中發(fā)現(xiàn),現(xiàn)在使用SpringDataJPA的公司也是非常的多的,所以,今天阿粉來(lái)講一下這個(gè)SpringDataJPA.

SpringDataJPA和Mybaits

什么是JPA

jpq是面向?qū)ο蟮乃枷?,一個(gè)對(duì)象就是一個(gè)表,強(qiáng)化的是你對(duì)這個(gè)表的控制。jpa繼承的那么多表約束注解也證明了jpa對(duì)這個(gè)數(shù)據(jù)庫(kù)對(duì)象控制很注重。

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

Spring Data JPA是Spring Data的子模塊。使用Spring Data,使得基于“repositories”概念的JPA實(shí)現(xiàn)更簡(jiǎn)單和容易。Spring Data JPA的目標(biāo)是大大簡(jiǎn)化數(shù)據(jù)訪問(wèn)層代碼的編碼。作為使用者,我們只需要編寫(xiě)自己的repository接口,接口中包含一些個(gè)性化的查詢方法,Spring Data JPA將自動(dòng)實(shí)現(xiàn)查詢方法.

也就是說(shuō)是什么呢?如果我們要寫(xiě)一個(gè)根據(jù)ID查對(duì)象的方法比如:

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

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

什么是Mybaits

mybatis則是面向sql,你的結(jié)果完全來(lái)源于sql,而對(duì)象這個(gè)東西只是用來(lái)接收sql帶來(lái)的結(jié)果集。你的一切操作都是圍繞sql,包括動(dòng)態(tài)根據(jù)條件決定sql語(yǔ)句等。mybatis并不那么注重對(duì)象的概念。只要能接收到數(shù)據(jù)就好。

而且MyBatis對(duì)于面向?qū)ο蟮母拍顝?qiáng)調(diào)比較少,更適用于靈活的對(duì)數(shù)據(jù)進(jìn)行增、刪、改、查,所以在系統(tǒng)分析和設(shè)計(jì)過(guò)程中,要最大的發(fā)揮MyBatis的效用的話,一般使用步驟則與hibernate有所區(qū)別:

綜合整個(gè)系統(tǒng)分析出系統(tǒng)需要存儲(chǔ)的數(shù)據(jù)項(xiàng)目,并畫(huà)出E-R關(guān)系圖,設(shè)計(jì)表結(jié)構(gòu)

根據(jù)上一步設(shè)計(jì)的表結(jié)構(gòu),創(chuàng)建數(shù)據(jù)庫(kù)、表

編寫(xiě)MyBatis的SQL 映射文件、Pojos以及數(shù)據(jù)庫(kù)操作對(duì)應(yīng)的接口方法

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

但是今天阿粉的重點(diǎn)可不是說(shuō)這個(gè) Mybatis,而是SpringDataJPA

接下來(lái)阿粉就來(lái)詳細(xì)說(shuō)說(shuō)這個(gè)SpringDataJPA

什么是SpringDataJPA

官方文檔先放上

總的來(lái)說(shuō)JPA是ORM規(guī)范,Hibernate是JPA規(guī)范的具體實(shí)現(xiàn),這樣的好處是開(kāi)發(fā)者可以面向JPA規(guī)范進(jìn)行持久層的開(kāi)發(fā),而底層的實(shí)現(xiàn)則是可以切換的。Spring Data Jpa則是在JPA之上添加另一層抽象(Repository層的實(shí)現(xiàn)),極大地簡(jiǎn)化持久層開(kāi)發(fā)及ORM框架切換的成本。

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

因?yàn)镾pring Data Jpa的開(kāi)發(fā)難度要大于Mybatis。主要是由于Hibernate封裝了完整的對(duì)象關(guān)系映射機(jī)制,以至于內(nèi)部的實(shí)現(xiàn)比較復(fù)雜、龐大,學(xué)習(xí)周期較長(zhǎng)。這對(duì)于現(xiàn)在的快捷式開(kāi)發(fā)顯然并不適合,但是因?yàn)槟承┕咀钤绲拈_(kāi)發(fā),所以現(xiàn)在很多公司仍然延續(xù)使用 Spring Data Jpa 來(lái)進(jìn)行開(kāi)發(fā),接下來(lái)阿粉就來(lái)說(shuō)說(shuō)這個(gè) Spring Data Jpa 是如何使用的。

如何使用 SpringDataJPA

我們直接使用SpringBoot 整合一下Spring Data Jpa 來(lái)進(jìn)行操作。來(lái)展示如何使用 Spring Data Jpa。

創(chuàng)建一個(gè) SpringBoot 的項(xiàng)目,

然后加入我們的依賴,或者你在創(chuàng)建的時(shí)候就進(jìn)行選擇,比如選擇好我們接下來(lái)所需要的所有依賴就像這個(gè)樣子。

這個(gè)時(shí)候我們就直接勾選上lombok,然后SpringWeb,還有我們的數(shù)據(jù)庫(kù)驅(qū)動(dòng)的 Jpa 的依賴。

創(chuàng)建完成,我們就能看到已經(jīng)為我們添加好了我們所需要的依賴環(huán)境

  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> 

 

 

如果不會(huì)選依賴的,各位,這肯定是一個(gè)非常好的方式。

接下來(lái)配置一下 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 

看,最后有個(gè)hibernate,這就是之前阿粉說(shuō)的,hibernate提供規(guī)范,

ddl-auto

這個(gè)參數(shù)也是有很多值的,不同的值代表著不同的內(nèi)容。

  • create:每次運(yùn)行程序時(shí),都會(huì)重新創(chuàng)建表,故而數(shù)據(jù)會(huì)丟失
  • create-drop:每次運(yùn)行程序時(shí)會(huì)先創(chuàng)建表結(jié)構(gòu),然后待程序結(jié)束時(shí)清空表
  • upadte:每次運(yùn)行程序,沒(méi)有表時(shí)會(huì)創(chuàng)建表,如果對(duì)象發(fā)生改變會(huì)更新表結(jié)構(gòu),原有數(shù)據(jù)不會(huì)清空,只會(huì)更新(推薦使用)
  • validate:運(yùn)行程序會(huì)校驗(yàn)數(shù)據(jù)與數(shù)據(jù)庫(kù)的字段類型是否相同,字段不同會(huì)報(bào)錯(cuò)
  • none: 禁用DDL處理

然后啟動(dòng)一下,看看是否成功,如果出現(xiàn)數(shù)據(jù)庫(kù)啥的不合適的,肯定是帳號(hào)和密碼寫(xiě)錯(cuò)了,或者連接的數(shù)據(jù)庫(kù)不對(duì),看著改一下。有問(wèn)題就改嘛,這才是好朋友。

看阿粉啟動(dòng)的還是相對(duì)來(lái)說(shuō)很成功的,接下來(lái)我們就得安排一下這個(gè) JPa 的使用方式了。

接下來(lái)我們創(chuàng)建好一組內(nèi)容,Controller,Service,Dao,Entry,

然后是我們實(shí)體類的內(nèi)容和表

  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; 

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

  • TABLE:使用一個(gè)特定的數(shù)據(jù)庫(kù)表格來(lái)保存主鍵
  • SEQUENCE:根據(jù)底層數(shù)據(jù)庫(kù)的序列來(lái)生成主鍵,條件是數(shù)據(jù)庫(kù)支持序列。這個(gè)值要與generator一起使用,generator 指定生成主鍵使用的生成器(可能是orcale中自己編寫(xiě)的序列)
  • IDENTITY:主鍵由數(shù)據(jù)庫(kù)自動(dòng)生成(主要是支持自動(dòng)增長(zhǎng)的數(shù)據(jù)庫(kù),如mysql)
  • AUTO:主鍵由程序控制,也是GenerationType的默認(rèn)值

這時(shí)候 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); 

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

我們來(lái)試試吧。

  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 方法直接調(diào)用 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.     } 

然后我們調(diào)用方法,再看看數(shù)據(jù)庫(kù)

我們成功插入進(jìn)去了一條數(shù)據(jù),也就是說(shuō),這個(gè)方法是沒(méi)什么毛病的呀,那是不是可以把所有的方法都挨著試一遍。

阿粉這里就不再一一的演示了,畢竟很簡(jiǎn)單的。

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

Jpa官方文檔

如果你想使用一下SQL語(yǔ)句呢?

這時(shí)候,你就得寫(xiě)一個(gè)自定義的方法,然后再 Dao 你自定義方法上面加入 @Query注解然后在其中寫(xiě)你的 SQL 語(yǔ)句。

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

?1這個(gè)實(shí)際上就是代表的參數(shù),如果有多個(gè)參數(shù),可以使使用?2

其實(shí)和 Mybaits 的 #{0} 看起來(lái)很類似。

Jpa的簡(jiǎn)單使用,你學(xué)會(huì)了么?說(shuō)實(shí)在的,感覺(jué)這種方式,把代碼和SQL都融合在了一起,感覺(jué)確實(shí)不是很好,至少?gòu)挠^看上面來(lái)說(shuō),體驗(yàn)就非常不好。

 

責(zé)任編輯:武曉燕 來(lái)源: Java極客技術(shù)
相關(guān)推薦

2021-05-16 14:26:08

RPAIPACIO

2024-05-27 00:40:00

2021-12-17 14:40:02

while(1)for(;;)語(yǔ)言

2022-08-02 08:23:37

SessionCookies

2024-09-09 13:10:14

2024-03-05 18:59:59

前端開(kāi)發(fā)localhost

2022-02-27 15:33:22

安全CASBSASE

2020-11-09 14:07:53

PyQtQt編程

2020-03-09 20:56:19

LoRaLoRaWAN無(wú)線技術(shù)

2022-09-07 18:32:57

并發(fā)編程線程

2022-09-08 18:38:26

LinuxWindowsmacOS

2022-06-06 14:53:02

LoRaLoRaWAN

2024-11-01 09:03:41

varGo語(yǔ)言

2024-03-08 08:26:20

防抖節(jié)流delay?

2023-12-15 09:21:17

ObjectJavaString

2022-08-22 07:06:32

MyBatisSQL占位符

2022-08-31 08:33:54

Bash操作系統(tǒng)Linux

2025-03-10 09:30:00

SpringJava開(kāi)發(fā)

2016-12-07 19:55:33

大數(shù)據(jù)深度學(xué)習(xí)

2022-01-14 11:23:57

區(qū)塊鏈比特幣加密貨幣
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)