【1】ORM:就是建立实体类和数据库表之间的关系,从而达到 *** 作实体类就相当于 *** 作数据库表的目的,而不是调用sql语句。
【2】为什么要有ORM:
当实现一个应用程序时(不使用O/R Mapping),我们可能会写特别多数据访问层的代码,从数据库保存数据、修改数据、删除数据,而这些代码都是重复的。而使用ORM则会大大减少重复性代码。对象关系映射(Object Relational Mapping,简称ORM),主要实现程序对象到关系数据库数据的映射。
【3】Jpa:
JPA的全称是Java Persistence API, 即Java 持久化API,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成。
JPA通过JDK 5.0注解描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
【4】Jpa和Hibernate关系
JPA和Hibernate的关系就像JDBC和JDBC驱动的关系,JPA是规范,Hibernate除了作为ORM框架之外,它也是一种JPA实现。JPA怎么取代Hibernate呢?JDBC规范可以驱动底层数据库吗?答案是否定的,也就是说,如果使用JPA规范进行数据库 *** 作,底层需要hibernate作为其实现类完成数据持久化工作。
【5】搭建环境-jar包地址
UTF-8 5.0.7.Final junit junit4.12 test org.hibernate hibernate-entitymanager${project.hibernate.version} org.hibernate hibernate-c3p0${project.hibernate.version} log4j log4j1.2.17 mysql mysql-connector-java5.1.6
【6】写一个实体类,对应数据库,包括表和实体类的映射,属性和字段的映射,并且写好getter/setter和toString
@entity:声明实体类
@table:实体类和表得映射关系
@Id:声明主键配置
@Generatevalue:配置主键得生成策略
strategy
Identity:自增,数据库这个字段必须支持数据增长,例如mysql
Sequence:序列,底层数据库必须支持序列,例如oracle
Table:jpa提供得机制,通过一张数据库表得形式,帮助我们主键自增
Auto:程序自动帮助我们选择主键生成
@Column:配置属性和字段得名称
name:数据库中字段得名字
【7】配置核心XML文件
org.hibernate.jpa.HibernatePersistenceProvider
【8】进行数据库 *** 作测试
*** 作步骤:
1.加载配置文件,创建工程对象,填的参数就是我们在XML文件中配置的persistence-unit
EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
2.通过工厂获取实体管理器
EntityManager entityManager = factory.createEntityManager();
3.获取事务对象,开启事务
EntityTransaction tx = entityManager.getTransaction(); tx.begin()
4,增删改查 *** 作
Customer customer=new Customer(); customer.setCust_Name("ppc"); customer.setCust_Industry("中国石油大学"); customer.setCust_Level("1"); customer.setCust_Address("北京"); customer.setCust_phone("188888885"); //保存 entityManager.persist(customer);
5.提交事务(或者回滚事务)
tx.commit();
6.释放资源,管理器是资源,工厂也是资源,都要关闭
entityManager.close(); factory.close();
【9】entityManager中给我们提供的方法
1.entityManager.persistb 保存数据
2.entityManager.find 查询数据(这里把Factory的创建交给一个JpaUtil(自定义类)中的静态代码块处理了,防止资源浪费)
@Test public void testFind(){ EntityManager entityManager = JpaUtil.getEntityManager(); EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); //参数1:我们要 *** 作的类,参数2:我们要查询数据的主键 Customer customer = entityManager.find(Customer.class, 1l); System.out.println(customer); transaction.commit(); entityManager.close(); }
3.entityManager.getReference
和find方法的区别就是,getReference是延迟查询,什么时候用到我们查询出的customer的时候,什么时候执行,如果我们没有用到下面的customer这个查询到的类,getReference就不会执行。
@Test public void testReference(){ EntityManager entityManager = JpaUtil.getEntityManager(); EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); //参数1:我们要 *** 作的类,参数2:我们要查询数据的主键 Customer customer = entityManager.getReference(Customer.class, 1l); System.out.println(customer); transaction.commit(); entityManager.close(); }
4.entityManager.remove删除
原理是先查询,后删除
@Test public void testDel(){ EntityManager entityManager = JpaUtil.getEntityManager(); EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); //删除之前需要现根据id查询客户,然后才能删除 Customer customer = entityManager.find(Customer.class, 2l); entityManager.remove(customer); transaction.commit(); entityManager.close(); }
5.entityManager.merge更新
原理:先查询后更新,和删除的原理一样。
@Test public void upDate(){ EntityManager entityManager = JpaUtil.getEntityManager(); EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); //获取我们要修改的数据 Customer customer = entityManager.find(Customer.class, 1l); customer.setCust_Source("一起加油"); entityManager.merge(customer); transaction.commit(); entityManager.close(); }
【9】以上这些都是EntityManager给我们提供的方法
显然是不够用的,所以我们需要学习另一种能 *** 作数据库的语言:jpql,也是用来 *** 作对象的
同理我们还是需要利用EntityManager来创建出事务的管理,唯一不同的就是我们不用EntityManager的内部方法,我们需要自己写jpql语句来 *** 作实体类。
注意:jpql的查询语句是 from 实体类的全限定类名,不过前面类所在的包可以省略
例如:from cn.itcast.domain.Customer-->from Customer
sql语句是 *** 作数据库中的表,而jpql是 *** 作我们的实体类,
sql语句的字段是数据库路中的字段,而jpql是我们实体类中的私有属性名,别写错了,其他的和sql语句大同小异。
spql的查询使用entityManager.createQuery(String jpql)
@Test public void testFindAll(){ EntityManager entityManager = JpaUtil.getEntityManager(); EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); //利用jpql查询所有 String jpql="from cn.itcast.domain.Customer"; Query query = entityManager.createQuery(jpql); //发送查询,并封装结果集 List resultList = query.getResultList(); resultList.forEach(a-> System.out.println(a)); transaction.commit(); entityManager.close(); } @Test public void testFindAllByOrder(){ EntityManager entityManager = JpaUtil.getEntityManager(); EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); //利用jpql查询所有 String jpql="from cn.itcast.domain.Customer order by cust_Id desc"; Query query = entityManager.createQuery(jpql); //发送查询,并封装结果集 List resultList = query.getResultList(); resultList.forEach(a-> System.out.println(a)); transaction.commit(); entityManager.close(); } @Test public void testCount(){ EntityManager entityManager = JpaUtil.getEntityManager(); EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); //利用jpql查询所有 String jpql="select count(cust_Id) from Customer"; Query query = entityManager.createQuery(jpql); //发送查询,并封装结果集 Object singleResult = query.getSingleResult(); System.out.println(singleResult); transaction.commit(); entityManager.close(); } @Test public void testFindByPage(){ EntityManager entityManager = JpaUtil.getEntityManager(); EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); //利用jpql查询所有 String jpql="from Customer"; Query query = entityManager.createQuery(jpql); //进行分页 query.setFirstResult(0);//从那开始 query.setMaxResults(1);//每页几个数据 //发送查询,并封装结果集 List resultList = query.getResultList(); resultList.forEach(a-> System.out.println(a)); transaction.commit(); entityManager.close(); } @Test public void testCondition(){ EntityManager entityManager = JpaUtil.getEntityManager(); EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); //利用jpql查询所有 String jpql="from Customer where cust_Name like ?"; Query query = entityManager.createQuery(jpql); //对参数赋值,第一个参数是占位符的索引位置,从1开始,第二个参数,取值 query.setParameter(1,"马%"); //发送查询,并封装结果集 List resultList = query.getResultList(); resultList.forEach(a-> System.out.println(a)); transaction.commit(); entityManager.close(); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)