怎么入門(mén)SpringJPA

怎么入門(mén)SpringJPA,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

成都創(chuàng)新互聯(lián),專(zhuān)注為中小企業(yè)提供官網(wǎng)建設(shè)、營(yíng)銷(xiāo)型網(wǎng)站制作、成都響應(yīng)式網(wǎng)站建設(shè)、展示型網(wǎng)站制作、做網(wǎng)站等服務(wù),幫助中小企業(yè)通過(guò)網(wǎng)站體現(xiàn)價(jià)值、有效益。幫助企業(yè)快速建站、解決網(wǎng)站建設(shè)與網(wǎng)站營(yíng)銷(xiāo)推廣問(wèn)題。

從一個(gè)helloworld開(kāi)始

建立好springboot的項(xiàng)目后

pom.xml

<dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-web</artifactId></dependency><dependency>   <groupId>org.projectlombok</groupId>   <artifactId>lombok</artifactId>   <optional>true</optional></dependency><dependency>   <groupId>com.alibaba</groupId>   <artifactId>fastjson</artifactId>   <version>1.2.47</version></dependency><dependency>   <groupId>com.alibaba</groupId>   <artifactId>druid</artifactId>   <version>1.0.29</version></dependency><dependency>   <groupId>MySQL</groupId>   <artifactId>mysql-connector-java</artifactId>   <version>8.0.11</version></dependency><dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-test</artifactId>   <scope>test</scope></dependency>

配置文件

spring:  datasource:    driver-class-name: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/jpa?useSSL=FALSE&serverTimezone=GMT%2B8username: rootpassword: roottype: com.alibaba.druid.pool.DruidDataSourcefilters: statmaxActive: 20initialSize: 1maxWait: 60000minIdle: 1timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: select 'x'testWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: truemaxOpenPreparedStatements: 20  jpa:    hibernate:      ddl-auto: updateshow-sql: true

實(shí)體類(lèi)

@Entity@Data@RequiredArgsConstructor@AllArgsConstructor@NoArgsConstructorpublic class User {@Id    @GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;    @NonNull    private String name;    @NonNull    private String email;}

倉(cāng)庫(kù)文件

public interface UserRepository extends CrudRepository<User,Long> {
}

controller

@RestControllerpublic class UserController {@Autowired    private UserRepository userRepository;    @SuppressWarnings("unchecked")@Transactional    @GetMapping("/add")public Result<String> addNewUser(@RequestParam("name") String name,@RequestParam("email") String email) {
        User user = new User(name,email);        userRepository.save(user);        return Result.success("添加用戶(hù)成功");    }@GetMapping("/all")@SuppressWarnings("unchecked")public Result<Iterable<User>> getAllUsers() {return Result.success(userRepository.findAll());    }@GetMapping("/user")@SuppressWarnings("unchecked")public Result<User> getUser(@RequestParam("id") Long id) {return Result.success(userRepository.findById(id));    }
}

也可以直接用名字查詢(xún)

public interface UserAloneRepository extends Repository<User,Long> {
    List<User> findByName(String name);}

在UserController中添加

@Autowiredprivate UserAloneRepository userAloneRepository;
@GetMapping("/user/name")@SuppressWarnings("unchecked")public Result<User> getUserByName(@RequestParam("name") String name) {return Result.success(userAloneRepository.findByName(name));}

jpa的一個(gè)好處是可以不用手工去數(shù)據(jù)庫(kù)建表,一運(yùn)行就可以自動(dòng)建表。

如果要分頁(yè)和排序

public interface UserPagingAndSortingRepository extends PagingAndSortingRepository<User,Long> {
}

Controller中添加

/** * 分頁(yè)和排序 * @return */@SuppressWarnings("unchecked")@GetMapping("/page")public Result<Page<User>> getAllUserByPage() {return Result.success(userPagingAndSortingRepository.findAll(new PageRequest(0,2,new Sort(new Sort.Order(Sort.Direction.ASC,"name")))
    ));}/** * 排序 * @return */@SuppressWarnings("unchecked")@GetMapping("/sort")public Result<Iterable<User>> getAllUserWithSort() {return Result.success(userPagingAndSortingRepository.findAll(new Sort(new Sort.Order(Sort.Direction.ASC,"name"))
    ));}

我們來(lái)看一下他的總體繼承關(guān)系結(jié)構(gòu)圖

怎么入門(mén)SpringJPA

其中SimpleJpaRepository是他們所有接口的實(shí)現(xiàn)類(lèi),而JpaRepository以上其實(shí)都是兼容NOSQL的接口,而只有JpaRepository以下才是對(duì)數(shù)據(jù)庫(kù)特有的接口。

而使用的方法也是一樣,只需要用一個(gè)自定義接口繼承即可

public interface UserJpaRespository extends JpaRepository<User,Long> {
}

jpa有自己的根據(jù)方法名的查詢(xún)生成器機(jī)制,例如之前的UserAloneRepository中的findByName,findBy是固定前綴,Name是屬性名。我們來(lái)看幾個(gè)and、or的查詢(xún)。

public interface UserAloneRepository extends Repository<User,Long> {
    List<User> findByName(String name);    List<User> findByNameAndEmail(String name,String email);    List<User> findByNameOrEmail(String name,String email);}

Controller中的

@SuppressWarnings("unchecked")@GetMapping("/and")public Result<List<User>> getUserByNameAndEmail(@RequestParam("name") String name,@RequestParam("email") String email) {return Result.success(userAloneRepository.findByNameAndEmail(name,email));}@SuppressWarnings("unchecked")@GetMapping("/or")public Result<List<User>> getUserByNameOrEmail(@RequestParam("name") String name,@RequestParam("email") String email) {return Result.success(userAloneRepository.findByNameOrEmail(name,email));}

我們從打印出來(lái)的日志可以看到

Hibernate: select user0_.id as id1_0_, user0_.email as email2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=? and user0_.email=?
Hibernate: select user0_.id as id1_0_, user0_.email as email2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=? or user0_.email=?

其實(shí)就是where語(yǔ)句后面的and和or.

這種and以及or是可以無(wú)限接下去的多條件查詢(xún)。現(xiàn)在我們來(lái)看一下去重和取前幾個(gè)數(shù)據(jù)

public interface UserAloneRepository extends Repository<User,Long> {
    List<User> findByName(String name);    List<User> findByNameAndEmail(String name,String email);    List<User> findByNameOrEmail(String name,String email);    //去重    List<User> findDistinctByName(String name);    //查找前2個(gè)    List<User> findTop2ByName(String name);}

只要加上Distinct和Top數(shù)字就可以了

現(xiàn)在給User實(shí)體類(lèi)增加兩個(gè)字段

@Entity@Data@RequiredArgsConstructor@AllArgsConstructor@NoArgsConstructorpublic class User {@Id    @GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;    @NonNull    private String name;    @NonNull    private String email;    private int age;    private boolean sex;}

啟動(dòng)項(xiàng)目后,數(shù)據(jù)庫(kù)會(huì)自動(dòng)給user表增加上該字段

怎么入門(mén)SpringJPA

所有的jpa關(guān)鍵字如下

public interface UserAloneRepository extends Repository<User,Long> {
    List<User> findByName(String name);    List<User> findByNameAndEmail(String name,String email);    List<User> findByNameOrEmail(String name,String email);    //去重    List<User> findDistinctByName(String name);    //查找前2個(gè)    List<User> findTop2ByName(String name);    //查找小于age參數(shù)的    List<User> findByAgeBefore(int age);    //查找小于age參數(shù)的    List<User> findByAgeLessThan(int age);    //查找小于等于age參數(shù)的    List<User> findByAgeLessThanEqual(int age);    //查找大于age參數(shù)的    List<User> findByAgeAfter(int age);    //查找大于age參數(shù)的    List<User> findByAgeGreaterThan(int age);    //查找大于等于age參數(shù)的    List<User> findByAgeGreaterThanEqual(int age);    //查找name為null的    List<User> findByNameIsNull();    //查找name不為null的    List<User> findByNameNotNull();    //查找like name的(此處不帶%)    List<User> findByNameLike(String name);    //查找not like name的(此處不帶%)    List<User> findByNameNotLike(String name);    //查找like %name(無(wú)后綴%)    List<User> findByNameStartingWith(String name);    //查找like name%(無(wú)前綴%)    List<User> findByNameEndingWith(String name);    //查找like %name%    List<User> findByNameContaining(String name);    //根據(jù)name查找,按照age排序    List<User> findByNameOrderByAgeDesc(String name);    //查找不等于age的    List<User> findByAgeNot(int age);    //根據(jù)age查找在ages集合內(nèi)的    List<User> findByAgeIn(Set<Integer> ages);    //根據(jù)age查找不在ages集合內(nèi)的    List<User> findByAgeNotIn(Set<Integer> ages);    //查找sex為1的    List<User> findBySexTrue();    //查找sex為0的    List<User> findBySexFalse();    //按照email查找,不區(qū)分大小寫(xiě)    List<User> findByEmailIgnoreCase(String email);    //按照name查找總數(shù)    long countByName(String name);    //按照name刪除    //此處是根據(jù)查找出來(lái)的id一條一條刪除的,所以在調(diào)用的時(shí)候必須加事務(wù)    long deleteByName(String name);    //按照name刪除    //此處是根據(jù)查找出來(lái)的id一條一條刪除的,所以在調(diào)用的時(shí)候必須加事務(wù)    List<User> removeByName(String name);}

在刪除時(shí)必須帶上事務(wù)

@Transactional@SuppressWarnings("unchecked")@GetMapping("/delete")public Result<String> deleteByName(@RequestParam("name") String name) {userAloneRepository.deleteByName(name);    return Result.success("刪除成功");}@Transactional@SuppressWarnings("unchecked")@GetMapping("/remove")public Result<List<User>> removeByName(@RequestParam("name") String name) {return Result.success(userAloneRepository.removeByName(name));}

根據(jù)打印的日志可以看到其實(shí)是按照id來(lái)刪除的

Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.email as email3_0_, user0_.name as name4_0_, user0_.sex as sex5_0_ from user user0_ where user0_.name=?
Hibernate: delete from user where id=?
Hibernate: delete from user where id=?

關(guān)于怎么入門(mén)SpringJPA問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

當(dāng)前名稱(chēng):怎么入門(mén)SpringJPA
轉(zhuǎn)載來(lái)于:http://muchs.cn/article38/pieosp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)做網(wǎng)站、電子商務(wù)企業(yè)建站、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)