jpa01

1 什么是JPA

用于对象持久化的 API到数据库
Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层

2.JPA的hibernate区别

JPA它是ORM的规范,hibernate是其中一个实现框架

JDBC的缺点:
优点:操作数据库最底层,性能最高(前提是你要有相应的经验,并且是一个数据库高手)

缺点1.因为JAVA是面向对象的,JDBC没有做到使数据能够面向对象的编程,使程序员的思考仍停留在SQL语句上。
操作比较繁琐,很多代码需要重复写很多次。

        如果遇到批量操作,频繁与数据库进行交互,容易造成效率的下降

     2.移植数据库很麻烦,改动比较多

       主键的生成方式不同(mysql使用自增,oracle使用序列sequence)

       分页的sql语句也是不同(mysql使用limit,oracle使用ROWNUM)

JPA的优缺点:

优点

重复性代码不多 完成crud 只需要调用方法就可以搞定 比如保存 perisit(Employee employee)

merge

移植数据很方便,到时候只需要配置一些方言就可以搞定

提供的世界级缓存支持(一级缓存 二级缓存)

不用写sql ,会自动生成

面向对象操作,操作对象就相当于操作数据库,但是jpa也是支持sql

缺点:

1.不能干预sql语句的生成

entityManager.find(User.class, 1L);    

    find方法默认查询t_user表的所有字段

  自动生成select user0_.id,user0_.name,user0_.age from t_user user0_ where user0_.id=?

2.一个项目中,如果对sql语句的优化要求比较高,不适合用JPA(不过可以使用JPA对原生sql的支持来解决)

     3.如果一张表中有上亿级别的数据量,也不适合用JPA,其实也不适合用jdbc(可以使用数据库读写分离,分库分表方案解决)

2.JPA的完成CRUD

新增:persist --事务

@Test
        public void addtest()throws Exception{
            //获取连接对象
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa0825");
            // 获取作用域对象
            EntityManager entityManager = factory.createEntityManager();
            //开启事务
            EntityTransaction transaction = entityManager.getTransaction();
            transaction.begin();
            //执行操作
            User user=new User();
            user.setName("小猪");
            user.setAge(3);

            /* 添加的方法是 persist 持久化
             *   save 是不管事务是否提交
             *  persist 必须提交事务才执行
             * */
            entityManager.persist(user);
            //提交事务
            transaction.commit();
            //释放资源
            entityManager.close();

工具类封装

public class JpaUtils {
    private static EntityManagerFactory entityManagerFactory;

    static {
        entityManagerFactory = Persistence.createEntityManagerFactory("jpa0825");
    }

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

}

修改:merge --事务

@Test
        public void update()throws Exception{
            User user = new User();
            user.setId(2L);
            user.setName("x");
            user.setAge(10);

            EntityManager entityManager = JpaUtils.getEntityManager();

            entityManager.getTransaction().begin();

            entityManager.merge(user);

            entityManager.getTransaction().commit();

            entityManager.close();
         }

删除:remove --事务

@Test
        public void delete()throws Exception{
            EntityManager entityManager = JpaUtils.getEntityManager();

            entityManager.getTransaction().begin();

            //先查询
            User user = entityManager.find(User.class, 1L);
            //再删
            entityManager.remove(user);

            entityManager.getTransaction().commit();

            entityManager.close();

        }

通过主键获取一条数据

@Test
        public void findone()throws Exception{
            EntityManager entityManager = JpaUtils.getEntityManager();
            User user = entityManager.find(User.class, 2L);
            System.out.println(user);
            entityManager.close();
        }

查询所有:使用jpql语句

@Test
        public void FindAll()throws Exception{
            EntityManager entityManager = JpaUtils.getEntityManager();
			//需要1.8以上
            String jpql="from t_user";

            Query query = entityManager.createQuery(jpql);

            List list = query.getResultList();

            list.forEach(System.out::println);

            entityManager.close();
        }

工具类抽取

创建工厂
EntityManagerFactory f =Persistence.createEntityManagerFactory();
创建entitymanager对象
EntityManager eg = f.createEntityManager();
增删改需要事务
删除的对象是查出来的(最好判断是否为空)
查询所有(jpql) from Employee

3.JPA核心的类

1.Persistence:通过它我们可以得到EntityManagerFactory

Persistence.createEntityManagerFactory(“cn.itsource.jpa”)

2.EntityManagerFactory:实体管理工厂对象

作用:它是重量级的对象,因为它和数据库打交道,我们不要频繁的创建和销毁,如果我们频繁创建该对象或者销毁该对象,很损耗系统。尽量满足一个原则,1:1:1的应用程序对应1对应数据库 对应1个entityManagerFactory,尽量可以达到共享的效果,而且要注意线程安全问题(ThreadLocal)

3.EntityManager:(经常使用对象) 实体管理对象

可以完成CRUD

这个对象 你可以频繁创建和销毁,不会销毁太多性能 注意,如果多个操作 都在使用在对象,也会线程安全问题

4.维护了一个一级缓存

缓存(内存):容器,装数据 操作之前可以把数据,先从数据库读取出来,放入到缓存里面,下次来使用的,不需要查询数据库,直接从缓存里面取数据

怎么使用一级缓存?

缓存命中条件:同一个entityManagerFactory 同一个entityManager 同一个OID(实体对象主键id)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值