spring data jpa一些用法?
一 如何引入spring data jpa 所需Jar包,此處用的maven依賴匯入。
maven依賴如下:
<!-- 資料庫持久化標準 entity實體使用 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 資料庫連線池依賴 以及連線Mysql資料庫依賴 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
二 此處用的alibaba 一個開源資料池,我們用spring boot yml配置資訊如下:
server:
port: 8083 #配置埠
spring:
application:
name: datummicroservice1
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.163.20.99:3306/bhpp2.0_datummngtservice?useSSL=false
username: root
password: root
# 下面為連線池的補充設定,應用到上面所有資料來源中
initialSize: 5 #初始化大小
minIdle: 5 #最小
maxActive: 20 #最大
maxWait: 60000 # 配置獲取連線等待超時的時間
timeBetweenEvictionRunsMillis: 60000 # 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒
minEvictableIdleTimeMillis: 300000 # 配置一個連線在池中最小生存的時間,單位是毫秒
validationQuery: SELECT 1 FROMDUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true # 開啟PSCache,並且指定每個連線上PSCache的大小
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat,wall,log4j # 配置監控統計攔截的filters,去掉後監控介面sql無法統計,'wall'用於防火牆
#通過connectProperties屬性來開啟mergeSql功能;慢SQL記錄
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合併多個DruidDataSource的監控資料
#spring.datasource.useGlobalDataSourceStat=true
jpa:
hibernate:
ddl-auto: update
show-sql: true
三介紹一些spring data jpa 的增刪改查
增
save(R)
改 可以 用新增的save方法,也可以用@Query 註解 寫sql語句來修改。
@Modifying
@Transactional
@Query(value = "update DatumFile df set df.uploadTime=:uploadTime,df.fileSize=:fileSize,df.uploadPerNum=:uploadPerNum,df.fileName=:fileName,df.realName=:realName WHERE df.fileNum =:fileNum")
public int updateDatumFileByFileNum(@Param("uploadTime") Date uploadTime, @Param("fileSize") String fileSize,
@Param("uploadPerNum") String uploadPerNum, @Param("fileName") String fileName,
@Param("realName") String realName, @Param("fileNum") String fileNum);
刪 刪除一般用sql語句來刪。
@Modifying
@Transactional
@Query(value = "DELETE DatumFile df WHERE df.fileNum =:fileNum")
public int deleteDatumFileData(@Param("fileNum") String fileNum);
查
根據單個屬性查
public DatumFile findByFileNum(String fileNum);
public List<Thing> findByThingNumIn(List<String> thingNumList);
根據 兩個屬性查或的關係。
public List<Thing> findByChargePerNumOrManagerNum(String chargePerNum, String managerNum);
根據 兩個屬性查與的關係。
public List<Thing> findByChargePerNumAndManagerNum(String chargePerNum, String managerNum);
根據一個屬性查另一個屬性進行排序Desc 是降序 , Asc 是升序。
public List<DatumFile> findByDatumNumOrderByUploadTimeDesc(String datumNum);
原生態sql語句進行查詢
@Query(value = "select * from book b where b.name=?1", nativeQuery = true) List<Book> findByName(String name); @Query(value = "select * from book b where b.name=:name", nativeQuery = true) List<Book> findByName(@Param("name")String name);
jpa註解注入sql語句查詢
@Query(value = "select name,author,price from Book b where b.name = :name AND b.author=:author AND b.price=:price") List<Book> findByNamedParam(@Param("name") String name, @Param("author") String author,@Param("price") long price);
分頁查詢詳解。
導層編寫。
@Repository
public interface DatumDao extends JpaRepository<DatumEntity, Integer>, JpaSpecificationExecutor<DatumEntity> {}
servicece層編寫。
@Transactional
public Map<String, Object> findDatumByPage(Map<String, Object> paramMap) {
int currentPage = (int) paramMap.get("currentPage");
int pageSize = (int) paramMap.get("pageSize");
String keyWord = (String) paramMap.get("keyWord");// 選擇 1資料編號 2 資料名稱
String queryValue = (String) paramMap.get("queryValue");// 輸入值
List<String> queryDate = (List<String>) paramMap.get("queryDate");// 上傳時間陣列
// jpa分頁查詢
Sort sort = new Sort(new Order(Direction.DESC, "fileUploadTime"));// 按上傳時間倒序
PageRequest pageRequest = new PageRequest(currentPage - 1, pageSize, sort);
// 條件
Specification<DatumEntity> spec = new Specification<DatumEntity>() {
@Override
public Predicate toPredicate(Root<DatumEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<Predicate>();
// 關鍵字資料編號
if (queryValue != null && !"".equals(keyWord) && "1".equals(keyWord)) {
predicates.add(cb.like(root.get("datumNum"), "%" + queryValue + "%"));
}
// 關鍵字資料名稱
if (queryValue != null && !"".equals(keyWord) && "2".equals(keyWord)) {
predicates.add(cb.like(root.get("datumName"), "%" + queryValue + "%"));
}
// 上傳時間陣列
if (queryDate != null && queryDate.size() != 0 && !"".equals(queryDate.toString())) {
predicates.add(cb.between(root.get("fileUploadTime").as(String.class), queryDate.get(0),
queryDate.get(1)));
}
predicates.add(cb.equal(root.get("workPerNum"), workPerNum));
predicates.add(cb.in(root.get("thingNum")).value(thingNumList));
Predicate[] arr = new Predicate[predicates.size()];
return cb.and(predicates.toArray(arr));
}
};
Page<DatumEntity> page = datumDao.findAll(spec, pageRequest);
// 新增錄入人名稱
List<DatumEntity> datumEntityList = page.getContent();
for (DatumEntity datumEntity : datumEntityList) {
Map<String, Object> workItemDatumMap = null;
try {
workItemDatumMap = requestHrService.findWorkItemDatumByDatum(datumEntity.getDatumNum());
} catch (Exception e1) {
e1.printStackTrace();
}
if (workItemDatumMap != null) {
datumEntity.setDatumType((int) workItemDatumMap.get("datumType"));
} else {
datumEntity.setDatumType(3);
}
String personJsonStr;
try {
personJsonStr = requestHrService.getPersonByNumber(datumEntity.getWritePerNum());
} catch (Exception e) {
personJsonStr = null;
e.printStackTrace();
}
if (personJsonStr == null) {
datumEntity.setWritePerName("--");
} else {
Map<String, Object> personMap = JSON.parseObject(personJsonStr, Map.class);
datumEntity.setWritePerName((String) personMap.get("name"));
}
}
Map<String, Object> map = new HashMap<String, Object>();
map.put("total", page.getTotalElements()); // 總記錄數
map.put("contentList", datumEntityList); // 當前頁面內容
// map.put("contentList", page.getContent()); // 當前頁面內容
map.put("pageNumber", page.getNumber() + 1);// 當前頁
map.put("totalPage", page.getTotalPages()); // 總頁數
return map;
}