1. 程式人生 > >Spring Boot整合Hibernate(法一).md

Spring Boot整合Hibernate(法一).md


  • JPA全稱JavaPersistenceAPI.JPA通過JDK5.0註解或XML描述物件-關係表的對映關係,並將執行期的實體物件持久化到資料庫中。
  1. 配置pom.xml檔案:
<!--jpa dependency-->  
<dependency>  
  <groupId>org.springframework.boot</groupId>  
  <artifactId>spring-boot-starter-data-jpa</artifactId>  
</dependency>  
<!--mysql dependency-->  
<dependency>  
  <groupId>mysql</groupId>  
  <artifactId>mysql-connector-java</artifactId>  
  <version>5.1.43</version>  
</dependency>
  1. 配置application.properties:
在application.properties檔案中新增資料庫連線的相關資訊配置

########################################################  
###datasource  
########################################################  
spring.datasource.url = jdbc:mysql://localhost:3306/spring-boot  
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  
########################################################  
### Java Persistence Api  
########################################################  
# Specify the DBMS  
spring.jpa.database = MYSQL  
# Show or not log for each sql query  
spring.jpa.show-sql = true  
# Hibernate ddl auto (create, create-drop, update)  
spring.jpa.hibernate.ddl-auto = update  

spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置屬性,其主要作用是:自動建立、更新、驗證資料庫表結構。該引數的幾種配置如下:

- create:每次載入hibernate時都會刪除上一次的生成的表,然後根據你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是導致資料庫表資料丟失的一個重要原因。
- create-drop:每次載入hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。
- update:最常用的屬性,第一次載入hibernate時根據model類會自動建立起表的結構(前提是先建立好資料庫),以後載入hibernate時根據model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。要注意的是當部署到伺服器後,表結構是不會被馬上建立起來的,是要等應用第一次執行起來後才會。
- validate:每次載入hibernate時,驗證建立資料庫表結構,只會和資料庫中的表進行比較,不會建立新表,但是會插入新值。
  
# Naming strategy  
#[org.hibernate.cfg.ImprovedNamingStrategy #org.hibernate.cfg.DefaultNamingStrategy]  
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy  
# stripped before adding them to the entity manager)  
spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5Dialect
  1. 建立實體類User:
@Entity  
@Table(name = "user")  
public class User implements Serializable {  
    private String id;  
    private String userName;  
    private String password;  
  
    public User() {  
    }  
  
    @Id  
    public String getId() {  
        return id;  
    }  
    @Column  
    public void setId(String id) {  
        this.id = id;  
    }  
  
    public String getUserName() {  
        return userName;  
    }  
    @Column  
    public void setUserName(String userName) {  
        this.userName = userName;  
    }  
  
    public String getPassword() {  
        return password;  
    }  
    @Column  
    public void setPassword(String password) {  
        this.password = password;  
    }  
  
}
  1. 建立Dao層的UserDao介面:、
為了解決抽象各個Java實體基本的“增刪改查”操作,我們通常會以泛型的方式封裝一個模板Dao來進行抽象簡化,但是這樣依然不是很方便,我們需要針對每個實體編寫一個繼承自泛型模板Dao的介面,再編寫該介面的實現。雖然一些基礎的資料訪問已經可以得到很好的複用,但是在程式碼結構上針對每個實體都會有一堆Dao的介面和實現。

由於模板Dao的實現,使得這些具體實體的Dao層已經變的非常“薄”,有一些具體實體的Dao實現可能完全就是對模板Dao的簡單代理,並且往往這樣的實現類可能會出現在很多實體上。Spring-data-jpa的出現正可以讓這樣一個已經很“薄”的資料訪問層變成只是一層介面的編寫方式。
public interface UserDao extends JpaRepository<User,String> {  
}
  1. 建立業務層介面UserService:
public interface UserService {  
  
    User getUser();  
  
    void save(User user);  
}
  1. 建立業務介面實現類UserServiceImpl:
@Service  
public class UserServiceImpl implements UserService{  
    @Autowired  
    private UserDao userDao;  
    @Override  
    public User getUser() {  
       User user =  userDao.findOne("09e7b25c-12f7-43ea-a553-fb34189fce17");  
       return user;  
    }  
  
    @Override  
    public void save(User user) {  
        User u = userDao.save(user);  
        return;  
    }  
}
  1. 控制層注入業務bean:
在UserController類中注入業務bean:

@Controller  
@RequestMapping("/user")  
public class UserController {  
    @Autowired  
    private UserService userService;  
  
    @RequestMapping("/hello")  
    @ResponseBody//返回json資料  
    String home() {  
        return "Hello World    !";  
    }  
  
    @RequestMapping("/get")  
    @ResponseBody  
    public User getUser() {  
       User user = userService.getUser();  
       return user;  
    }  
    @RequestMapping("/save")  
    public String save(Model model){  
        User user = new User();  
        user.setUserName("李四");  
        user.setPassword("123456789");  
        user.setId(UUID.randomUUID().toString());  
        userService.save(user);  
        model.addAttribute("msg","新增資料哇啊");  
        return "index";  
    }  
}
  1. 程式main入口類的註解配置:
找到main程式入口類,在上面加上實體類、持久類的註解@EnableJpaRepositories、@EntityScan:

package com.yunlian.controller;  
  
import com.yunlian.entity.User;  
import org.springframework.boot.*;  
import org.springframework.boot.autoconfigure.*;  
import org.springframework.boot.autoconfigure.domain.EntityScan;  
import org.springframework.context.annotation.ComponentScan;  
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;  
import org.springframework.stereotype.*;  
import org.springframework.ui.Model;  
import org.springframework.web.bind.annotation.*;  
  
@Controller//讓當前啟動入口也成為控制層,如果不想讓當前入口也成為控制層,當前程式入口類可以不加Controller註解  
@SpringBootApplication  
@ComponentScan("com.yunlian")//包名:掃描這個包下面的加了@Controller註解的類及其子包的加了@Controller註解的類,或者加了@Service註解等其他元件註解的類  
@EnableJpaRepositories("com.yunlian.dao") // JPA掃描該包路徑下的Repositorie  
@EntityScan("com.yunlian.entity") // 掃描實體類  
public class SpringBootController {  
  
    public static void main(String[] args) throws Exception {  
        //程式啟動入口,一般該入口檔案不寫成控制層  
        SpringApplication.run(SpringBootController.class, args);  
    }  
    @RequestMapping("/hello")  
    @ResponseBody//返回json資料  
    String home() {  
        return "Hello World!";  
    }  
  
    @RequestMapping("/user")  
    @ResponseBody  
    public User getUser() {  
        User user = new User();  
        user.setId("1");  
        user.setUserName("張三111");  
        user.setPassword("123456789");  
        return user;  
    }  
  
    @RequestMapping("/toJSP")  
    public String toPage(Model model) {  
        System.out.println("3456789");  
        model.addAttribute("msg","歡迎來到異次元世界");  
        return "index";//返回檢視  
    }  
}
  1. 執行訪問:執行main程式,啟動好後,開啟瀏覽器根據配置的地址訪問即可