SpringBoot+hibernate+mysql的數據訪問

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=汪雲飛

    http://localhost:8080/sort

根據年齡實現排序

 

    http://localhost:8080/page

實現分頁

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章