小鸡炸

导航

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、常用注解图

image-20210326114507092

四、常用功能接口和类

1、常用dao层继承的接口
接口或类名 作用
Repository 最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型,
且能让组件扫描的时候自动识别
CrudRepository 是Repository的子接口,提供CRUD的功能
PagingAndSortingRepository 是CrudRepository的子接口,添加分页和排序的功能
JpaRepository 是PagingAndSortingRepository的子接口,增加了一些实用的功能,比如:批量操作等。
JpaSpecificationExecutor 用来做负责查询的接口
Specification 是Spring Data JPA提供的一个查询规范,要做复杂的查询,只需围绕这个规范来设置查询条件即可
Pageable 分页对象、一般作为参数传递
2、根据dao层方法名定制方法、只要方法名规范、就可以自动实现sql语句

posted on 2022-01-19 10:29  小鸡炸  阅读(159)  评论(0编辑  收藏  举报