一、 SpringData:其实SpringData就是Spring提供了一个操作数据的框架。而SpringData JPA只是SpringData框架下的一个基于JPA标准操作数据的模块。
SpringData JPA:基于JPA的标准数据进行操作。简化操作持久层的代码。只需要编写接口就可以。
- 首先添加相关依赖
<!--springdatajpa依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
- 配置文件
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/jpa?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
#显示sql
spring.jpa.show-sql=true
spring.jpa.database=mysql
spring.jpa.database-platform=mysql
#jpa正向工程
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
实体类
@Entity(name = "t_book")//对应数据库中的表名
public class Book {
//主键自增 一定要有
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY))//主键生成策略
@Column(name="id")//数据库字段名 如果一样可以省略
private Integer id;
private String name;
private String author;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + author + '\'' +
'}';
}
}
- mapper接口
/**
* 参数一 :当前需要映射的实体
* 参数二 :当前映射的实体中的主键的类型
*
*/
public interface BookMapper extends JpaRepository <Book,Integer>{
}
- 测试
@SpringBootTest
class SpringdatajpaApplicationTests {
@Autowired
BookMapper bookMapper;
//添加
@Test
void contextLoads() {
Book book = new Book();
book.setName("java");
book.setAuthor("song");
bookMapper.save(book);
}
//修改
@Test
void update(){
Book book = new Book();
book.setName("西游记");
book.setId(1);
book.setAuthor("song");
//按照id判断是否存在 不存在是添加 存在修改
bookMapper.saveAndFlush(book);
}
//删除
@Test
void delete(){
bookMapper.deleteById(1);
}
//查询
@Test
void find1(){
Optional<Book> byId = bookMapper.findById(2);
System.out.println(byId);
List<Book> all = bookMapper.findAll();
System.out.println(all);
}
@Test
void find3(){
//分页
PageRequest of = PageRequest.of(0,2);
Page<Book> all = bookMapper.findAll(of);
System.out.println("当前页记录数"+all.getNumberOfElements());
System.out.println("总记录数"+all.getTotalElements());
System.out.println("每页几条"+all.getSize());
System.out.println("总页数"+all.getTotalPages());
System.out.println("查询结果"+all.getContent());
System.out.println("当前页(从0开始计算)"+all.getNumber());
System.out.println("是否为首页"+all.isFirst());
System.out.println("是否为尾页"+all.isLast());
}
}
二、Repository接口的使用
提供了方法名称命名查询方式
mapper接口
public interface BookMapper extends JpaRepository <Book,Integer>{
//方法名称必须要遵循驼峰式命名规则,find+属性名称(首字母大写)+By(关键字)+查询条件(首字母大写)
//自定义按id查询
List<Book> findBookById(Integer id);
//自定义按name查询
List<Book> findBookByName(String name);
//自定义按name,author查询
List<Book> findBookByNameAndAuthor(String name,String author);
//自定义按author模糊查询
List<Book> findBookByAuthorLike(String name);
}
测试
@Test
void find4(){
List<Book> byBookId = bookMapper.findBookById(1);
System.out.println(byBookId);
System.out.println("===================");
List<Book> byBookName = bookMapper.findBookByName("西游记");
System.out.println(byBookName);
System.out.println("===================");
List<Book> byBookNameAndAuthor = bookMapper.findBookByNameAndAuthor("三国演义", "罗贯中");
System.out.println(byBookNameAndAuthor);
System.out.println("===================");
List<Book> byBookNameLike = bookMapper.findBookByAuthorLike("吴%");
System.out.println(byBookNameLike);
}
三、自定义查询sql
mapper接口
public interface BookMapper extends JpaRepository <Book,Integer>{
/**
*
* 自定义查询sql
*
*/
/**
*
* 添加与修改需要事务
* @Modifying
* @Transactional
*/
@Query(value = "select*from t_book",nativeQuery = true)
List<Book> getAll();
/**
*
* 两种传参方式
*
*/
@Query(value = "insert into t_book(name,author)values(?1,?2)",nativeQuery = true)
@Modifying
@Transactional
Integer insertBook(String name,String author);
@Query(value = "insert into t_book(name,author)values(:name,:author)",nativeQuery = true)
@Modifying
@Transactional
Integer insertBook2(@Param("name") String name, @Param("author") String author);
}
测试
@Test
void find5(){
List<Book> all = bookMapper.getAll();
System.out.println(all);
}
@Test
void find6(){
Integer integer = bookMapper.insertBook("test1", "auhor1");
System.out.println(integer);
}
@Test
void find7(){
Integer integer = bookMapper.insertBook2("test2", "auhor2");
System.out.println(integer);
}
数据库字段