springDataJPA笔记


第一 orm思想

主要目的:操作实体类就相当于操作数据库表
建立两个映射关系:
实体类和表的映射关系
实体类中属性和表中字段的映射关系
不再重点关注:sql语句 实现了ORM思想的框架:mybatis,hibernate

第二 hibernate框架介绍

Hibernate是一个开放源代码的对象关系映射框架,
它对JDBC进行了非常轻量级的对象封装,
它将POJO与数据库表建立映射关系,是一个全自动的orm框架

第三 JPA规范

jpa规范,实现jpa规范,内部是由接口和抽象类组成

第四 jpa的基本操作

案例:是客户的相关操作(增删改查)
客户:就是一家公司
客户表: jpa操作的操作步骤
1.加载配置文件创建实体管理器工厂
Persisitence:静态方法(根据持久化单元名称创建实体管理器工厂)
createEntityMnagerFactory(持久化单元名称)
作用:创建实体管理器工厂 2.根据实体管理器工厂,创建实体管理器
EntityManagerFactory :获取EntityManager对象
方法:createEntityManager
* 内部维护的很多的内容
内部维护了数据库信息,
维护了缓存信息
维护了所有的实体管理器对象
再创建EntityManagerFactory的过程中会根据配置创建数据库表
* EntityManagerFactory的创建过程比较浪费资源
特点:线程安全的对象
多个线程访问同一个EntityManagerFactory不会有线程安全问题
* 如何解决EntityManagerFactory的创建过程浪费资源(耗时)的问题?
思路:创建一个公共的EntityManagerFactory的对象
* 静态代码块的形式创建EntityManagerFactory 3.创建事务对象,开启事务
EntityManager对象:实体类管理器
beginTransaction : 创建事务对象
presist : 保存
merge : 更新
remove : 删除
find/getRefrence : 根据id查询 Transaction 对象 : 事务
begin:开启事务
commit:提交事务
rollback:回滚
4.增删改查操作
5.提交事务
6.释放资源 i.搭建环境的过程
1.创建maven工程导入坐标
2.需要配置jpa的核心配置文件
*位置:配置到类路径下的一个叫做 META-INF 的文件夹下
*命名:persistence.xml
3.编写客户的实体类
4.配置实体类和表,类中属性和表中字段的映射关系
5.保存客户到数据库中
ii.完成基本CRUD案例
persist : 保存
merge : 更新
remove : 删除
find/getRefrence : 根据id查询 iii.jpql查询
sql:查询的是表和表中的字段
jpql:查询的是实体类和类中的属性
* jpql和sql语句的语法相似 1.查询全部
2.分页查询
3.统计查询
4.条件查询
5.排序

以上是课件的内容:

总结:

使用jpa的步骤,但是不适用springboot注解的形式,那么

第一步就需要创建xml文件进行配置:

具体代码:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<!--需要配置persistence-unit-->
<!--持久化单元-->
<!--name:持久化单元名称
transaction-type:事务管理的方式
JTA:分布式事务管理
RESOURCE_LOCAL:本体事务管理
-->
<persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
<!--jpa的实现方式-->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <properties>
<!--开始配置基本属性-->
<!--需要数据库信息
用户名:javax.persistence.jdbc.user
密码:javax.persistence.jdbc.password
驱动:javax.persistence.jdbc.driver
数据库地址:javax.persistence.jdbc.url
-->
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="root"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql:///springdatajpa"/>
<!--可选的配置:为了配置jpa实现方的配置信息
hibernate:
显示sqlhibernate.show_sql
自动创建数据库表hibernate.hbm2ddl.auto
create:程序运行时创建数据库表(如果有表,先删除表再创建)
update:c程序运行时创建表(如果有表不会创建表)
none:不会创建表
-->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>

以上的代码进行了详细的注解,就不需要解释了。

第二步:需要创建实体类,根据实体类进行创建数据库表结构:

	package cn.itcast.domain;

	/**
* @Created by Intellij IDEA.
* @author: 陈亚萌
* @Date: 2020/1/18
*/ import javax.persistence.*; /**
* 客户实体类:
* 配置映射关系:
* 1. 实体类和表的映射关系
* 2. 实体类中属性和表中字段的映射关系
* @Entity声明实体列
* @Table:声明实体类和表的映射关系 name 属性是配置数据库的名称
* @Id:声明主键
* strategy
* @GeneratedValue(strategy = GenerationType.IDENTITY) 表示主键生成策略是自增 mysql
* * 底层数据库必须支持自动增长,底层数据库支持的自动增长方式,对id递增
* GenerationType.SEQUENCE: 序列 Oracle
* 底层数据库必须支持序列
* GenerationType.TABLE :
* jpa提供的一种机制,通过数据库表的形式帮我们完成主键自增
* GenerationType.AUTO:
* 由程序自动帮我们选择主键生成策略
* @Column(name = 'cust_id')配置属性和字端的映射关系 name代表数据库表中的字段名
*/
@Entity
@Table(name = "cst_customer")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "cust_id")
private Long custId;
@Column(name = "cust_name")
private String custName;
@Column(name = "cust_source")
private String custSource;
@Column(name = "cust_level")
private String custLevel;
@Column(name = "cust_industry")
private String custIndustry;
@Column(name = "cust_phone")
private String custPhone;
@Column(name = "cust_address")
private String custAddress; public Long getCustId() {
return custId;
} public void setCustId(Long custId) {
this.custId = custId;
} public String getCustName() {
return custName;
} public void setCustName(String custName) {
this.custName = custName;
} public String getCustSource() {
return custSource;
} public void setCustSource(String custSource) {
this.custSource = custSource;
} public String getCustLevel() {
return custLevel;
} public void setCustLevel(String custLevel) {
this.custLevel = custLevel;
} public String getCustIndustry() {
return custIndustry;
} public void setCustIndustry(String custIndustry) {
this.custIndustry = custIndustry;
} public String getCustPhone() {
return custPhone;
} public void setCustPhone(String custPhone) {
this.custPhone = custPhone;
} public String getCustAddress() {
return custAddress;
} public void setCustAddress(String custAddress) {
this.custAddress = custAddress;
} @Override
public String toString() {
return "Customer{" +
"custId=" + custId +
", custName='" + custName + '\'' +
", custSource='" + custSource + '\'' +
", custLevel='" + custLevel + '\'' +
", custIndustry='" + custIndustry + '\'' +
", custPhone='" + custPhone + '\'' +
", custAddress='" + custAddress + '\'' +
'}';
}
}

以上也有对每段代码的详细注解,也可以不用手写setget方法,直接使用lombok进行@Data注解即可。

第三步,进行测试:

	package cn.itcast;

import cn.itcast.domain.Customer;
import cn.itcast.utils.JpaUtils;
import org.junit.Test; import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction; /**
* @Created by Intellij IDEA.
* @author: 陈亚萌
* @Date: 2020/1/18
*/
public class test {
/*
* 测试jpa的保存
* 案例 保存一个客户到数据库
* jpa操作步骤:
* 1. 加载配置文件创建工厂(实体管理工厂)对象
* 2. 通过实体管理类获取实体管理器
* 3. 获取事务对象,开启事务
* 4. 完成增删改查操作
* 5. 提交事务(回滚事务)
* 6. 释放资源
* */
@Test
public void testSave(){
/* //1. 加载配置文件创建工厂(实体管理工厂)对象
EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
//2. 通过实体管理类获取实体管理器
EntityManager em = factory.createEntityManager();*/
EntityManager em= JpaUtils.getEntityManager();
// 3 . 获取事务对象,开启事务
EntityTransaction tx = em.getTransaction();
//开启事务
tx.begin();
//4。完成增删改查操作
Customer customer=new Customer();
customer.setCustName("chenyameng");
customer.setCustIndustry("IT");
//保存
em.persist(customer);
// 5. 提交事务(回滚事务)
tx.commit();
// 6. 释放资源
em.close();
//factory.close(); } /**
* 根据id查询用户
*/
@Test
public void testFind(){
//1, 通过工具类获取entityManger
EntityManager em = JpaUtils.getEntityManager();
//2,开启事务
EntityTransaction tx=em.getTransaction();
tx.begin();
//3, 增删改查
/**
* find:根据id查询数据
* class:字节码,查询数据的结果需要包装的实体类类型的字节码
* id:查询的主键的取值
*
* 使用find方法查询
* 1. 查询的对象就是当前客户对象本身
* 2. 调用find方法的时候,就会发送sql请求
*/
Customer customer = em.find(Customer.class, 1l);
System.out.println(customer.toString());
//4,提交事务,
tx.commit();
// 释放资源
em.close();
} /**
* 根据id查询用户
*/
@Test
public void testReference(){
//1, 通过工具类获取entityManger
EntityManager em = JpaUtils.getEntityManager();
//2,开启事务
EntityTransaction tx=em.getTransaction();
tx.begin();
//3, 增删改查
/**
* getReference:根据id查询数据
* class:字节码,查询数据的结果需要包装的实体类类型的字节码
* id:查询的主键的取值
*
* 特点:
* 获取的对象是动态代理的对象
* 调用reference方法不会立即发送sql语句查询数据库
* * 当调用查询结果的时候,才会发送sql语句,什么时候用,什么时候发送sql语句
* 延迟加载,特点:
* 得到的是动态代理对象
* 什么时候用什么时候查
*
*/
Customer customer = em.getReference(Customer.class, 1l);
System.out.println(customer.toString());
//4,提交事务,
tx.commit();
// 释放资源
em.close();
}
/**
* s删除客户
*/
@Test
public void testRemove(){
//1, 通过工具类获取entityManger
EntityManager em = JpaUtils.getEntityManager();
//2,开启事务
EntityTransaction tx=em.getTransaction();
tx.begin();
//3, 增删改查
//3.1 根据id查询客户
final Customer customer = em.find(Customer.class, 1L);
// 3.2 调用remove 方法删除操作
em.remove(customer);
//4,提交事务,
tx.commit();
// 释放资源
em.close();
}
/**
* 更新客户
*/
@Test
public void testUpdate(){
//1, 通过工具类获取entityManger
EntityManager em = JpaUtils.getEntityManager();
//2,开启事务
EntityTransaction tx=em.getTransaction();
tx.begin();
//3, 增删改查
//3.1 客户的更新
final Customer customer = em.find(Customer.class, 2L);
customer.setCustIndustry("it教育");
// 3.2 调用update
em.merge(customer);
//4,提交事务,
tx.commit();
// 释放资源
em.close();
}
}

以上代码也有详细的解释。

jqpl语言的简单讲解:

	package cn.itcast;

	import cn.itcast.utils.JpaUtils;
import org.junit.Test; import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import java.util.List; /**
* @Created by Intellij IDEA.
* @author: 陈亚萌
* @Date: 2020/1/18
* jpql测试
*/
public class JpqlTest {
/**
* 查询全部:
* jqpl:from cn.itcast.domain.Customer
* sql:select * from cst_customer
*/
@Test
public void testFindAll(){
//1, 获取Entitymanager对象
EntityManager em=JpaUtils.getEntityManager();
//2 开启事务
final EntityTransaction transaction = em.getTransaction();
transaction.begin();
//3 查询全部
String jpql="from Customer";
//创建Query对象,query对象才是执行spql对象
Query query = em.createQuery(jpql);
//发送查询,并封装结果集
List list = query.getResultList();
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// 4.提交事务
transaction.commit(); // 释放资源
em.close();
}
/**
* 排序查询:
* jqpl:from cn.itcast.domain.Customer order by custId
* sql:select * from cst_customer order by cust_id DESC
* 进行jpql查询:
* 1. 创建query对象
* 2. 对参数进行复制
* 3. 查询并返回结果
*/
@Test
public void testOrder(){
//1, 获取Entitymanager对象
EntityManager em=JpaUtils.getEntityManager();
//2 开启事务
final EntityTransaction transaction = em.getTransaction();
transaction.begin();
//3 查询全部
String jpql="from cn.itcast.domain.Customer order by custId DESC";
//创建Query对象,query对象才是执行spql对象
Query query = em.createQuery(jpql);
//发送查询,并封装结果集
List list = query.getResultList();
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// 4.提交事务
transaction.commit(); // 释放资源
em.close();
}
/**
* 计数查询:
*
* 使用jpql查询,统计客户的总数:
* sql:select count(cus_id) from customer
* jpql:select count(custId) from Customer
*/
@Test
public void testCount(){
//1, 获取Entitymanager对象
EntityManager em=JpaUtils.getEntityManager();
//2 开启事务
final EntityTransaction transaction = em.getTransaction();
transaction.begin();
//3 查询全部 //1 根据jpql语句创建query对象
String jpql="select count(custId) from Customer";
//2 参数赋值
// 3 发送查询,并封装结果
Query query = em.createQuery(jpql);
//发送查询,并封装结果集
/**
* getResultList:直接将查询结果封装成为list集合
* getSingleResult:得到唯一的结果集
*/
final Object singleResult = query.getSingleResult();
System.out.println(singleResult); // 4.提交事务
transaction.commit(); // 释放资源
em.close();
}
/**
* 分页查询:
* sql:select * from cst_customer limit ?,?
* jpql:from Customer
*/
@Test
public void testPage(){
//1, 获取Entitymanager对象
EntityManager em=JpaUtils.getEntityManager();
//2 开启事务
final EntityTransaction transaction = em.getTransaction();
transaction.begin();
//3 查询全部 //1 根据jpql语句创建query对象
String jpql="from Customer"; // 3 发送查询,并封装结果
Query query = em.createQuery(jpql);
//发送查询,并封装结果集
/**
* getResultList:直接将查询结果封装成为list集合
* getSingleResult:得到唯一的结果集
*/
final List resultList = query.getResultList();
for (Object o : resultList) {
System.out.println(o);
}
//2 参数赋值
//起始索引,
query.setFirstResult(0);
//每页查询的条数
query.setMaxResults(2);
// 4.提交事务
transaction.commit(); // 释放资源
em.close();
}
/**
* 条件查询:
* 查询客户名称以“传值”开头的
* sql: select * from cst_customer where cust_name like '搜索%'
* jpql: from Customer where custName like ?
*/
@Test
public void testCondition(){
//1, 获取Entitymanager对象
EntityManager em=JpaUtils.getEntityManager();
//2 开启事务
final EntityTransaction transaction = em.getTransaction();
transaction.begin();
//3 查询全部 //1 根据jpql语句创建query对象
String jpql="from Customer where custName like ?"; // 3 发送查询,并封装结果
Query query = em.createQuery(jpql);
//发送查询,并封装结果集
/**
* getResultList:直接将查询结果封装成为list集合
* getSingleResult:得到唯一的结果集
*/ //2 参数赋值 占位符参数
// 第一个参数: 占位符的索引位置:(从1开始) 第二个参数:取值
final Query query1 = query.setParameter(1, "chenya%");
final List resultList = query.getResultList();
for (Object o : resultList) {
System.out.println(o);
}
// 4.提交事务
transaction.commit(); // 释放资源
em.close();
}
}

这种方法一般不常用,常用的是已经封装好的,但是底层源码应该就是这样的,初步理解,如果错误,指出更正。

代码上传到git:

"springdatajpa"

springDataJPA笔记的更多相关文章

  1. Spring-data-jpa 笔记(一)

    Spring Data JPA简介: 可以理解为 JPA 规范的再次封装抽象,底层还是使用了 Hibernate 的 JPA 技术实现,引用 JPQL(Java Persistence Query L ...

  2. Spring-data-jpa 笔记(二) Repository 详解

    基础的 Repository 提供了最基本的数据访问功能,其几个子接口则扩展了一些功能.它们的继承关系如下: Repository: 是 spring Data 的一个核心接口,它不提供任何方法,开发 ...

  3. Spring-data-jpa 学习笔记(二)

            通过上一篇笔记的,我们掌握了SpringData的相关概念及简单的用法.但上一篇笔记主要讲的是Dao层接口直接继承Repository接口,然后再自己定义方法.主要阐述了自定义方法时的 ...

  4. #2020.1.26笔记——springdatajpa

    2020.1.26笔记--springdatajpa 使用jpa的步骤: 1. 导入maven坐标 <?xml version="1.0" encoding="UT ...

  5. Spring-data-jpa 学习笔记(一)

    Spring家族越来越强大,作为一名javaWeb开发人员,学习Spring家族的东西是必须的.在此记录学习Spring-data-jpa的相关知识,方便后续查阅. 一.spring-data-jpa ...

  6. springDataJpa学习笔记

    目录 前言 springData 准备 引用 xml配置初始化JPA pojo dao层接口 使用 新增.修改:save 删除 查询所有 根据ID查询findById 命名规则查询(条件查询) 自定义 ...

  7. Springdata-Jpa学习笔记

    Respository接口 Respository是Springdata JPA中的顶层接口,提供了两种查询方法: 1)基于方法名称命名规则 2)基于@Qeury注解查询 1. 方法名称命名规则查询 ...

  8. Spring Boot 快速入门笔记

    Spirng boot笔记 简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发 ...

  9. SpringBoot学习笔记<一>入门与基本配置

    毕业实习项目技术学习笔记 参考文献 学习视频 2小时学会Spring Boot:https://www.imooc.com/learn/767 学习资料 SpringBoot入门:https://bl ...

随机推荐

  1. CF1137C Museums Tour(tarjan+DP)

    由于d很小,所以可以把每个点拆成d个点,然后对于边(x,y),连边时连接((x,i),(y,i+1))及((x,d),(y,1)).然后可以对这样连的边跑一遍tarjan缩点.然后直接暴力DP即可.不 ...

  2. [HNOI2019]校园旅行(建图优化+bfs)

    30分的O(m^2)做法应该比较容易想到:令f[i][j]表示i->j是否有解,然后把每个路径点数不超过2的有解状态(u,v)加入队列,然后弹出队列时,两点分别向两边搜索边,发现颜色一样时,再修 ...

  3. html中table的px与百分比格式设置

    PX是Pixel的缩写,也就是说像素是指基本原色素及其灰度的基本编码,由 Picture(图像) 和 Element(元素)这两个单词的字母所组成的 Html设置table格式时面临着百分比还是px的 ...

  4. liquibase使用教程

    在项目中引入liquibase过程: 1.父项目 pom.xml 中添加依赖 <dependencies> <dependency> <groupId>mysql& ...

  5. Perl: 单引号里面的直接给当做标量了,而直接输出($`)的话就是变量值,即相符段落的前置字符会存到这里。输出‘$`’ 就变成标量值了

    print '$`'."\n";print '$&'."\n";print $'."\n"; 输出: $`$& 而直接输出( ...

  6. dubbo同步/异步调用的方式

    我们知道,Dubbo 缺省协议采用单一长连接,底层实现是 Netty 的 NIO 异步通讯机制:基于这种机制,Dubbo 实现了以下几种调用方式: 同步调用(默认) 异步调用 参数回调 事件通知 同步 ...

  7. 吴裕雄--天生自然C语言开发:函数指针

    #include <stdio.h> int max(int x, int y) { return x > y ? x : y; } int main(void) { /* p 是函 ...

  8. SpringBoot开发二十-Redis入门以及Spring整合Redis

    安装 Redis,熟悉 Redis 的命令以及整合Redis,在Spring 中使用Redis. 代码实现 Redis 内置了 16 个库,索引是 0-15 ,默认选择第 0 个 Redis 的常用命 ...

  9. JS UTC 昨天

    var birthday = new Date("Jan 01, 1983 01:15:00") var formatDate = function (date) {       ...

  10. 学习C++之前要先学习C语言吗?

    C++ 读作“C加加”,是“C Plus Plus”的简称.顾名思义,C++ 是在C语言的基础上增加新特性,玩出了新花样,所以叫“C Plus Plus”,就像 iPhone 7S 和 iPhone ...