Hibernate是數據訪問解決技術絕對霸主,使用O/R映射(Object-Relation Mapping)技術實現數據訪問,O/R映射即將領域模型類和數據庫的表進行映射,通過程序操作對象而實現數據表操作的能力,讓數據訪問操作無須關注數據庫相關的技術。
Hibernate主導了EJB 3.0的JPA規範,JPA即Java Persistence API。JPA是基於O/R映射的標準規範。所謂規範,只定義標準規則(如註解、接口),不提供實現,軟件提供商可以按照標準規範來實現,而使用者只需要按照規範中定義的方式來使用。
本項目實現mysql增,查數據。
一、在mysql創建數據jpa
二,創建SpringBoot項目,勾選web下的web ,SQL下的jpa和MySQL
項目中連接Mysql:
1、點擊Database
2、點擊+號,選中Mysql
3、填寫mysql調用的數據庫名字和mysql賬戶和密碼
三、在resource文件下創建data.sql,添加如下sql語句
#插入數據,學號id是自動增漲的字段,做不用插入,表中需要設置爲自動增漲
INSERT INTO person (name,age,address) VALUES ('汪雲飛',32,'合肥');
INSERT INTO person (name,age,address) VALUES ('xx',31,'北京');
INSERT INTO person (name,age,address) VALUES ('yy',30,'上海');
INSERT INTO person (name,age,address) VALUES ('zz',29,'南京');
INSERT INTO person (name,age,address) VALUES ('aa',28,'武漢');
INSERT INTO person (name,age,address) VALUES ('bb',27,'合肥');
四、配置基本屬性application.properties配置數據源和jpa的相關屬性
#數據源的定義,如果是oracle需要做相應的修改
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/jpa?characterEncoding=utf8&useUnicode=true
spring.datasource.username=root
#密碼是自己的數據庫密碼
spring.datasource.password=******
#指定Data (DML)腳本
#spring.datasource.schema=classpath:schema.sql
#指定Data (DDL)腳本,似乎沒有起作用,等查
spring.datasource.data=classpath:data.sql
spring.datasource.sql-script-encoding=utf-8
#jpa配置
#reate:啓動時刪除上一次生成的表,並根據實體類生成表,表中數據會被清空
#create-drop:啓動時根據實體類生成表,sessionFactory關閉時表會被刪除
#update:啓動時會根據實體類生成表,當實體類屬性變動時,表結構也會更新,開發初期使用
#validate:啓動時驗證實體類與數據表是否一致,在數據穩定時使用此選項
#none:什麼了也不做
#ddl-auto=update沒有表,會新建表但是表內有數據不會被清空,只會更新表結構
spring.jpa.hibernate.ddl-auto=update
#控制檯輸出執行的sql語句
spring.jpa.show-sql=true
#使用json格式的數據顯示更美觀
spring.jackson.serialization.indent-output=true
# 是否生成ddl語句
spring.jpa.generate-ddl=true
五、創建實體類Person使用註解@Entity
package com.hedingjun.entity;
import org.hibernate.annotations.NamedQuery;
import org.hibernate.validator.constraints.Length;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;
//使用正向工程生成的實體類中沒有@Table(實體類映射表名),沒有@Column(屬性映射字段名),和逆向工程不一樣
@Entity //表明是一個與數據庫表映射的實體類
@NamedQuery(name = "Person.withNameAndAddressNamedQuery", query = "select p from Person p where p.name=?1 and p.address=?2")
public class Person {
@Id //表示id字體是主鍵
//@GeneratedValue(strategy = GenerationType.AUTO) //主鍵的生成方式爲自動增漲,hibernate會爲我們自動生成一個名爲HIBERNATE_SEQUENCE的序列
// @GeneratedValue(generator = "persistenceGenerator")
// @GenericGenerator(name = "persistenceGenerator", strategy = "increment")
@GeneratedValue(strategy = GenerationType.IDENTITY) //驗證此句可以在MYSQL中實現自動增漲
private Long id;
@NotNull
@Length(max = 8)
private String name;
private Integer age;
@Length(max = 50)
private String address;
//構造函數
public Person() {
super();
}
public Person(String name, Integer age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
//getters and setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
六、創建數據訪問接口PersonRepository接口
package com.hedingjun.dao;
import com.hedingjun.entity.Person;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
//數據訪問接口定義
public interface PersonRepository extends JpaRepository<Person, Long> {
//使用方法名查詢,接受一個name參數,返回值爲列表
List<Person> findByAddress(String name);
//使用方法名查詢,接受name和address兩個參數,返回值爲單個對象
Person findByNameAndAddress(String name, String address);
//使用@Query查詢,參數按照名稱綁定
@Query("select p from Person p where p.name=:name and p.address=:address")
Person withNameAndAddressQuery(@Param("name") String name, @Param("address") String address);
//使用@NamedQuery查詢,對應實體類中的@NamedQuery的定義
Person withNameAndAddressNamedQuery(String name, String address);
}
七、創建程序控制啓動類 PersonController
package com.hedingjun.controller;
import com.hedingjun.dao.PersonRepository;
import com.hedingjun.entity.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class PersonController {
//自動注入數據訪問接口
@Autowired
private PersonRepository personRepository;
/**
* 保存
* save支持批量保存:<S extends T> Iterable<S> save(Iterable<S> entities);
* 刪除
* 支持使用id刪除對象、批量刪除以及刪除全部
* void delete(Id id);
* void delete(T entity);
* void delete(Iterable<? extends T> entities);
* void deleteAll();
*/
@RequestMapping("/save")
public Person save(String name, String address, Integer age) {
Person p = personRepository.save(new Person(name, age, address));
return p;
}
//測試findByAddress
@RequestMapping("/q1")
public List<Person> q1(String address) {
List<Person> people = personRepository.findByAddress(address);
return people;
}
//測試findByNameAndAddress
@RequestMapping("/q2")
public Person q2(String name, String address) {
Person person = personRepository.findByNameAndAddress(name, address);
return person;
}
//測試withNameAndAddressQuery
@RequestMapping("/q3")
public Person q3(String name, String address) {
Person p = personRepository.withNameAndAddressQuery(name, address);
return p;
}
//測試withNameAndAddressNamedQuery
@RequestMapping("/q4")
public Person q4(String name, String address) {
Person p = personRepository.withNameAndAddressNamedQuery(name, address);
return p;
}
//測試排序
@RequestMapping("/sort")
public List<Person> sort() {
List<Person> p = personRepository.findAll(new Sort(Sort.Direction.ASC, "age"));//按照年齡升序
return p;
}
//測試分頁
@RequestMapping("/page")
public Page<Person> page() {
Page<Person> pagePerson = personRepository.findAll(new PageRequest(1, 2));
return pagePerson;
}
}
八、啓動程序,打開瀏覽器
運行訪問 http://localhost:8080/save?name=dddd&address=上海&age=25
數據庫就添加name爲dddd的數據
http://localhost:8080/q1?address=合肥
瀏覽器查詢顯示出現:
http://localhost:8080/q2?address=合肥&name=汪雲飛
http://localhost:8080/q3?address=合肥&name=汪雲飛
http://localhost:8080/q4?address=合肥&name=汪雲飛
根據年齡實現排序
實現分頁