SpringBoot_JPA
一、SpringBoot_JPA基础
1、SpringBoot_JPA介绍
Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data JPA 可以极大提高开发效率!
spring data jpa让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现
二、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
三、application.properties添加配置
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= true
------------------------------------------------------------------------------------------------------
hibernate.hbm2ddl.auto:参数的作用主要用于:自动创建|更新|验证数据库表结构,有四个值:
create: 每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop :每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
validate :每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
hibernate.dialect :主要是指定生成表名的存储引擎为InneoDB
jpa.show-sql :是否打印出自动生产的SQL,方便调试的时候查看
二、SpringBoot_JPA的使用
1、创建实体类
@Entity
public class Student {
@Id
private int id;
private String name;
private String pwd;
private String img;
//引用的student的cinfo属性不进行json序列化、如果不添加此注解会导致循环引用依赖
@JsonIgnoreProperties({"set"})
//一对多的关联
@ManyToOne(targetEntity = Classes.class)
//关联列命、name:当前表的外键列名,referencedColumnName:关联表的主键ID【可以不用给,默认关联主键表的主键】
@JoinColumn(name = "classid")
private Classes cinfo;
@Entity
public class Classes {
@Id
private int id;
private String name;
//不被转换成json、有了下面的@JsonIgnoreProperties这个就不需要了
//@JsonIgnore
//引用的student的cinfo属性不进行json序列化、如果不添加此注解会导致循环引用依赖
@JsonIgnoreProperties({"cinfo"})
@OneToMany
//关联列命、name:外键表的外键列,referencedColumnName:当前表的主键列【可以不用给,默认当前表主键列】
@JoinColumn(name = "classid")
private Set<Student> set;
2、创建dao层、直接继承JpaRepository<实体类名,主键类型>即可
public interface StudentDao extends JpaRepository<Student, Integer> {
//自定义方法:根据方法名来生成对应的sql语句、如果有Pageable对象则自动分页
public List<Student> findByNameOrPwd(String name,String pwd,Pageable page);
//根据sql语句执行查询、默认使用hql语句、nativeQuery=true使用当前数据库的sql语句
//对象的传值方式
@Query(value="select * from student where name=:#{#info.name} or pwd=:#{#info.pwd}",nativeQuery = true)
public List<Student> mySql1(Student info);
//单个对象的传值
@Query(value="select * from student where name=:name or pwd=:pwd",nativeQuery = true)
public List<Student> mySql2(String name,String pwd);
}
3、创建Controller层,测试基本的增删改查方法
@RestController
@RequestMapping("/student")
public class StudentController {
@Autowired
StudentDao dao;
@RequestMapping("/get1")
public Object findByNameOrPwd(String name,String pwd) {
//分页条件
PageRequest page=PageRequest.of(1, 2, Sort.by("id"));
return dao.findByNameOrPwd(name,pwd, page);
}
@RequestMapping("/findAll")
public Object findAll() {
return dao.findAll();
}
@RequestMapping("/deleteById")
public Object deleteById(Integer id) {
dao.deleteById(id);
return "ok";
}
//添加
@RequestMapping("/saveadd")
public Object saveadd() {
//主键ID给值无效,会自动生成
Student info=new Student(1002, "张三", "123", "1", 1);
return dao.save(info);
}
//修改
@RequestMapping("/saveupdate")
public Object saveupdate() {
Student info=new Student(1001, "李四", "123", "1", 1);
return dao.save(info);
}
//添加和修改必须加事物、事物可以加在dao层、亦可加载调用者的地方(推荐service层)
@Transactional
//添加和修改需要@Modifying注解
@Modifying
@Query(value = "update student set name = :name WHERE id = :id",nativeQuery = true)
int update(Integer id, String name);
}
4、启动类启动用注解
@SpringBootApplication(scanBasePackages = "packages")
@EnableJpaRepositories("packages.dao")
@EntityScan("packages.bean")
public class Springboot001Application {
public static void main(String[] args) {
SpringApplication.run(Springboot001Application.class, args);
}
}
三、SpringBoot_JPA功能介绍
1、常用注解介绍:启用时、会在程序启动创建对应数据库、使用的都是hibernate的注解
注解名 | 作用 |
---|---|
@Entity | 数据库真实表名 |
@Id | 主键列【必须】 |
@GeneratedValue | 主键生成策略 |
@Column | 数据库的真实列名 |
@Transient | @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性. |
@OneToMany @ManyToOne |
targetEntity:关联的对象 cascade 级联操作 CascadeType. PERSIST 级联持久化 ( 保存 ) 操作 CascadeType. MERGE 级联更新 ( 合并 ) 操作 CascadeType. REFRESH 级联刷新操作,只会查询获取操作 CascadeType. REMOVE 级联删除操作 CascadeType. ALL 级联以上全部操作 fetch 加载类型,默认情况一的方为立即加载,多的一方为延迟加载 FetchType.LAZY 懒加载 FetchType.EAGER 立即加载(缺省值) mappedBy 关系维护 mappedBy= "parent" 表示在ListEntity类中的 parent 属性来维护关系,这个名称必须和ListEntity中的parent属性名称完全一致才行 OneToMany必须写mappedBy,不然会多生成一张没用的中间表,因为如果没写mappedBy,JPA不知道具体怎样做关联 |
@JoinColumn | 配合着@ManyToOne和@OneToMany使用 @ManyToOne(targetEntity = Classes.class) //关联列命、name:当前表的外键列名,referencedColumnName:关联表的主键ID【可以不用给,默认关联主键表的主键】 @JoinColumn(name = "classid") @OneToMany @JoinColumn(name = "classid",referencedColumnName = "id") |
@JsonIgnoreProperties({"set"}) | 引用的外键对象的set属性不进行json序列化、如果不添加此注解会导致循环引用依赖 |
@JsonIgnoreProperties({"set"}) | 引用的外键对象的set属性不进行json序列化、如果不添加此注解会导致循环引用依赖 |
@JsonIgnore | 不被转换成json、有@JsonIgnoreProperties这个就不需要了 |
2、常用注解图
四、常用功能接口和类
1、常用dao层继承的接口
接口或类名 | 作用 |
---|---|
Repository | 最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型, 且能让组件扫描的时候自动识别 |
CrudRepository | 是Repository的子接口,提供CRUD的功能 |
PagingAndSortingRepository | 是CrudRepository的子接口,添加分页和排序的功能 |
JpaRepository | 是PagingAndSortingRepository的子接口,增加了一些实用的功能,比如:批量操作等。 |
JpaSpecificationExecutor | 用来做负责查询的接口 |
Specification | 是Spring Data JPA提供的一个查询规范,要做复杂的查询,只需围绕这个规范来设置查询条件即可 |
Pageable | 分页对象、一般作为参数传递 |