简单了解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
请求
最好,项目结构如下