簡單瞭解Spring Data Jpa
使用idea創建
在POM加入數據庫連接池依賴,並進行相應配置
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
更改mysql的版本號
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.27</version>
</dependency>
配置數據庫連接
在application中配置
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/jpademo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#使用jpa創建表時,默認使用的存儲引擎是myISAM通過制定數據庫版本,可以使用innoDB
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
#show-sql用來展示sql爲了如果出現錯誤排查比較方便
spring.jpa.show-sql=true
#應用啓動是,針對數據庫的操作
spring.jpa.hibernate.ddl-auto=update
#數據庫類型
spring.jpa.database-platform=mysql
創建一個book類
package org.touxian.jpademo.vo;
import javax.persistence.*;
/**
* @author 偷閒
* @date 2019/5/20 14:15
*/
//@Entity表示這是一個實體類,默認情況,類名就是表名,但是,也可以通過name指定
@Entity(name = "books")
public class Book {
//必須要有一個主鍵
@Id
//設置自增
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
//默認情況下,定義的屬性名就是生成表的字段名,但是可以通過@Coloumn指定
@Column(name = "bookauthor")
private String author;
private String bookname;
private String bookprice;
//如果不想讓屬性在數據庫中生產字段名使用 @Transient來忽略一個屬性
@Transient
private String publisher;
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getBookname() {
return bookname;
}
public void setBookname(String bookname) {
this.bookname = bookname;
}
public String getBookprice() {
return bookprice;
}
public void setBookprice(String bookprice) {
this.bookprice = bookprice;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
啓動項目,將會自動生成在數據庫中自動生成books表
操作表中的數據
創建一個Bookmapper接口
package org.touxian.jpademo.mapper;
import org.springframework.data.jpa.repository.JpaRepository;
import org.touxian.jpademo.vo.Book;
/**
* @author 偷閒
* @date 2019/5/20 14:35
*/
public interface Bookmapper extends JpaRepository<Book,Integer> {
}
這樣就自動繼承了增刪改差的一些方法
創建Controller
寫兩個基本方法,一個是查詢全部一個是批量添加
package org.touxian.jpademo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.touxian.jpademo.mapper.Bookmapper;
import org.touxian.jpademo.vo.Book;
import java.util.ArrayList;
import java.util.List;
/**
* @author 偷閒
* @date 2019/5/20 14:40
*/
@Controller
public class BookController {
@Autowired
Bookmapper bookmapper;
@RequestMapping("findall")
@ResponseBody
public List<Book> findall(){
List<Book> alltype= bookmapper.findAll();
return alltype;
}
@RequestMapping("saveallbooks")
@ResponseBody
public String saveallbooks(){
List<Book> books=new ArrayList<>();
for(int i=0;i<10;i++){
Book b=new Book();
b.setAuthor("測試作者"+i);
b.setBookname("測試廠商"+i);
b.setBookprice(String.valueOf(i));
books.add(b);
}
bookmapper.saveAll(books);
return "生成成功";
}
}
生成數據
http://localhost:8080/saveallbooks
查詢所有數據
http://localhost:8080/findall
數據庫操作
排序查詢
@RequestMapping("findorder")
@ResponseBody
public List<Book> findorder(){
List<Book> alltype= bookmapper.findAll(Sort.by(Sort.Order.desc("id")));
return alltype;
}
使用http://localhost:8080/findorder
請求
分頁查詢
@RequestMapping("findpage")
@ResponseBody
public Page<Book> findpage(){
Pageable pageable= PageRequest.of(2,3);
Page<Book> alltype= bookmapper.findAll(pageable);
System.out.println(alltype.getTotalElements());//總記錄數
System.out.println(alltype.getTotalPages());//總頁數
System.out.println(alltype.getContent());//查到的具體數據
System.out.println(alltype.isFirst());//當前頁是否是第一頁
System.out.println(alltype.isLast());//當前頁是否是最後一頁
System.out.println(alltype.getNumber());//當前頁數
System.out.println(alltype.getNumberOfElements());//當前頁的數據數
System.out.println(alltype.getSize());//每頁有多少條,這裏返回的就是size
return alltype;
}
使用http://localhost:8080/findpage
請求
刪除
刪除一個可以採用兩種方式
@RequestMapping("delete")
@ResponseBody
public String delete(Integer id){
bookmapper.deleteById(id);
return "成功";
}
@RequestMapping("delete")
@ResponseBody
public String delete(Integer id){
Book b=new Book();
b.setId(id);
bookmapper.delete(b);
return "成功";
}
採用http://localhost:8080/delete?id=7
刪去id爲7的數據
修改
修改有兩種方式
第一種
@RequestMapping("update1")
@ResponseBody
public String update1(Integer id,String bookname){
Optional<Book> bid=bookmapper.findById(id);
Book book=bid.get();
book.setBookname(bookname);
bookmapper.saveAndFlush(book);
return "成功";
}
使用http://localhost:8080/update1?id=5&bookname=成功更改
請求,可以看到修改成功
第二種
@RequestMapping("update2")
@ResponseBody
public String update2(Integer id,String bookname){
Book book=new Book();
book.setId(id);
book.setBookname(bookname);
bookmapper.saveAndFlush(book);
return "成功";
}
但是創建一個新的類然後更新的方式,需要表裏的全部數據,如果按照上面的寫法,則,id和bookname將被更新,而其他的列將變成null
自定義查詢
使用jpa提供的命名規則
這種方法的好處是不用寫sql語句,比較快捷方便
自定義方法查詢的時候,方法名稱要按照jpa提供的命名規則進行命名
直接在Bookmapper中添加自定義方法,如下
//查詢作者名字包含傳入參數的
List<Book> getBookByAuthorContains(String author);
//查詢以傳入參數結尾並且id大於某個數的數據
List<Book> getBookByIdGreaterThanAndAuthorEndingWith(Integer id,String author);
在controller中調用
@RequestMapping("find1")
@ResponseBody
public List<Book> find1(String author){
List<Book> alltype= bookmapper.getBookByAuthorContains(author);
return alltype;
}
@RequestMapping("find2")
@ResponseBody
public List<Book> find2(Integer id,String author){
List<Book> alltype= bookmapper.getBookByIdGreaterThanAndAuthorContains(id,author);
return alltype;
}
啓動項目請求方法
命名關鍵詞對應的jdbc含義
自定義SQL語句查詢
通過@param註解注入參數,直接寫sql語句即可
//查詢author包含某數據的id最大的Book
@Query(value = "select * from books where bookauthor like %:author% order by id desc limit 1",nativeQuery = true)
List<Book> getAuthorOne(@Param("author") String author);
Controller中調用
@RequestMapping("find3")
@ResponseBody
public List<Book> find3(String author){
List<Book> alltype= bookmapper.getAuthorOne(author);
return alltype;
}
使用http://localhost:8080/find3?author=非人
調用
自定義SQL語句修改添加刪除
在修改的時候需要額外添加註解@Modifying
並且需要配置事務,不然會報事務異常
例子如下
新建bookservice
package org.touxian.jpademo.mapper.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.touxian.jpademo.mapper.Bookmapper;
import javax.transaction.Transactional;
/**
* @author 偷閒
* @date 2019/5/22 10:23
*/
@Service
@Transactional
public class BookService {
@Autowired
Bookmapper bookmapper;
public int updatebyid(String price,Integer id) {
return bookmapper.updatebyid(price, id);
}
}
Controller調用service
在這裏插入代碼片
使用http://localhost:8080/find4?price=10&id=4
請求
最好,項目結構如下