1. 程式人生 > >spring data jpa一些用法?

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;
    }