jpa

概述
    JPA(Java Persistence API)是Sun官方提出的Java持久化规范(JAVA5.0)
    它的出现是为了简化现有的持久化开发工作和整合ORM技术,结束现在的Hibernate,TopLink,JDO等ORM框架各自为营的局面
    JPA是在现有ORM框架的基础上发展而来的,可以认为是现有ORM框架抽象出来的接口,他的主导者正是hibernate的创始人
    JPA只是一个规范,由各个ORM框架厂商负责实现
    JPA是现有ORM框架功能的一个子集
    


JPA的优点
    JPA不是一种新的ORM框架,他的出现只是用于规范现有的ORM技术,不能取代现有的hibernate,topLink等ORM框架.
    相反,在采用JPA开发时,我们仍将使用到这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化供应商
    应用可以在不修改代码的情况下载任何JPA环境下运行,真正做到低耦合,可扩展的程序设计.JPA是一个必然的发展趋势
    


包含技术
    ORM映射元数据
        JPA支持XML和JDK5.0注解两种元数据的形式
        元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中
    Java持久化API
        用来操作实体对象,执行CRUD操作
        框架在后台替我们完成所有的事情,开发者可以从繁杂的JDBC和SQL代码中解脱出来
    查询语言(JPQL)
        通过面向对象而非面向数据库的查询语言查询数据,避免程序和SQL语句紧密耦合



所需jar包(hibernate)
    核心包(/hibernate/hibernate-distribution-3.3.1.GA)
        /hibernate3.jar
        /lib/bytecode/cglib/hibernate-cglib-repack-2.1_3.jar
        /lib/required/*.jar
    注解包(/hiberante/hibernate-annotations-3.4.0.GA)
        /hibernate-annotations.jar
        /lib/ejb3-persistence.jar
        /lib/hibernate-commons-annotations.jar
    针对JPA的实现包(/hibernate/hibernate-entitymanager-3.4.0.GA)
        /hibernate-entitymanager.jar
        /lib/test/log4j.jar
        /lib/test/slf4j-log4j12.jar
        


第一个JPA程序HelloWorld
    创建项目
    导入jar包(别忘了jdbc驱动jar)
    创建配置文件
        在src下创建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_1_0.xsd"
                         version="1.0">
                <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
                    <properties>
                        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
                        <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/数据库名"/>
                        <property name="hibernate.connection.username" value="root"/>
                        <property name="hibernate.connection.password" value="1234"/>
                        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
                        <property name="hibernate.hbm2ddl.auto" value="update"/>
                    </properties>
                </persistence-unit>
            </persistence>
    编写javabean
        @Entity
        public class User {
            private Integer id;
            private String name;
            
            @Id @GeneratedValue
            public Integer getId() {
                return id;
            }
            public void setId(Integer id) {
                this.id = id;
            }
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
        }
    测试代码
        //提供数据
        User user = new User();
        user.setName("张三");
        
        //获得实体管理对象工厂,相当于SessionFactory
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("default");
        //获得实体管理对象,相当于Session
        EntityManager em = factory.createEntityManager();
        //开启事务
        em.getTransaction().begin();
        
        //持久化对象
        em.persist(user);
        
        //提交事务
        em.getTransaction().commit();
        //释放资源
        em.close();
        factory.close();



配置文件
    JPA规范要求在类路径的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_1_0.xsd"
                     version="1.0">
            <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
                <properties>
                    <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
                    <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/数据库名"/>
                    <property name="hibernate.connection.username" value="root"/>
                    <property name="hibernate.connection.password" value="1234"/>
                    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
                    <property name="hibernate.hbm2ddl.auto" value="update"/>
                </properties>
            </persistence-unit>
        </persistence>
    说明
        <persistence-unit>      持久化单元
            name                    名称,获取EntityManagerFactory对象时要使用
            transaction-type        事务类型,有RESOURCE_LOCAL(本地事务)和JTA(前置事务),不同数据库之间控制事务只能使用前置事务
        <property>              指定属性
            name                    属性名称
            value                   属性值



注解(javax.persistence)
    javabean类声明上方
        @Entity
            作用: 标注javabean
            位置: javabean类声明上方
        @Table
            作用: 指定数据库表的规则
            位置: javabean类声明上方
            参数:
                name        指定表名,默认为javabean的类名首字母小写
    字段声明上方, 或字段get属性声明上方
        @Id
            作用: 标注主键
        @GeneratedValue
            作用: 指定主键的值的规则
            参数: 
                strategy    指定主键生成策略
                    GenerationType.IDENTITY     采用数据库的自动增长
                    GenerationType.SEQUINCE     采用数据库的序列
                    GenerationType.TABLE        采用一张表维护
                    GenerationType.AUTO         根据实际情况使用上述三种方式之一,默认值,可以省略
        @Column
            作用: 指定数据库列的规则
            参数:
                name        指定列名,默认为javabean的get属性的属性名
                length      指定列长度,值为int
                nullable    指定列是否可以为null,值为boolean
        @Temporal
            作用: 指定数据库的日期类型
            参数: 
                value   指定数据库的日期类型
                    TemporalType.DATE           保存日期
                    TemporalType.TIME           保存时间
                    TemporalType.TIMESTAMP      保存日期时间
        @Enumerated
            作用: 指定枚举字段保存到数据库的方式
            参数: 
                value   指定枚举字段保存到数据库的方式
                    EnumType.STRING         保存枚举类型的字面值
                    EnumType.ORDINAL        保存枚举类型的索引值
        @Lob
            作用: 指定大文本数据类型 或 二进制数据类型 (java类型分别为String,和byte[])
        @Transient
            作用: 指定字段不作为持久化字段,数据库自动创建表时不会存在对应的列
        @Basic
            作用:           指定基本属性
            参数:
                fetch       指定属性的加载类型(是否延迟加载)
                    FetchType.EAGER     立即加载
                    FetchType.LAZY      延迟加载(即访问该属性时,才会去查询数据库)



JPA API
    EntityManager
        获取对象
            T find(Class<T>,id)         //相当于hibernate中的get()
            T getReference(Class<T>,id) //具有延迟加载作用,相当于hibernate的load()
        更新对象
            merge(obj)  将游离状态的对象变为托管状态,提交事务时会提交改变
        持久化对象
            persist(obj)
        删除对象
            remove(obj)
        创建JPQL语句
            Query createQuery(jpql)
        其它
            clean()         将EntityManager对象中的所有托管对象变为游离状态
            refresh(obj)    刷新对象的值,直接从数据库中查询,而不是从缓存中获取
    Query
        获得方式
            EntityManager对象的createQuery方法
        常用方法
            setParameter()      设置参数
            getResultList()     获得查询结果List
            getSingleResult()   获得唯一结果
            executeUpdate()     执行更新语句


JPQL语句
    语句示例
        查询    select o from User o where o.id=?1
        删除    delete from User o where o.id=?1
        更新    update Person o set o.name=:name where o.id=:id
    可以给占位符进行编号
        Query query = em.createQuery("select o from User o where o.id=?1");
        query.setParameter(1,2);
    可以设置占位符名称
        Query query = em.createQuery("select o from User o where o.id=:id");
        query.setParameter("id",2);



JPA实体状态
    new     新建
    managed 托管:查询到的数据
            游离:
            删除



关联关系映射
    在JPA中,多的一端为关系维护端,负责外键记录的更新.
    一对多
        例:用户(User)和订单(Order)
        User中
            添加属性: private Set<Order> orderSet;
            在get方法上添加: @OneToMany
            参数:
                cascade     级联操作
                    CascadeType.REFRESH     级联刷新(只在使用em.refresh方法时有效)
                    CascadeType.PERSIST     级联插入(只在使用em.persist方法时有效)
                    CascadeType.MERGE       级联更新(只在使用em.merge方法时有效)
                    CascadeType.REMOVE      级联删除(只在使用em.remove方法时有效)
                    CascadeType.ALL         上面四项之和
                fetch       是否延迟加载关联对象
                    FetchType.EAGER         立即加载
                    FetchType.LAZY          延迟加载(第一次访问属性时查询)
                    注意:如果是一对多,则默认值为LAZY,如果是多对一,则默认值为EAGER
                mappedBy    表明此类为关系被维护端,值为多的一端中的一的一端的引用的属性名称
        Order中
            添加属性: private User user;
            在get方法上添加: @ManyToOne
            参数:
                cascade     级联操作
                optional    此属性是否可以为空,值为boolean,默认为true(允许为null)
            在get方法上添加: @JoinColumn
            参数:
                name        外键名称




in子句,占位符必须采用参数名的形式,并且参数赋值时必须采用list(数组不管用)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值