第一天
orm思想和hibernate以及jpa的概述和jpd的基本操作
传统jdbc操作
- 获取链接
- 创建statement对象
- 可以对占位符赋值
- 发送查询
- 操作繁琐
- 占位符赋值麻烦
-
orm思想
- 主要目的:操作实体类就相当于操作数据库表
- 建立两个映射关系
- 实体类和表的映射关系
- 实体类中属性和表中字段的映射关系
- 不再重点关注sql语句
- 实现了ORM思想的框架mybatis,htibernate
-
hibernate框架介绍
- hibernate是一个开源的对象关系映射框架
- 它对jdbc进行了非常轻量级的对象封装
- 它将pojo与数据库表建立映射关系,是一个全自动的orm框架
-
jpa规范
- jpa规范,实现jpa规范,内部是由接口和抽象类组成
-
jpa的基本操作
-
搭建环境的过程
-
创建maven工程导入坐标
-
需要配置jpa的核心配置文件
-
配置到类路径下的一个叫做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:事务管理的方式JTA:分布式事务管理RESOURCE_LOCAL:本地事务管理--><persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL"><!--jpa的实现方式 --><provider>org.hibernate.jpa.HibernatePersistenceProvider</provider><!--可选配置:配置jpa实现方的配置信息--><properties><!-- 数据库信息用户名,javax.persistence.jdbc.user密码, javax.persistence.jdbc.password驱动, javax.persistence.jdbc.driver数据库地址 javax.persistence.jdbc.url--><property name="javax.persistence.jdbc.user" value="root"/><property name="javax.persistence.jdbc.password" value="123456"/><property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/><property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/><!--配置jpa实现方(hibernate)的配置信息显示sql : false|true自动创建数据库表 : hibernate.hbm2ddl.autocreate : 程序运行时创建数据库表(如果有表,先删除表再创建)update :程序运行时创建表(如果有表,不会创建表)none :不会创建表--><property name="hibernate.show_sql" value="true" /><property name="hibernate.hbm2ddl.auto" value="update" /></properties></persistence-unit> </persistence>
-
-
编写客户的实体类
package cn.itcast.domain;import javax.persistence.*;/*** 客户的实体类* 配置映射关系*** 1.实体类和表的映射关系* @Entity:声明实体类* @Table : 配置实体类和表的映射关系* name : 配置数据库表的名称* 2.实体类中属性和表中字段的映射关系***/ @Entity @Table(name = "cst_customer") public class Customer {/*** @Id:声明主键的配置* @GeneratedValue:配置主键的生成策略* strategy* GenerationType.IDENTITY :自增,mysql* * 底层数据库必须支持自动增长(底层数据库支持的自动增长方式,对id自增)* GenerationType.SEQUENCE : 序列,oracle* * 底层数据库必须支持序列* GenerationType.TABLE : jpa提供的一种机制,通过一张数据库表的形式帮助我们完成主键自增* GenerationType.AUTO : 由程序自动的帮助我们选择主键生成策略* @Column:配置属性和字段的映射关系* name:数据库表中字段的名称*/@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_level")private String custLevel;//客户级别@Column(name="cust_industry")private String custIndustry;//客户所属行业@Column(name="cust_phone")private String custPhone;//客户的联系方式@Column(name="cust_address")private String custAddress;//客户地址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 getCustLevel() {return custLevel;}public void setCustLevel(String custLevel) {this.custLevel = custLevel;}public String getCustIndustry() {return custIndustry;}public void setCustIndustry(String custIndustry) {this.custIndustry = custIndustry;}public String getCustPhone() {return custPhone;}public void setCustPhone(String custPhone) {this.custPhone = custPhone;}public String getCustAddress() {return custAddress;}public void setCustAddress(String custAddress) {this.custAddress = custAddress;}@Overridepublic String toString() {return "Customer{" +"custId=" + custId +", custName='" + custName + '\'' +", custSource='" + custSource + '\'' +", custLevel='" + custLevel + '\'' +", custIndustry='" + custIndustry + '\'' +", custPhone='" + custPhone + '\'' +", custAddress='" + custAddress + '\'' +'}';} }
-
配置实体类和表,类中属性和表中字段的映射关系
-
保存客户到数据库中
-
-
完成基本的增删改查操作
-
单元测试
package cn.itcast.test;import cn.itcast.domain.Customer; import cn.itcast.utils.JpaUtils; import org.junit.Test;import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence;public class JpaTest {/*** 测试jpa的保存* 案例:保存一个客户到数据库中* Jpa的操作步骤* 1.加载配置文件创建工厂(实体管理器工厂)对象* 2.通过实体管理器工厂获取实体管理器* 3.获取事务对象,开启事务* 4.完成增删改查操作* 5.提交事务(回滚事务)* 6.释放资源*/@Testpublic void testSave() { // //1.加载配置文件创建工厂(实体管理器工厂)对象 // EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa"); // //2.通过实体管理器工厂获取实体管理器 // EntityManager em = factory.createEntityManager();EntityManager em = JpaUtils.getEntityManager();//3.获取事务对象,开启事务EntityTransaction tx = em.getTransaction(); //获取事务对象tx.begin();//开启事务//4.完成增删改查操作:保存一个客户到数据库中Customer customer = new Customer();customer.setCustName("传智播客");customer.setCustIndustry("教育");//保存,em.persist(customer); //保存操作//5.提交事务tx.commit();//6.释放资源em.close();// factory.close();}/*** 根据id查询客户* 使用find方法查询:* 1.查询的对象就是当前客户对象本身* 2.在调用find方法的时候,就会发送sql语句查询数据库** 立即加载***/@Testpublic void testFind() {//1.通过工具类获取entityManagerEntityManager entityManager = JpaUtils.getEntityManager();//2.开启事务EntityTransaction tx = entityManager.getTransaction();tx.begin();//3.增删改查 -- 根据id查询客户/*** find : 根据id查询数据* class:查询数据的结果需要包装的实体类类型的字节码* id:查询的主键的取值*/Customer customer = entityManager.find(Customer.class, 1l);// System.out.print(customer);//4.提交事务tx.commit();//5.释放资源entityManager.close();}/*** 根据id查询客户* getReference方法* 1.获取的对象是一个动态代理对象* 2.调用getReference方法不会立即发送sql语句查询数据库* * 当调用查询结果对象的时候,才会发送查询的sql语句:什么时候用,什么时候发送sql语句查询数据库** 延迟加载(懒加载)* * 得到的是一个动态代理对象* * 什么时候用,什么使用才会查询*/@Testpublic void testReference() {//1.通过工具类获取entityManagerEntityManager entityManager = JpaUtils.getEntityManager();//2.开启事务EntityTransaction tx = entityManager.getTransaction();tx.begin();//3.增删改查 -- 根据id查询客户/*** getReference : 根据id查询数据* class:查询数据的结果需要包装的实体类类型的字节码* id:查询的主键的取值*/Customer customer = entityManager.getReference(Customer.class, 1l);System.out.print(customer);//4.提交事务tx.commit();//5.释放资源entityManager.close();}/*** 删除客户的案例**/@Testpublic void testRemove() {//1.通过工具类获取entityManagerEntityManager entityManager = JpaUtils.getEntityManager();//2.开启事务EntityTransaction tx = entityManager.getTransaction();tx.begin();//3.增删改查 -- 删除客户//i 根据id查询客户Customer customer = entityManager.find(Customer.class,1l);//ii 调用remove方法完成删除操作entityManager.remove(customer);//4.提交事务tx.commit();//5.释放资源entityManager.close();}/*** 更新客户的操作* merge(Object)*/@Testpublic void testUpdate() {//1.通过工具类获取entityManagerEntityManager entityManager = JpaUtils.getEntityManager();//2.开启事务EntityTransaction tx = entityManager.getTransaction();tx.begin();//3.增删改查 -- 更新操作//i 查询客户Customer customer = entityManager.find(Customer.class,1l);//ii 更新客户customer.setCustIndustry("it教育");entityManager.merge(customer);//4.提交事务tx.commit();//5.释放资源entityManager.close();}}
-
-