JPA简单知识

,JPA(Java Persistence API):通过注解或XML描述对象--关系表的映射关系,并将运行期的实体对象持久化到数据库中。

JPA是一套规范,不是某个ORM产品,它主要包括以下3方面的技术:

    1. ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中
    2. Java持久化API:用来操作实体对象,执行CRUD操作
    3. 查询语言:JPQL。通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

@Entity用来标注实体

@Table用来指定实体对应的表名

@Id用来标注实体的标示,即主键。@GeneratedValue用来标注主键的生成方式。主要有以下几种:
     * GenerationType.AUTO---由ORM产品根据数据库方言决定--AUTO是默认值,可以省略,即@Id @GeneratedValue
     * GenerationType.IDENTITY---常用于Mysql、Sqlserver
     * GenerationType.SEQUENCE---常用于Oracle
     * GenerationType.TABLE--通用,但是效率不高

@Column标注实体的属性,对应数据库表中的字段,包括length,name,nullable等设置

@Temporal标注时间类型的属性,@Temporal(TemporalType.DATE),@Temporal(TemporalType.TIME),@Temporal(TemporalType.TIMESTAMP)

@Enumerated标注索引,包括@Enumerated(EnumType.ORDINAL)//保存枚举的索引值,@Enumerated(EnumType.STRING) //保存枚举的字面值(而非索引值)

@Lob //对应数据库大文本字段,还可以保存文件

@Transient //表示不与数据库映射

实例说明:

package com.yl.demo1.bean;

import java.util.Date;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

@Entity
@Table(name="t_person")

public class Person {

    private Integer id;
    private String name;
    private Date birthday;//日期类型
    private Sex sex = Sex.MAN;//枚举类型,并设置默认值
    private String info;
    private String notinvoke;//不希望映射到数据库的字段
    private Byte[] bigfile;

    public Person(){}

    public Person(String name) {
        this.name = name;
    }
    @Id @GeneratedValue
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    @Column(length=10, nullable=false, name="personName")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Temporal(TemporalType.DATE)
    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Enumerated(EnumType.STRING) //保存枚举的字面值(而非索引值)
    @Column(length=5, nullable=false)
    public Sex getSex() {
        return sex;
    }

    public void setSex(Sex sex) {
        this.sex = sex;
    }
    @Lob //对应数据库大文本字段,还可以保存文件
    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    @Transient //表示不与数据库映射
    public String getNotinvoke() {
        return notinvoke;
    }

    public void setNotinvoke(String notinvoke) {
        this.notinvoke = notinvoke;
    }
    /***
     * FetchType.EAGER---立即加载
     * FetchType.LAZY----延迟加载,没有访问get方法时不会加载
     */
    @Lob @Basic(fetch=FetchType.EAGER)
    public Byte[] getBigfile() {
        return bigfile;
    }

    public void setBigfile(Byte[] bigfile) {
        this.bigfile = bigfile;
    }

}

上面类中用到的枚举

public enum Sex {
    MAN, WOMAN
}

对实体的各种操作行为,包括保存,查询,更新,删除等。

  1 @Test public void save() {
  2         EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
  3         EntityManager em = factory.createEntityManager();
  4         em.getTransaction().begin();//事务开始
  5         Person p = new Person("老子");
  6         em.persist(p);
  7         em.getTransaction().commit();
  8         em.close();
  9         factory.close();
 10     }
 11
 12     @Test public void getPerson() {
 13         EntityManagerFactory factory = Persistence.createEntityManagerFactory("YL");
 14         EntityManager em = factory.createEntityManager();
 15         Person person = em.find(Person.class, 1);//相当于hibernate的get方法
 16         /**
 17          * 这里执行了一个占时较长的任务时,其他部分可能修改了数据库中的对象,如果下面想要继续使用这个对象,可以使用refresh方法获取最新的数据
 18          *此时调用查询方法只能是在EntityManager的一级缓存中获取刚才查询到的数据,无法获取最新的数据
 19          */
 20         em.refresh(person);
 21         System.out.println(person.getName());
 22         em.close();
 23         factory.close();
 24     }
 25
 26     @Test public void getPerson2() {
 27         EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
 28         EntityManager em = factory.createEntityManager();
 29
 30         Person person = em.getReference(Person.class, 1);//相当于hibernate的load方法,延迟加载
 31         System.out.println(person.getName());
 32
 33         em.close();
 34         //System.out.println(person.getName());//获取出错
 35         factory.close();
 36     }
 37     /**实体的状态
 38      * new
 39      * 托管
 40      * 游离
 41      * 删除
 42      *
 43      */
 44
 45     @Test public void updatePerson() {
 46         EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
 47         EntityManager em = factory.createEntityManager();
 48         em.getTransaction().begin();//事务开始
 49         Person person = em.find(Person.class, 1);
 50         person.setName("孔子");
 51         em.getTransaction().commit();
 52         em.close();
 53         factory.close();
 54     }
 55
 56
 57     @Test public void updatePerson2() {
 58         EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
 59         EntityManager em = factory.createEntityManager();
 60         Person person = em.find(Person.class, 1);
 61         em.clear();//把实体管理器中的所有实体变成游离状态
 62         person.setName("lao jia");
 63         em.merge(person);//把游离状态的实体同步到实体管理器
 64         em.close();
 65         //person.getName();//此时无法查询到数据
 66         factory.close();
 67     }
 68
 69
 70     @Test public void deletePerson() {
 71         EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
 72         EntityManager em = factory.createEntityManager();
 73         em.getTransaction().begin();//事务开始
 74         Person person = em.find(Person.class, 1);
 75         em.remove(person);
 76         em.getTransaction().commit();
 77         em.close();
 78         factory.close();
 79     }
 80
 81     @Test public void query() {
 82         EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
 83         EntityManager em = factory.createEntityManager();
 84         Query query = em.createQuery("select o from Person o where o.id = ?1");//?后指定参数的索引
 85         query.setParameter(1, 2);//1代表参数的索引,2代表相应的值,在这里即id=2
 86         Person person = (Person) query.getSingleResult();
 87         System.out.println(person.getName());
 88         em.close();
 89         factory.close();
 90     }
 91
 92     @Test public void deleteQuery() {
 93         EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
 94         EntityManager em = factory.createEntityManager();
 95         em.getTransaction().begin();//事务开始
 96         Query query = em.createQuery("delete from Person o where o.id = ?1");//?后指定参数的索引
 97         query.setParameter(1, 2);//1代表参数的索引,2代表相应的值,在这里即id=2
 98         query.executeUpdate();
 99         em.getTransaction().commit();
100         em.close();
101         factory.close();
102     }
103
104     @Test public void updateQuery() {
105         EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
106         EntityManager em = factory.createEntityManager();
107         em.getTransaction().begin();//事务开始
108         Query query = em.createQuery("update Person o set o.name = :name and o.id = :id");//?后指定参数的索引
109         query.setParameter(1, 2);//1代表参数的索引,2代表相应的值,在这里即id=2
110         query.executeUpdate();
111         em.getTransaction().commit();
112         em.close();
113         factory.close();
114     }
时间: 2024-10-05 19:46:38

JPA简单知识的相关文章

SQLite数据库和JPA简单介绍

SQLite数据库和JPA简单介绍 一.SQLite简单使用 SQLite是遵循ACID的关系数据库管理系统,它的处理速度很快,它的设计目标是嵌入式的,只需要几百K的内存就可以了. 1.下载SQLitehttp://www.sqlite.org/download.htmlsqlite-dll-win32-x86-201410071659.zip(294.11 KiB)sqlite-shell-win32-x86-3080600.zip解压在文件夹D:\Database\sqlite下,得到文件s

简单东西-SpringMVC注入Bean的简单知识

近期重构项目代码,在整理基于SpringMVC技术的应用代码过程中,对SpringMVC的注解的原理进行了简单的验证.通常情况下,我们自定义的类使用SpringMVC的注解,而且没有在spring-servlet.xml配置中作任何特殊设置的话,Bean的实例化过程是怎么样的呢? 1 单例 默认情况下,使用@Autowire注入的类型相同的成员变量,引用的都是同一个对象,而且该成员变量的注入并不是通过调用类的setXX方法设置的.例如,具有Service注解且都引用同一个类型的两个类,经验证他们

IEEE 802.3ad 链路聚合与LACP的简单知识&EtherChannel 总结

IEEE 802.3ad 链路聚合与LACP的简单知识 内容提要:本文主要介绍了链路聚合的概念以及链路聚合与EtherChannel(以太通道)的区别. 说明:IEEE 802.3ad 是执行链路聚合的标准方法.从概念上讲,将多个以太网适配器聚集到单独的虚拟适配器方面与"以太通道(EtherChannel)"的功能相同,能提供更高的带宽防止发生故障.例如,ent0 和 ent1 可以聚集到称作 ent3 的 IEEE 802.3ad 链路聚合:然后用 IP 地址配置接口 en3.系统将

svn的简单知识

svn的简单知识 一.简介: SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统, 它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subversion.说得简单一点SVN就是 用于多个人共同开发同一个项目,共用资源的目的. 二.常见的英文: Can't use Subversion command line client:svnprobably the path to subbersion executable i

CSS 简单知识概括

CSS选择器 ID选择器 #ID{color:red} 类选择器 .class{color:blue} 属性选择器 注释:只有在规定了 !DOCTYPE 时,IE7 和 IE8 才支持属性选择器.在 IE6 及更低的版本中,不支持属性选择 [title]{color:green} 元素选择器 p{font-size:15px} 后代选择器 p  a{font-size:15px} 子元素选择器 p > a{background:red} 相邻兄弟选择器 h1 + p{background:yel

Spring Data JPA 简单查询

一.常用规则速查 1  And 并且2  Or  或3  Is,Equals 等于4  Between  两者之间5  LessThan 小于6  LessThanEqual   小于等于7  GreaterThan 大于8  GreaterThanEqual  大于等于9  After 之后(时间) >10 Before 之前(时间) <11 IsNull 等于Null12 IsNotNull,NotNull 不等于Null13 Like 模糊查询.查询件中需要自己加 %14 NotLike

Linux postfix邮件的简单知识

1.接受邮件和发送邮件 1.1配置本地DNS解析 在配置邮件之前要先安装bind,在server上配置本地dns解析,这里我们简单配置,可以看http://13132323.blog.51cto.com/13122323/1955802这篇博客. [[email protected] ~]# vim /etc/named.conf  11//      listen-on port 53 { 127.0.0.1; };  12//      listen-on-v6 port 53 { ::1;

mybatis的简单知识

mybatis的简单入门: 1,关于Mybatis(ORM[对象关系映射]{关系型数据库和业务实体对象之间作一个映射})的说明: MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录. 2,mybatis的流程(即:加载配置-接收请求并处理-返回结果): (1)加载配置并初始化 触发条件:加载

SpringMVC的简单知识

SpringMVC简单入门: 1,SpringMVC是什么? 优秀的MVC框架,支持注解配置,帮我们如何传数据到View层.帮我们如何去管理Model(如User类的set和get的管理).(JSP等);就是页面请求的处理,Controller控制层.(其实相当于我们servlet). 2,SpringMVC的主要内容: A,DispatcherServlet, B,父子上下文, C,拦截器, D,全局的异常处理, E,转发与重定向 (带参数重定向), F,处理ajax请求. 3,SpringM