Spring Boot整合Hibernate(法一).md
阿新 • • 發佈:2018-12-06
- JPA全稱JavaPersistenceAPI.JPA通過JDK5.0註解或XML描述物件-關係表的對映關係,並將執行期的實體物件持久化到資料庫中。
- 配置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>
- 配置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
- 建立實體類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; } }
- 建立Dao層的UserDao介面:、
為了解決抽象各個Java實體基本的“增刪改查”操作,我們通常會以泛型的方式封裝一個模板Dao來進行抽象簡化,但是這樣依然不是很方便,我們需要針對每個實體編寫一個繼承自泛型模板Dao的介面,再編寫該介面的實現。雖然一些基礎的資料訪問已經可以得到很好的複用,但是在程式碼結構上針對每個實體都會有一堆Dao的介面和實現。
由於模板Dao的實現,使得這些具體實體的Dao層已經變的非常“薄”,有一些具體實體的Dao實現可能完全就是對模板Dao的簡單代理,並且往往這樣的實現類可能會出現在很多實體上。Spring-data-jpa的出現正可以讓這樣一個已經很“薄”的資料訪問層變成只是一層介面的編寫方式。
public interface UserDao extends JpaRepository<User,String> {
}
- 建立業務層介面UserService:
public interface UserService {
User getUser();
void save(User user);
}
- 建立業務介面實現類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;
}
}
- 控制層注入業務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";
}
}
- 程式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";//返回檢視
}
}
- 執行訪問:執行main程式,啟動好後,開啟瀏覽器根據配置的地址訪問即可