SpringDataJPA详解

概念

ORM思想

对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。

实际应用中即在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。

简而言之,ORM思想就是通过实体对象操纵数据库的持久化数据。

常见的ORM框架,如hibernatemybatis

JPA

JPA是Java Persistence API的简称,中文名Java持久层API。

JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;

JPA是SUN公司推出的一套基于ORM思想的规范,提供统一的内部接口由各类框架去实现这种规范

SpringDataJPA

Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架。不是为了取代现有的ORM框架,只是提供便捷开发,易于维护和切换ORM框架使用。

JPQL

JPQL全称Java Persistence Query Language,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。

其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的字段。

举个栗子:
当你想把大象装进冰箱里,你需要制定大概思想要怎么去做;(ORM思想)
其次你可以将你的操作步骤记录下来,将打开冰箱门,装进大象,关上冰箱门封装成一套规范;(JPA规范)
而为了以防下次出现另一种冰箱,你再将对所有冰箱的操作封装;(SpringDataJPA)
你在开门关门用的是左手还是右手?(JPQL)

JPA的使用

使用JPA离不开它的实现框架,用hibernate作为它的实现商使用。

导入hibernate的jar包

		<!-- hibernate对jpa的支持包 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.0.7.Final</version>
        </dependency>

        <!-- c3p0 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>5.0.7.Final</version>
        </dependency>

创建大象的数据库表

 CREATE TABLE elephant(
  e_id int(32) NOT NULL AUTO_INCREMENT COMMENT '大象的id',
  e_name VARCHAR(32) NOT NULL COMMENT '大象名字',
  e_address VARCHAR(32) DEFAULT NULL COMMENT '大象的住址',
  PRIMARY KEY (e_id)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

创建大象的实体类

public class Elephant {
   

	//大象id
    private int eleId;
    //大象名字			
    private String eleName;
    //大象住址     
    private String eleAddress;  
    
	/* getter and setter */
	
}

编写JPA的配置文件
在resources目录的META-INF目录下创建persistence.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">

    <!--配置持久化单元
		name:持久化单元名称
		transaction-type:事务类型
		 	RESOURCE_LOCAL:本地事务管理
		 	JTA:分布式事务管理 -->

    <persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL">
        <!--配置JPA规范的服务提供商 -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!--数据库信息-->
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="****"/>
        <!--jpa提供的配置信息-->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true" />
            <!--
                create:总是创建新的表删除旧表
                update:有表则不会创建新的表
            -->
            <property name="hibernate.hbm2ddl.auto" value="create" />
        </properties>
    </persistence-unit>

</persistence>

实体类加注解

@Entity
@Table(name="elephant")
public class Elephant {
   

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="e_id")
    private int eleId;
    
    @Column(name = "e_name")
    private String eleName;
    
    @Column(name = "e_address")
    private String eleAddress;

	/* getter和setter   */
    
}

注解:
@Entity
属性:name:默认为实体类非限定类名
表示该类是实体类

@Table
属性:
name:指定数据库表的名称,默认为实体类名
catalog: 表的目录,默认为" “。指定数据库实例名
schema: 模式名,默认为” "

@Id
可以放在属性或者对应的get方法上
指定该属性为表的主键

@GeneratedValue
作用:指定主键的生成策略
属性:
strategy :指定主键生成策略,默认为AUTO。
生成策略:
IDENTITY:主键由数据库自动生成(主要是自动增长型)
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列
AUTO:主键由程序控制
TABLE:使用一个特定的数据库表格来保存主键

@Column
作用:指定实体类属性和数据库表之间的对应关系
属性: name:指定数据库表的列名称。
unique:是否唯一
nullable:是否可以为空
inserttable:是否可以插入
updateable:是否可以更新
length: String属性的长度,默认为255
scale:列的小数位数,默认为0

抽取工具类

public final class JPAUtil {
   

    // JPA的实体管理器工厂:相当于Hibernate的SessionFactory
    private static EntityManagerFactory factory;

    static {
   
        // 该方法参数必须和persistence.xml中persistence-unit标签name属性取值一致
        factory = Persistence.createEntityManagerFactory("jpa");
    }

    public static EntityManager getEntityManager() {
   
        return factory.createEntityManager();
    }

}

EntityManagerFactory:
方法:createEntityManager:返回一个实体管理器
getCache:访问二级缓存

EntityManager:
persist(Object entity):保存实体到表中
T merge(T entity):更新
void remove(Object entity):删除
T find(Class entityClass, Object primaryKey):通过主键查询
T getReference(Class entityClass, Object primaryKey):延迟加载查询

测试CRUD

public class Test {
   
    
    //保存添加
    @Test
    public void test1(){
   
        //
        EntityManager em = JPAUtil.getEntityManager();
        //获取事务对象
        EntityTransaction et = em.getTransaction();
        et.begin();
        Elephant elephant = new Elephant();
        elephant.setEleName("跳舞的大象");
        elephant.setEleAddress("森林");
        em.persist(elephant);
        et.commit();
        em.close();
    }

    //查询
    @Test
    public void test2(){
   
        //
        EntityManager em = JPAUtil.getEntityManager();
        //获取事务对象
        EntityTransaction et = em.getTransaction();
        et.begin();

        Elephant elephant = em.find(Elephant.class, 1);
        System.out.println(elephant);
        et.commit();
        em.close();
    }

    //更新
    @Test
    public void test3(){
   
        EntityManager em 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值