1. 程式人生 > >springboot2.0 整合springDataJpa

springboot2.0 整合springDataJpa

1.pom.xml新增 spring-boot-starter-data-jpa 依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <!-- 資料庫連線池採用阿里druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.9</version>
        </dependency>

        <dependency>
            <groupId>com.googlecode.log4jdbc</groupId>
            <artifactId>log4jdbc</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

2.application.yml配置

spring:
  datasource:
    driver-class-name: net.sf.log4jdbc.DriverSpy
    url: jdbc:log4jdbc:mysql://localhost:3306/datebasename?createDatabaseIfNotExist=true&amp;autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf-8
    username: root
    password: root
    initialSize: 5
    minIdle: 5
    maxActive: 2000
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: select 'x'
    testWhileIdle: true
    testOnBorrow: true
    testOnReturn: true
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    filters: stat,slf4j
    connectionProperties=druid.stat.mergeSql: true;druid.stat.slowSqlMillis=5000
    type: com.alibaba.druid.pool.DruidDataSource
    useGlobalDataSourceStat: true
  jpa:
    database: mysql
    #配置自動建表:updata:沒有表新建,有表更新操作,控制檯顯示建表語句
    hibernate:
      ddl-auto: update
    show-sql: true

3.BaseEntity類和實體類

import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;

/**
 * @Description: TODO(base-entity)
 * @Author: 愛飄de小子  15:54
 * @Date: 2018年08月03日 15點54分
 */
@Data
@MappedSuperclass
public abstract class BaseEntity implements Serializable {

    private static final long serialVersionUID = -4505117821220216969L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id", nullable = false, columnDefinition = "BIGINT UNSIGNED")
    private Long id;


    @Column(name = "create_time", columnDefinition = "datetime  COMMENT '建立時間'")
    private Date createTime;


    @Column(name = "update_time", columnDefinition = "datetime  COMMENT '修改時間'")
    private Date updateTime;


    /**
     * 資料插入前的操作
     */
    @PrePersist
    public void setInsertBefore() {
        this.createTime = new Date();
        this.updateTime = new Date();
    }

    /**
     * 資料修改前的操作
     */
    @PreUpdate
    public void setUpdateBefore() {
        this.updateTime = new Date();
    }

}
import lombok.Data;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Index;
import javax.persistence.Table;
import java.io.Serializable;

/**
 * 普通實體類
 * @Author: 愛飄de小子  10:43
 * @Date: 2018年09月10日 10點43分
 */
@Data
@Entity
//列orderNo新增索引
@Table(name="NoticeHisResult",indexes = {@Index(columnList = "orderNo")})
public class Notice extends BaseEntity implements Serializable {

    private static final long serialVersionUID = 1620243840780887725L;

    @Column(name = "orderNo",nullable = false,columnDefinition = "varchar(50) COMMENT '訂單號'")
    private String orderNo;

    @Column(name = "notice_status", columnDefinition = "int(10) COMMENT '通知狀態: 1-成功 0-失敗'")
    private Integer noticeStatus;

    @Column(name = "notice_desc", columnDefinition = "varchar(500) COMMENT '描述'")
    private String noticeDesc;

    @Column(name = "resultText", columnDefinition = "text COMMENT '返回結果'")
    private String resultText;
}

注: 使用了lombok的@Data註解自動生成get和set方法

4.持久層介面

import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

/**
 * @Author: 愛飄de小子  10:48
 * @Date: 2018年09月10日 10點48分
 */
@Repository
public interface NoticeRepository extends PagingAndSortingRepository<Notice, Long>, JpaSpecificationExecutor<Notice> {

    /**
     * hql
     */
    @Query(value = " from Notice n where n.orderNo = :orderNo ")
    NoticeHisResult findByorderNo(@Param("orderNo") String orderNo);

    /**
     * sql
     */
    @Query(value = " select * from notice n where n.orderNo = :orderNo ",nativeQuery = true)
    NoticeHisResult findByorderNo(@Param("orderNo") String orderNo);

}

注: 1.繼承PagingAndSortingRepository  實現分頁和排序 和基礎增刪改查

        2.繼承JpaSpecificationExecutor  操作複雜sql或者動態sql(上篇文件有具體詳解)

5.關於jpa需要注意的地方

     1.原生sql更新操作:

   /**
     * 原生SQL實現更新方法介面
     */
    @Modifying
    @Query(value = "update notice set notice_desc = :name where id = :id ", nativeQuery = true)
    void updateOne(String noticeDesc,int id);
呼叫updateOne介面的方法上需要加上 @Transactional註解