springboot:使用JPA-Hibernate


步驟:

  1. 在pom.xml文件中添加mysql,spring-data-jpa的依賴。

      <!-- 添加mysql數據庫驅動依賴-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
      </dependency>
      <!-- 添加spring-data-jpa依賴 -->
      <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
      </dependency>

2在application.properties文件中配置mysql鏈接屬性。

在res/main/resources下創建一個application.properties文件:

  1. 在application.propertices文件中配置JPA配置信息;

  ##########################################
###datasource--指定mysql數據庫連接信息
###spring.datasource.url:mysql地址
###spring.datasource.user:數據庫用戶名
###spring.datasource.password:數據庫密碼
###spring.datasource.driverClassName:對應數據庫驅動
###spring.datasource.max-active:指定連接池中最大的活躍連接數
###spring.datasource.max-idle:指定連接池最大的空閑連接數量.
###spring.datasource.min-idle:指定必須保持連接的最小值(For DBCP and Tomcat connection pools)
###spring.datasource.initial-size:指定啟動連接池時,初始建立的連接數量
###
###其他信息總結:
###spring.dao.exceptiontranslation.enabled是否開啟PersistenceExceptionTranslationPostProcessor,默認為true
###spring.datasource.abandon-when-percentage-full設定超時被廢棄的連接占到多少比例時要被關閉或上報
###spring.datasource.allow-pool-suspension使用Hikari pool時,是否允許連接池暫停,默認為: false
###spring.datasource.alternate-username-allowed是否允許替代的用戶名.
###spring.datasource.auto-commit指定updates是否自動提交.
###spring.datasource.catalog指定默認的catalog.
###spring.datasource.commit-on-return設置當連接被歸還時,是否要提交所有還未完成的事務
###spring.datasource.connection-init-sql指定連接被創建,再被添加到連接池之前執行的sql.
###spring.datasource.connection-init-sqls使用DBCP connection pool時,指定初始化時要執行的sql
###spring.datasource.connection-properties.[key]在使用DBCP connection pool時指定要配置的屬性
###spring.datasource.connection-test-query指定校驗連接合法性執行的sql語句
###spring.datasource.connection-timeout指定連接的超時時間,毫秒單位.
###spring.datasource.continue-on-error在初始化數據庫時,遇到錯誤是否繼續,默認false
###spring.datasource.data指定Data (DML)腳本
###spring.datasource.data-source-class-name指定數據源的全限定名.
###spring.datasource.data-source-jndi指定jndi的地址
###spring.datasource.data-source-properties.[key]使用Hikari connection pool時,指定要設置的屬性
###spring.datasource.db-properties使用Tomcat connection pool,指定要設置的屬性
###spring.datasource.default-auto-commit是否自動提交.
###spring.datasource.default-catalog指定連接默認的catalog.
###spring.datasource.default-read-only是否設置默認連接只讀.
###spring.datasource.default-transaction-isolation指定連接的事務的默認隔離級別.
###spring.datasource.driver-class-name指定driver的類名,默認從jdbc url中自動探測.
###spring.datasource.fair-queue是否采用FIFO返回連接.
###spring.datasource.health-check-properties.[key]使用Hikari connection pool時,在心跳檢查時傳遞的屬性
###spring.datasource.idle-timeout指定連接多久沒被使用時,被設置為空閑,默認為10ms
###spring.datasource.ignore-exception-on-pre-load當初始化連接池時,是否忽略異常.
###spring.datasource.init-sql當連接創建時,執行的sql
###spring.datasource.initial-size指定啟動連接池時,初始建立的連接數量
###spring.datasource.initialization-fail-fast當創建連接池時,沒法創建指定最小連接數量是否拋異常
###spring.datasource.initialize指定初始化數據源,是否用data.sql來初始化,默認: true
###spring.datasource.isolate-internal-queries指定內部查詢是否要被隔離,默認為false
###spring.datasource.jdbc-interceptors使用Tomcat connection pool時,指定jdbc攔截器,分號分隔
###spring.datasource.jdbc-url指定JDBC URL.
###spring.datasource.jmx-enabled是否開啟JMX,默認為: false
###spring.datasource.jndi-name指定jndi的名稱.
###spring.datasource.leak-detection-threshold使用Hikari connection pool時,多少毫秒檢測一次連接泄露.
###spring.datasource.log-abandoned使用DBCP connection pool,是否追蹤廢棄statement或連接,默認為: false
###spring.datasource.log-validation-errors當使用Tomcat connection pool是否打印校驗錯誤.
###spring.datasource.login-timeout指定連接數據庫的超時時間.
###spring.datasource.max-age指定連接池中連接的最大年齡
###spring.datasource.max-lifetime指定連接池中連接的最大生存時間,毫秒單位.
###spring.datasource.max-open-prepared-statements指定最大的打開的prepared statements數量.
###spring.datasource.max-wait指定連接池等待連接返回的最大等待時間,毫秒單位.
###spring.datasource.maximum-pool-size指定連接池最大的連接數,包括使用中的和空閑的連接.
###spring.datasource.min-evictable-idle-time-millis指定一個空閑連接最少空閑多久后可被清除.
###spring.datasource.min-idle指定必須保持連接的最小值(For DBCP and Tomcat connection pools)
###spring.datasource.minimum-idle指定連接維護的最小空閑連接數,當使用HikariCP時指定.
###spring.datasource.name指定數據源名.
###spring.datasource.num-tests-per-eviction-run指定運行每個idle object evictor線程時的對象數量
###spring.datasource.password指定數據庫密碼.
###spring.datasource.platform指定schema要使用的Platform(schema-${platform}.sql),默認為: all
###spring.datasource.pool-name指定連接池名字.
###spring.datasource.pool-prepared-statements指定是否池化statements.
###spring.datasource.propagate-interrupt-state在等待連接時,如果線程被中斷,是否傳播中斷狀態.
###spring.datasource.read-only當使用Hikari connection pool時,是否標記數據源只讀
###spring.datasource.register-mbeans指定Hikari connection pool是否注冊JMX MBeans.
###spring.datasource.remove-abandoned指定當連接超過廢棄超時時間時,是否立刻刪除該連接.
###spring.datasource.remove-abandoned-timeout指定連接應該被廢棄的時間.
###spring.datasource.rollback-on-return在歸還連接時,是否回滾等待中的事務.
###spring.datasource.schema指定Schema (DDL)腳本.
###spring.datasource.separator指定初始化腳本的語句分隔符,默認: ;
###spring.datasource.sql-script-encoding指定SQL scripts編碼.
###spring.datasource.suspect-timeout指定打印廢棄連接前的超時時間.
###spring.datasource.test-on-borrow當從連接池借用連接時,是否測試該連接.
###spring.datasource.test-on-connect創建時,是否測試連接
###spring.datasource.test-on-return在連接歸還到連接池時是否測試該連接.
###spring.datasource.test-while-idle當連接空閑時,是否執行連接測試.
###spring.datasource.time-between-eviction-runs-millis指定空閑連接檢查、廢棄連接清理、空閑連接池大小調整之間的操作時間間隔
###spring.datasource.transaction-isolation指定事務隔離級別,使用Hikari connection pool時指定
###spring.datasource.url指定JDBC URL.
###spring.datasource.use-disposable-connection-facade是否對連接進行包裝,防止連接關閉之后被使用.
###spring.datasource.use-equals比較方法名時是否使用String.equals()替換==.
###spring.datasource.use-lock是否對連接操作加鎖
###spring.datasource.username指定數據庫名.
###spring.datasource.validation-interval指定多少ms執行一次連接校驗.
###spring.datasource.validation-query指定獲取連接時連接校驗的sql查詢語句.
###spring.datasource.validation-query-timeout指定連接校驗查詢的超時時間.
###spring.datasource.validation-timeout設定連接校驗的超時時間,當使用Hikari connection pool時指定
###spring.datasource.validator-class-name用來測試查詢的validator全限定名.
###spring.datasource.xa.data-source-class-name指定數據源的全限定名.
###spring.datasource.xa.properties指定傳遞給XA data source的屬性
###spring.datasource.url=jdbc:mysql://localhost:3306/test?user=root&password=root&useUnicode=true&characterEncoding=UTF8
##########################################
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10
##########################################
##SPring JPA配置信息
###spring.jpa.database指定目標數據庫.
###spring.jps.show-sq:是否顯示sql語句
###spring.jpa.hibernate.ddl-auto指定DDL mode (none, validate, update, create, create-drop). 當使用內嵌數據庫時,默認是create-drop,否則為none.
###spring.jpa.hibernate.naming-strategy指定命名策略.
###其他:
###spring.jpa.database-platform指定目標數據庫的類型.
###spring.jpa.generate-ddl是否在啟動時初始化schema,默認為false
###spring.jpa.hibernate.ddl-auto指定DDL mode (none, validate, update, create, create-drop). 當使用內嵌數據庫時,默認是create-drop,否則為none.
###spring.jpa.hibernate.naming-strategy指定命名策略.
###spring.jpa.open-in-view是否注冊OpenEntityManagerInViewInterceptor,綁定JPA EntityManager到請求線程中,默認為: true
###spring.jpa.properties添加額外的屬性到JPA provider.
###spring.jpa.show-sql是否開啟sql的log,默認為: false
##########################################
spring.jpa.database = MYSQL
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.freemarker.charset=UTF-8 
  1. 編寫測試案例;

(1). 創建實體類Demo

package com.zhaolixiang.spring_boot1.demo.bean;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * 創建了一個實體類。
 * 
 * 如何持久化呢?
 * 
 * 1、使用@Entity進行實體類的持久化操作,當JPA檢測到我們的實體類當中有
 * 
 * @Entity 注解的時候,會在數據庫中生成對應的表結構信息。
 * 
 * 
 * 如何指定主鍵以及主鍵的生成策略?
 * 
 * 2、使用@Id指定主鍵.
 * 
 * 
 * 
 * @author Angel -- 守護天使
 * @version v.0.1
 * @date 2016年12月17日
 */
@Entity
@Table(name="cat")
public class Cat {
    
    /**
     * 使用@Id指定主鍵.
     * 
     * 使用代碼@GeneratedValue(strategy=GenerationType.AUTO)
     * 指定主鍵的生成策略,mysql默認的是自增長。
     * 
     */
    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;//主鍵.
    
    private String catName;//姓名. cat_name
    
    private int catAge;//年齡. cat_age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getCatName() {
        return catName;
    }

    public void setCatName(String catName) {
        this.catName = catName;
    }

    public int getCatAge() {
        return catAge;
    }

    public void setCatAge(int catAge) {
        this.catAge = catAge;
    }
    
    
}

(2). 創建jpa repository接口操作持久化(CrudREpository)

package com.zhaolixiang.spring_boot1.demo.repository;

import org.springframework.data.repository.CrudRepository;

import com.zhaolixiang.spring_boot1.demo.bean.Cat;

public interface CatRepository  extends CrudRepository<Cat, Integer>{

}

(3). 創建service類

package com.zhaolixiang.spring_boot1.demo.service;

import javax.annotation.Resource;
import javax.transaction.Transactional;

import org.springframework.stereotype.Service;

import com.zhaolixiang.spring_boot1.demo.bean.Cat;
import com.zhaolixiang.spring_boot1.demo.repository.CatRepository;

@Service
public class CatService {
    
    @Resource
    private CatRepository catRepository;
    /**
     * save,update,delete方法需要綁定事物
     * 使用@Transactional進行事物綁定
     */
    //保存數據
    @Transactional
    public void save(Cat cat) {
        catRepository.save(cat);
    }
    //刪除數據
    @Transactional
    public void delete(int id) {
        catRepository.delete(id);
    }
     //查詢數據
    @Transactional
     public Iterable<Cat> getAll() {
         return catRepository.findAll();
        
    }
    

}

(4). 創建restfil請求類

package com.zhaolixiang.spring_boot1.demo.controller;

import javax.annotation.Resource;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.zhaolixiang.spring_boot1.demo.bean.Cat;
import com.zhaolixiang.spring_boot1.demo.service.CatService;


@RestController
@RequestMapping("/cat")
public class CatController {
    
    @Resource
    private CatService catService;
    
    @RequestMapping("/save")
    public String save(){
        Cat cat = new Cat();
        cat.setCatName("jack");
        cat.setCatAge(3);
        catService.save(cat);
        return "save ok.";
    }
    
    @RequestMapping("/delete")
    public String delete(){
        catService.delete(1);
        return "delete ok";
    }
    
    @RequestMapping("/getAll")
    public Iterable<Cat> getAll(){
        return catService.getAll();
    }
    
}

(5). 測試

  1. 總結;

個人在按照上面步驟操作時,demo並沒有在數據庫中定義表結構,最后發現,Demo類文件不在App.class最在的文件目錄中!!!

個人在按照上面步驟操作時,突然讀取不到數據庫的信息,也不報錯,到后來才發現數據庫調用錯了,本來調用服務器來測試的,不知道什么時候調用本地數據庫了,本地數據庫對應表里沒有信息,所有一直調用不到,大一呀!!!

數據庫test不會自動生成,需要首先自己創建。



作者:AiPuff
鏈接:http://www.jianshu.com/p/4d1844a5680c
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM