国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

springboot+jpa 整合與基本應(yīng)用

nemo / 1984人閱讀

摘要:還定義了一個運行時,用于處理對象的查詢和管理事務(wù)。是持久化規(guī)范中的一個最新版本。旨在統(tǒng)一,,,從目前來看,的確取得了成功。目前大多數(shù)持久化供應(yīng)商已經(jīng)發(fā)布了的實現(xiàn),并被行業(yè)和用戶采用。這些包括由和收購,由收購和由和收購。需注意為時為第一頁。

什么是jpa
JPA (The Java Persistence API)是用于訪問,持久化和管理 Java 對象/類與關(guān)系型數(shù)據(jù)庫之間的數(shù)據(jù)交互的 Java 規(guī)范。JPA 被定義為EJB (Enterprise JavaBeans) 3.0規(guī)范的一部分,作為 EJB 2 CMP 實體 Bean 規(guī)范的替代。

注意,JPA 只是一個標(biāo)準(zhǔn),只定義了一系列接口,而沒有具體的實現(xiàn)。很多企業(yè)級框架提供了對 JPA 的實現(xiàn),如 Spring 。因此 Spring 本身與 JPA 無關(guān),只是提供了對 JPA 的支持,因此在 Spring 中你也會看到很多注解都是屬于 javax.persistence 包的。

JPA 允許 POJO(Plain Old Java Objects)輕松地持久化,而不需要類來實現(xiàn) EJB 2 CM P規(guī)范所需的任何接口或方法。 JPA 還允許通過注解或 XML 定義對象的關(guān)系映射,定義 Java 類如何映射到關(guān)系數(shù)據(jù)庫表。 JPA 還定義了一個運行時 EntityManager API,用于處理對象的查詢和管理事務(wù)。 同時,JPA 定義了對象級查詢語言 JPQL,以允許從數(shù)據(jù)庫中查詢對象,實現(xiàn)了對數(shù)據(jù)庫的解耦合,提高了程序的可移植性,而不具體依賴某一底層數(shù)據(jù)庫。

JPA 是 Java 持久化規(guī)范中的一個最新版本。第一個版本是 OMG 持久性服務(wù) Java 綁定,但這個一個失敗的產(chǎn)品,甚至沒有任何商業(yè)產(chǎn)品支持它。接下來的版本是 EJB 1.0 CMP Entity Beans,它已經(jīng)非常成功地被大型 Java EE 提供程序(BEA,IBM)采用,但是它復(fù)雜性太高而且性能比較差。EJB 2.0 CMP 試圖通過引入本地接口來減少 Entity Bean 的一些復(fù)雜性,但是大多數(shù)復(fù)雜性仍然存在,而且缺乏可移植性。

歷史總是要向前發(fā)展的,種種的這些使得 EJB 3.0 規(guī)范將降低復(fù)雜性作為主要目標(biāo),這導(dǎo)致規(guī)范委員會沿著 JPA 的路徑前進(jìn)。 JPA 旨在統(tǒng)一 EJB 2 CMP,JDO,Hibernate,從目前來看,JPA 的確取得了成功。

目前大多數(shù)持久化供應(yīng)商已經(jīng)發(fā)布了 JPA 的實現(xiàn),并被行業(yè)和用戶采用。這些包括 Hibernate(由 JBoss 和 Red Hat 收購),TopLink(由 Oracle 收購)和 Kodo JDO(由 BEA 和 Oracle 收購)。其他支持 JPA 的產(chǎn)品包括 Cocobase(由 Thought Inc. 收購)和 JPOX。

Spring Boot JPA - 基本使用
導(dǎo)入jar
在pom.xml中加入依賴


        org.springframework.boot
        spring-boot-starter-data-jpa

創(chuàng)建實體
@Entity
public class User{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String phone;
 public String getPhone() {
    return phone;
}
public void setPhone(String phone) {
    this.phone = phone;
}

}
Dao層接口
public interface UserDao extends JpaRepository, JpaSpecificationExecutor {

User findByPhone(String phone);
User findByPhoneAndFlag(String phone, Integer flag);
User findByIdAndFlag(Integer userId, Integer flag);
User findByOpenIdAndFlag(String openId, Integer flag);
Page findByFlag(Integer flag, Pageable pageable);
List findByNewPersonAndFlagOrderByCreateTimeAsc(Integer isNewPerson, Integer flag);
User findById(Integer toBeFollowID);
List findByFlagAndNewPerson(Integer flag, Integer isNewPerson, Pageable pageable);
List findByNicenameIsLikeAndFlagAndNewPerson(String searchName, Integer flag, Integer isNewPerson, Pageable pageable);

}
spring data jpa 默認(rèn)預(yù)先生成了一些基本的CURD的方法,例如:增、刪、改等等

    userDao.save(user);             //保存一個對象
    userDao.save(new List);   //保存多個對象
    userDao.delete(user);           //刪除一個對象
    userDao.delete(id);             //通過id刪除
    userDao.deleteAll();            //刪除所有
    userDao.delete(new ArrayList<>()); //批量刪除
    userDao.findOne(id);        //通過id獲取
    userDao.getOne(id);         //通過id獲取    不推薦使用
    userDao.findAll(pageable);   //分頁查找所有
    userDao.exists(id);             //id是否存在
    ......

除此之外還提供了自定義方法名的方式查詢(在userDao中)

User findByOpenIdAndFlag(String openId, Integer flag);
//等同于
SELECT * FROM "user" WHERE open_id =?1 AND flag = ?2
具體的關(guān)鍵字,使用方法和生產(chǎn)成SQL如下表所示

Keyword Sample JPQL snippet
And findByLastnameAndFirstname where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname where x.lastname = ?1 or x.firstname = ?2
Is,Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals where x.firstname = 1?
Between findByStartDateBetween where x.startDate between 1? and ?2
LessThan findByAgeLessThan where x.age < ?1
LessThanEqual findByAgeLessThanEqual where x.age <= ?1
GreaterThan findByAgeGreaterThan where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual where x.age >= ?1
After findByStartDateAfter where x.startDate > ?1
Before findByStartDateBefore where x.startDate < ?1
IsNull findByAgeIsNull where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull where x.age not null
Like findByFirstnameLike where x.firstname like ?1
NotLike findByFirstnameNotLike where x.firstname not like ?1
StartingWith findByFirstnameStartingWith where x.firstname like ?1
EndingWith findByFirstnameEndingWith where x.firstname like ?1
Containing findByFirstnameContaining where x.firstname like ?1
OrderBy findByAgeOrderByLastnameDesc where x.age = ?1 order by x.lastname desc
Not findByLastnameNot where x.lastname <> ?1
In findByAgeIn(Collection ages) where x.age in ?1
NotIn findByAgeNotIn(Collection age) where x.age not in ?1
True findByActiveTrue() where x.active = true
False findByActiveFalse() where x.active = false
IgnoreCase findByFirstnameIgnoreCase where UPPER(x.firstame) = UPPER(?1)
分頁查詢
直接在controller層封裝好Pageable對象即可

@GetMapping("findBanners")
public Page findBanners(@PageableDefault(sort = {"priority"}, direction=Sort.Direction.ASC) Pageable pageable)
==注意: #ad1f1f==

前端直接在請求的最后拼接上?page=0&size=10

如果前端不傳page 和 size 這兩個參數(shù)過來,那么@PageableDefault會默認(rèn)為第1頁開始,每頁最大條數(shù)為10。需注意page為0時為第一頁。

在service中調(diào)用即可

//返回給客戶端的Page對象,其json格式為
{

"content": [],//數(shù)據(jù)內(nèi)容 
"first": true,//是否為第一頁 
"last": true,//是否為最后一頁 
"number": 0,//當(dāng)前頁碼 
"numberOfElements": 0,//當(dāng)前頁中的實際數(shù)據(jù)條數(shù) 
"size": 0,//一頁最大條數(shù) 
"sort": { },//排序信息 
"totalElements": 0,//總條數(shù) 
"totalPages": 0//總頁數(shù) 

}
自定義分頁
public Page findBanners(int id){

    int page = 1;
    int size = 10;
    Sort sort = new Sort(Sort.Direction.DESC,"priority");
    Pageable pageable = new PageRequest(page,size,sort);
    return bannserDao.findById(id,pageable);
}

動態(tài)查詢
public Page findAdminList(AdminCmsSearchVO adminCmsSearchVO, Pageable pageable) {

    Specifications spec = Specifications.where(commonSpecUtil.like("name", adminCmsSearchVO.getName()))
            .and(commonSpecUtil.equal("clazzType", adminCmsSearchVO.getClazzType()))
            .and(commonSpecUtil.equal("flag",ModelContants.AdminContant.FLAG_IS_TRUE));
    return adminDao.findAll(spec, pageable);
}

//(此代碼由建東提供)
package com.luwei.common.utils;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
/**

Created by jdq on 2017/8/8.

*/
@Component
public class CommonSpecUtil {

/**
 * 精確匹配(equal)
 *
 * @param srcName        字段名
 * @param targetProperty 匹配內(nèi)容
 * @return
 */
public Specification equal(String srcName, Object targetProperty) {
    if (targetProperty == null) {
        return null;
    }
    return (root, query, cb) -> cb.equal(root.get(srcName), targetProperty);
}
/**
 * 精確匹配(notEqual)
 *
 * @param srcName        字段名
 * @param targetProperty 匹配內(nèi)容
 * @return
 */
public Specification notEqual(String srcName, Object targetProperty) {
    if (targetProperty == null) {
        return null;
    }
    return (root, query, cb) -> cb.notEqual(root.get(srcName), targetProperty);
}
/**
 * 模糊匹配(like)
 *
 * @param srcName        字段名
 * @param targetProperty 匹配內(nèi)容
 * @return
 */
public Specification like(String srcName, String targetProperty) {
    if (StringUtils.isEmpty(targetProperty)) {
        return null;
    }
    return (root, query, cb) -> cb.like(root.get(srcName), "%" + targetProperty + "%");
}
/**
 * 日期范圍匹配(timeBetween)
 *
 * @param srcName      字段名
 * @param startTimeStr 開始時間
 * @param endTimeStr   結(jié)束時間
 * @return
 */
public Specification timeBetween(String srcName, String startTimeStr, String endTimeStr) {
    Date startTime, endTime;
    if (StringUtils.isEmpty(startTimeStr)) {
        startTime = DateUtils.getDate2("1970-01-01 00:00:00");
    } else {
        startTime = DateUtils.getDate2(startTimeStr + " 00:00:00");
    }
    if (StringUtils.isEmpty(endTimeStr)) {
        endTime = new Date();
    } else {
        endTime = DateUtils.getDate2(endTimeStr + " 23:59:59");
    }
    return (root, query, cb) -> cb.between(root.get(srcName), startTime, endTime);
}
public Specification parkingOrderTime(String srcName,String startTimeStr,String endTimeStr) {
    Date startTime,endTime;
    startTime=DateUtils.getDate2(DateUtils.tostartDayTime(startTimeStr));
    endTime = DateUtils.getDate2(DateUtils.toEndDayTime(endTimeStr));
    return (root, query, cb) -> cb.between(root.get(srcName), startTime,endTime);
}
/**
 * 日期范圍匹配(timeBetween)
 *
 * @param srcName   字段名
 * @param startTime 開始時間
 * @param endTime   結(jié)束時間
 * @return
 */
public Specification timeBetween(String srcName, Date startTime, Date endTime) {
    if (org.springframework.util.StringUtils.isEmpty(startTime)) {
        return null;
    }
    if (org.springframework.util.StringUtils.isEmpty(endTime)) {
        return null;
    }
    return (root, query, cb) -> cb.between(root.get(srcName), startTime, endTime);
}
/**
 * 數(shù)值范圍匹配(between)
 *
 * @param srcName 字段名
 * @param start   開始
 * @param end     結(jié)束
 * @return
 */
public Specification between(String srcName, Integer start, Integer end) {
    if (org.springframework.util.StringUtils.isEmpty(start)) {
        return null;
    }
    if (org.springframework.util.StringUtils.isEmpty(end)) {
        return null;
    }
    return (root, query, cb) -> cb.between(root.get(srcName), start, end);
}
/**
 * 大于等于(greaterThanOrEqualTo)
 *
 * @param srcName 字段名
 * @param value   數(shù)值
 * @return
 */
public Specification greaterThanOrEqualTo(String srcName, Integer value) {
    if (org.springframework.util.StringUtils.isEmpty(value)) {
        return null;
    }
    return (root, query, cb) -> cb.greaterThanOrEqualTo(root.get(srcName), value);
}
/**
 * 小于等于(lessThanOrEqualTo)
 *
 * @param srcName 字段名
 * @param value   數(shù)值
 * @return
 */
public Specification lessThanOrEqualTo(String srcName, Integer value) {
    if (org.springframework.util.StringUtils.isEmpty(value)) {
        return null;
    }
    return (root, query, cb) -> cb.lessThanOrEqualTo(root.get(srcName), value);
}
/**
 * in條件帥選(in)
 *
 * @param srcName 字段名
 * @param list    集合
 * @return
 */
public Specification in(String srcName, List list) {
    if (org.springframework.util.StringUtils.isEmpty(list)) {
        return null;
    }
    return (root, query, cb) -> cb.and(root.get(srcName).in(list));
}
/**
 * 不為空(isNotNull)
 *
 * @param srcName 字段名
 * @return
 */
public Specification isNotNull(String srcName) {
    return (root, query, cb) -> cb.isNotNull(root.get(srcName));
}
/**
 * 倒序(desc)
 *
 * @param srcName 字段名
 * @return
 */
public Specification desc(String srcName) {
    return (root, query, cb) -> query.orderBy(cb.desc(root.get(srcName).as(Integer.class))).getRestriction();
}
/**
 * 升序(asc)
 *
 * @param srcName 字段名
 * @return
 */
public Specification asc(String srcName) {
    return (root, query, cb) -> query.orderBy(cb.asc(root.get(srcName).as(Integer.class))).getRestriction();
}

}
動態(tài)查找的條件:

1.adminDao要繼承JpaSpecificationExecutor

enter description here

2.CommonSpecUtil提供了各種匹配的方法。如equals,like,notEqual......

參考博客
部分引用于袁荻的博客

原文地址

廣州蘆葦科技Java開發(fā)團(tuán)隊

蘆葦科技-廣州專業(yè)互聯(lián)網(wǎng)軟件服務(wù)公司

抓住每一處細(xì)節(jié) ,創(chuàng)造每一個美好

關(guān)注我們的公眾號,了解更多

想和我們一起奮斗嗎?lagou搜索“ 蘆葦科技 ”或者投放簡歷到 server@talkmoney.cn 加入我們吧

關(guān)注我們,你的評論和點贊對我們最大的支持

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72699.html

相關(guān)文章

  • SpringBoot2.0之三 優(yōu)雅整合Spring Data JPA

    摘要:的配置后在其他低版本的中也有使用這種配置的,具體根據(jù)版本而定。等注解是的相關(guān)知識,后面的文章將詳細(xì)講述。 ??在我們的實際開發(fā)的過程中,無論多復(fù)雜的業(yè)務(wù)邏輯到達(dá)持久層都回歸到了增刪改查的基本操作,可能會存在關(guān)聯(lián)多張表的復(fù)雜sql,但是對于單表的增刪改查也是不可避免的,大多數(shù)開發(fā)人員對于這個簡單而繁瑣的操作都比較煩惱。 ??為了解決這種大量枯燥的簡單數(shù)據(jù)庫操作,大致的解決該問題的有三種方...

    ningwang 評論0 收藏0
  • 一起來學(xué)SpringBoot | 第六篇:整合SpringDataJpa

    摘要:忽略該字段的映射省略創(chuàng)建數(shù)據(jù)訪問層接口,需要繼承,第一個泛型參數(shù)是實體對象的名稱,第二個是主鍵類型。 SpringBoot 是為了簡化 Spring 應(yīng)用的創(chuàng)建、運行、調(diào)試、部署等一系列問題而誕生的產(chǎn)物,自動裝配的特性讓我們可以更好的關(guān)注業(yè)務(wù)本身而不是外部的XML配置,我們只需遵循規(guī)范,引入相關(guān)的依賴就可以輕易的搭建出一個 WEB 工程 上一篇介紹了Spring JdbcTempl...

    Dionysus_go 評論0 收藏0
  • Springboot項目搭建(四)整合MySQL數(shù)據(jù)庫(JPA

    摘要:整合數(shù)據(jù)庫一文件添加依賴二配置文件主參數(shù)指定指定數(shù)據(jù)源用戶名指定數(shù)據(jù)源密碼指定當(dāng)使用內(nèi)嵌數(shù)據(jù)庫時,默認(rèn)是,否則為是否開啟的,默認(rèn)為參考建議配置屬性之三配置實體類主鍵主鍵自增四實現(xiàn)單表操作此處泛型為映射類型 springboot整合MySQL數(shù)據(jù)庫(JPA) 一、POM文件添加依賴 org.springframework.boot spring-boot-starte...

    hikui 評論0 收藏0
  • SpringBoot非官方教程 | 第四篇:SpringBoot 整合JPA

    摘要:全稱通過注解或描述對象關(guān)系表的映射關(guān)系,并將運行期的實體對象持久化到數(shù)據(jù)庫中。從功能上來說,就是功能的一個子集。通過請求測試,代碼已經(jīng)全部通過測試。 JPA全稱Java Persistence API.JPA通過JDK 5.0注解或XML描述對象-關(guān)系表的映射關(guān)系,并將運行期的實體對象持久化到數(shù)據(jù)庫中。 JPA 的目標(biāo)之一是制定一個可以由很多供應(yīng)商實現(xiàn)的API,并且開發(fā)人員可以編碼來實...

    Flands 評論0 收藏0
  • springboot整合hibernate和jpa

    摘要:首先我得先提出幾個創(chuàng)建的項目的做法一來創(chuàng)建創(chuàng)建之后就能用或來導(dǎo)入這個項目了二先創(chuàng)建項目,在上安裝相關(guān)的包例如只需引入即可實現(xiàn)熱部署下面兩個引入為了操作數(shù)據(jù)庫包添 首先我得先提出幾個創(chuàng)建springboot的項目的做法: 一、http://start.spring.io/來創(chuàng)建: showImg(https://segmentfault.com/img/bV3jC1?w=1914&h=8...

    smallStone 評論0 收藏0

發(fā)表評論

0條評論

nemo

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<