ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringBoot_JPA

2022-01-19 10:33:42  阅读:137  来源: 互联网

标签:hibernate String name JPA dao 主键 public SpringBoot


一、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、创建实体类
package org.lanqiao.bean;

import javax.persistence.Entity;
import javax.persistence.Id;

@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, "汉文帝001", "123", "1", 1);
		return dao.save(info);
	}
	
	//修改
	@RequestMapping("/saveupdate")
	public Object saveupdate() {
		Student info=new Student(1001, "汉文帝002222", "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 = "org.lanqiao")
@EnableJpaRepositories("org.lanqiao.dao")
@EntityScan("org.lanqiao.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语句
3、常用对象和方法

image-20210326181047094

image-20210326181216963

标签:hibernate,String,name,JPA,dao,主键,public,SpringBoot
来源: https://www.cnblogs.com/xiaojizha/p/15821221.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有