首先需要向大伙介绍一下 Jpa,Jpa(Java Persistence API)Java 持久化 API,它是一套 ORM 规范,而不是具体的实现,Jpa 的江湖地位类似于 JDBC,只提供规范,所有的数据库厂商提供实现(即具体的数据库驱动),Java 领域,小伙伴们熟知的 ORM 框架可能主要是 Hibernate。
第一步:添加pom依赖。
mysql
mysql-connector-java
5.1.47
com.alibaba
druid-spring-boot-starter
1.1.10
org.springframework.boot
spring-boot-starter-data-jpa
第二步:配置数据源及jpa的一些配置。
#mysql 连接配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=qq123456
spring.datasource.url=jdbc:mysql://localhost:3306/account_a?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=GMT%2B8&useSSL=false
#========================springDataJPA 的一些配置========================
#打印sql日志
spring.jpa.show-sql=true
#指定数据库
spring.jpa.database=mysql
spring.jpa.database-platform=mysql
#创建实体类自动生成表 每次启动如果表存在不生成,不存在生成,
spring.jpa.hibernate.ddl-auto=update
#指定mysql 方言 早期的mysql 的存储引擎是MyISAM 后来才成为InnoDB 不指定mysql方言的话 创建的表的存储引擎是MyISAM
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
相关的配置说明在注释上面。
第三步:创建实体类并且加入注解。
package com.ja.spring_boot_dome.jpa.bean;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
/**
* 书
*
* @author xingChunWei
*/
@Data
@Entity(name = "t_book") //生成的表名
public class Book {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY) //自增长ID
private Integer id;
private String name;
private String author;
}
实体类上加上@Entity 这个注解才能被JPA扫描到来生成表,不指定表名的以类名来做表名,还要指定一个id主键。
这样直接项目启动就可以自动创建表。打印sql语句。
编写dao层
import com.ja.spring_boot_dome.jpa.bean.Book;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* @author xingChunWei
*/
public interface BookDao extends JpaRepository {
}
编写的数据库交互的接口需要 继承这个类JpaRepository
import com.ja.spring_boot_dome.jpa.bean.Book;
import com.ja.spring_boot_dome.jpa.dao.BookDao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
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.test.context.junit4.SpringRunner;
import java.util.List;
import java.util.Optional;
/**
* @author xingChunWei
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class JpaTest {
@Autowired
private BookDao bookDao;
@Test
public void save() {
Book book = new Book();
book.setName("三国演义");
book.setAuthor("罗贯中");
bookDao.save(book);
}
@Test
public void update() {
/**
* saveAndFlush() 方法根据Id 判断这条数据是否存在 存在就 更新 不存在添加
*/
Book book = new Book();
book.setId(1);
book.setName("sanguoyanyi");
book.setAuthor("luoguanzhong");
bookDao.saveAndFlush(book);
}
/**
* 根据Id 查询
*/
@Test
public void findById() {
Optional book = bookDao.findById(1);
Book book1 = book.get();
System.out.println(book1);
}
/**
* 查询所有数据
*/
@Test
public void find() {
List all = bookDao.findAll();
System.out.println(all);
}
/**
* 根据一个字段 升序或者降序 查询所有
*/
@Test
public void find1() {
Sort sort = new Sort(Sort.Direction.DESC, "id");
List all = bookDao.findAll(sort);
System.out.println(all);
}
/**
* 分页查询
*/
@Test
public void find2() {
Pageable pageable = PageRequest.of(0, 2);
Page books = bookDao.findAll(pageable);
System.out.println("总记录数:"+books.getTotalElements());
System.out.println("当前页记录数:"+books.getNumberOfElements());
System.out.println("每页记录数:"+books.getSize());
System.out.println("获取总页数:"+books.getTotalPages());
System.out.println("查询结果:"+books.getContent());
System.out.println("当前页(从0开始计算):"+books.getNumber());
System.out.println("是否是首页:"+books.isFirst());
System.out.println("是否是尾页:"+books.isLast());
}
}
自定义 BookDao 接口继承自 JpaRepository,JpaRepository 提供了一些基本的数据操作方法,例如保存,更新,删除,分页查询等。但是远远不够的 ,有时候还需要自己自定义一些方法。而JPA自定义方法是有一些规则的。
按照 Spring Data 的规范,查询方法以 find | read | get开头, 涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写。
例如:
/**
* @author xingChunWei
*/
public interface BookDao extends JpaRepository {
/**
* 根据作者和id查询
* @param author
* @param id
* @return
*/
List findBookByAuthorOrId(String author, Integer id);
}
测试结果:
@Test
public void findBookByAuthorAndId(){
List books = bookDao.findBookByAuthorOrId("罗贯中", 3);
System.out.println(books);
}
相应的编写方法 可以根据上面的表格里面的内容来对应操作。
1.查询:
/**
* 原生sql 查询 数据
* @param id
* @return
*/
// @Query(value = "select * from t_book where id=?1",nativeQuery = true)
@Query(value = "select * from t_book where id=:id",nativeQuery = true)
Book findBookId(@Param("id") Integer id);
使用@Query()注解 来编写sql ,他默认支持Hql格式的sql语句,需要用nativeQuery = true 这个属性来标记成原生sql使用。
2:update/delect /insert
关于自定义sql 添加,删除或者修改的是是否,需要注意一点,必须要在自定义的方法上添加两个注解。
@Transactional
@Modifying
/**
* 删除
* @param id
* @return
*/
@Query(nativeQuery = true ,value="delete from t_book where id=?1 ")
@Transactional
@Modifying
Integer delBook(@Param("id") Integer id);