JPA的入门CRUD

主要目的:

操作实体类就相当于操作数据库表

建立两个映射关系:

      实体类和表的映射关系

      实体类中的属性和表中字段的映射关系

不在关注sql语句

常见的orm框架:Mybatis(ibatis)、Hibernate、Jpa

JPA的全称是Java Persistence API, 即Java 持久化API,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成。

JPA规范本质上就是一种ORM规范,注意不是ORM框架——因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服务厂商来提供实现。

JPA和Hibernate的关系就像JDBC和JDBC驱动的关系,JPA是规范,Hibernate除了作为ORM框架之外,它也是一种JPA实现。JPA怎么取代Hibernate呢?JDBC规范可以驱动底层数据库吗?答案是否定的,也就是说,如果使用JPA规范进行数据库操作,底层需要hibernate作为其实现类完成数据持久化工作。

在java工程的src路径下创建一个名为META-INF的文件夹,在此文件夹下创建一个名为persistence.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:事务管理方式                                                           RESOURCE_LOCAL:本地事务管理                                                           jpa:分布式事务管理-->    <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">        <!--jpa的实现方式-->        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <properties>            <!--加载配置文件-->            <property name="persistenceXmlLocation" value="classpath:/META-INF/persistence.xml"/>            <!--数据库信息-->            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://192.168.2.100:3306/ytkj?serverTimeZone=UTC"/>            <property name="javax.persistence.jdbc.username" value="root"/>            <property name="javax.persistence.jdbc.password" value="123456"/>

            <!--可选的配置:配置jpa实现方的配置信息,也就是hibernate的配置信息            显示sql  hibernate.show.sql true

            自动创建数据库表 hibernate.hbm2ddl.auto                            create:程序运行时创建表。若有表先删除表在创建表                            update:程序运行时创建表。若有表不会创建表                            none: 不会创建表            -->            <property name="hibernate.show_sql" value="true" />            <property name="hibernate.format_sql" value="true" />            <property name="hibernate.hbm2ddl.auto" value="create" />        </properties>    </persistence-unit></persistence>

  

编写实体类和数据库表的映射配置

package com.ytk.entity;

import javax.persistence.*;
import java.io.Serializable;

/**
 *          @Entity
 *         	作用:指定当前类是实体类。
 *         @Table
 *         	作用:指定实体类和表之间的对应关系。
 *         	属性:
 *         		name:指定数据库表的名称
 *         @Id
 *         	作用:指定当前字段是主键。
 *         @GeneratedValue
 *         	作用:指定主键的生成方式。。
 *         	属性:
 *         		strategy :指定主键生成策略。
 *         @Column
 *         	作用:指定实体类属性和数据库表之间的对应关系
 *         	属性:
 *         		name:指定数据库表的列名称。
 *         		unique:是否唯一
 *         		nullable:是否可以为空
 *         		inserttable:是否可以插入
 *         		updateable:是否可以更新
 *         		columnDefinition: 定义建表时创建此列的DDL
 *         		secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字搭建开发环境[重点]
 *
 * 客户实体类
 *      配置映射关系
 *          实体类和表映射
 *          实体类属性和表字段映射
 */
@Entity
@Table(name = "cst_customer")
public class Customer implements Serializable {
    /**
     * 声明主键配置
     */
    @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_industry")
    private String custIndustry;//客户行业
    @Column(name ="cust_level")
    private String custLevel;//客户级别
    @Column(name ="cust_address")
    private String custAddress;//客户地址
    @Column(name = "cust_phone")
    private String custPhone;//客户电话

    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 getCustIndustry() {
        return custIndustry;
    }

    public void setCustIndustry(String custIndustry) {
        this.custIndustry = custIndustry;
    }

    public String getCustLevel() {
        return custLevel;
    }

    public void setCustLevel(String custLevel) {
        this.custLevel = custLevel;
    }

    public String getCustAddress() {
        return custAddress;
    }

    public void setCustAddress(String custAddress) {
        this.custAddress = custAddress;
    }

    public String getCustPhone() {
        return custPhone;
    }

    public void setCustPhone(String custPhone) {
        this.custPhone = custPhone;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "custId=" + custId +
                ", custName=‘" + custName + ‘\‘‘ +
                ", custSource=‘" + custSource + ‘\‘‘ +
                ", custIndustry=‘" + custIndustry + ‘\‘‘ +
                ", custLevel=‘" + custLevel + ‘\‘‘ +
                ", custAddress=‘" + custAddress + ‘\‘‘ +
                ", custPhone=‘" + custPhone + ‘\‘‘ +
                ‘}‘;
    }
}
package com.ytk.utils;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 * 解决实体管理器工厂的浪费资源和耗时问题
 *      通过静态代码块的形式,当程序第一次访问此工具类时,创建一个公共的实体管理器工厂对象
 *
 * 第一次访问getEntityManager方法:经过静态代码块创建一个factory对象,再调用方法创建一个EntityManager对象
 * 第二次方法getEntityManager方法:直接通过一个已经创建好的factory对象,创建EntityManager对象
 */
public class JpaUtils {

    private static EntityManagerFactory factory;

    static  {
        //1.加载配置文件,创建entityManagerFactory
        factory = Persistence.createEntityManagerFactory("myJpa");
    }

    /**
     * 获取EntityManager对象
     */
    public static EntityManager getEntityManager() {
       return factory.createEntityManager();
    }
}

  

package com.ytkj.test;

import com.ytk.entity.Customer;import com.ytk.utils.JpaUtils;import org.junit.Test;

import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.EntityTransaction;import javax.persistence.Persistence;

/** * jpa操作步骤 *  1.加载配置文件创建工厂对象 *  2.通过实体类工厂获取实体类管理器 *  3.获取事务对象,开启事务 *  4.完成crud *  5.提交事务 *  6.释放资源 * */public class JpaTest {

    /**     * 保存     */    @Test    public void testSave(){        //1.加载配置文件创建工厂对象        //EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");;        //2.通过实体类工厂获取实体类管理器        //EntityManager entityManager = factory.createEntityManager();        EntityManager entityManager = JpaUtils.getEntityManager();        //3.获取事务对象,开启事务        EntityTransaction transaction = entityManager.getTransaction();        transaction.begin();        //完成crud        Customer customer=new Customer();        customer.setCustName("zhechaochao");        customer.setCustIndustry("it");        //保存        entityManager.persist(customer);        //5.提交事务        transaction.commit();        //6.释放资源        entityManager.close();        //factory.close();

    }

    /**     * 查询     * find     * getreference 懒加载     */    @Test    public void findById(){        EntityManager entityManager = JpaUtils.getEntityManager();        //3.获取事务对象,开启事务        EntityTransaction transaction = entityManager.getTransaction();        transaction.begin();        Customer customer = entityManager.find(Customer.class, 1L);        //Customer customer = entityManager.getreference(Customer.class, 1L);        //5.提交事务        transaction.commit();        System.out.println(customer);    }

    /**     * 删除     * find     * getreference 懒加载     */    @Test    public void delete(){        EntityManager entityManager = JpaUtils.getEntityManager();        //3.获取事务对象,开启事务        EntityTransaction transaction = entityManager.getTransaction();        transaction.begin();        Customer customer = entityManager.find(Customer.class, 1L);        if (customer!=null){            entityManager.remove(customer);        }        //5.提交事务        transaction.commit();

    }

    /**     * 更新     * find     * getreference 懒加载     */    @Test    public void updateById(){        EntityManager entityManager = JpaUtils.getEntityManager();        //3.获取事务对象,开启事务        EntityTransaction transaction = entityManager.getTransaction();        transaction.begin();        Customer customer = entityManager.find(Customer.class, 1L);        customer.setCustPhone("110");        customer.setCustAddress("昆明");        if (customer!=null){            entityManager.merge(customer);        }        //5.提交事务        transaction.commit();

    }

}

  

原文地址:https://www.cnblogs.com/yscec/p/11986700.html

时间: 2024-08-29 22:25:09

JPA的入门CRUD的相关文章

jpa对表的crud

1.1.  Jpa对表的crud操作 1.1.1.  增加 public void save() { Person person = new Person("aaa",121); entityManager.persist(person);//持久化一个对象,将数据保存到数据库中 } 1.1.2.  修改 public void update(){ Person person = entityManager.find(Person.class, 1);//相当于hibernate的ge

《Spring Data JPA从入门到精通》内容简介、前言

内容简介 本书以Spring Boot为技术基础,从入门到精通,由浅入深地介绍Spring Data JPA的使用.有语法,有实践,有原理剖析. 本书分为12章,内容包括整体认识JPA.JPA基础查询方法.定义查询方法.注解式查询方法.@Entity实例里面常用注解详解.JpaRepository扩展详解.JPA的MVC扩展REST支持.DataSource的配置.乐观锁.SpEL表达式在Spring Data里面的应用.Spring Data Redis实现cacheable的实践.Intel

JPA开发入门实例

一. 什么是JPA JPA是sun官方提出的Java持久化规范, 它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据, 它的出现主要是为了简化现有的持久化开发工作和整合ORM技术. JPA总体思想和现有的Hibernate.TopLink等ORM框架大体一致. 总的来说, JPA包括以下3方面的技术: 1. ORM映射元数据(JPA支持XML和注解两种元数据的形式) - 元数据描述对象和表之间的映射关系. 2. Java持久化API: 用来操作实体对象, 执行CRUD

JPA使用入门

JPA能干什么?我在前面一遍文章<初步了解JPA>基本描述了.不过你不需要点击回去再看.这里简单的再提一下JPA的功能,就是:(1)实现“对象-关系”映射:(2)对象持久化到数据库:(3)对象查询. JPA要怎么用,我们直接入手来跑起一个JPA的demo,我这里是采用Hibernate的JPA实现. (1)创建一个普通java工程. (2)导入必要的包. 从Hibernate官方下载一个基本包,我这里下载后得到的是hibernate-release-5.0.4.Final.zip.解压后可以文

Elasticsearch入门CRUD(新增、查询、修改、删除)

IT交流互助QQ群:79190545    (Sql Server / Java / Asp.Net / C# / JS / Jquery / Oracle / My Sql / ) -- 欢迎大家进来 聊天,交流 !!.(定期清理 不说话.潜水太深的同学) 1. 项目中引用 Elasticsearch.Net         Elasticsearch 其他版本可在: http://www.nuget.org/  找到对应的项目以源码 ! 本文以 2.4.1版本为例 首先我们打开项目,点击-工

【原】无脑操作:IDEA + maven + SpringBoot + JPA + EasyUI实现CRUD及分页

背景:上一篇文章的界面太丑.没有条件查询功能.所以做一些改进,整合EasyUI做实现.(仅以此文纪念表格中出现的这些朋友工作六周年,祭奠一下逝去的青春^_^) 一.开发环境(参照上一篇文章) 补充:EasyUI直接从官网随便下载一个版本即可,本文用的版本是 1.3.3 二.程序结构:java目录下都是服务端代码,resources目录下templates目录存放页面文件,static目录下存放JavaScript文件.CSS文件.图片等资源文件 三.具体实现(Talk is cheap.Show

用Springboot+Jpa实现学生CRUD操作(含前端页面,含分页,自定义SQL)

在数据库中建student表 建包 1.编写entity包下实体类Student (一个Javabean规范) package com.example.stu.kudestu.stu.entity; import javax.persistence.*; @Entity @Table(name = "student") //@Entity 应用在实体类上 @Table(name = "student") 应用在实体类上,并且name属性为数据库表名 public c

hibernate的入门crud

package com.test; import com.demo.User; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; impor

EF入门-CRUD操作

一.EF数据查询假设我们已经定义好了context:private AccountContext db = new AccountContext(); 1.[基本查询] 查询所有var users = from u in db.SysUsers select u; users = db.SysUsers; 2.[条件查询] 加入查询条件users = from u in db.SysUserswhere u.UserName == "Tom"select u; users = db.S