一.ORM 对象/关系数据库映射
完成面向对象编程到关系数据库的映射,ORM框架会将对持久化对象的操作转换成对应的SQL并对数据库进行操作。
映射方式:
1.数据库映射类
2.数据表的行映射类的对象
3.数据表的列映射类的属性
二.JPA Java持久层API
ORM规范,只提供一系列编程接口,而ORM框架负责实现接口。面对JPA编程,应用程序底层就可以在不同ORM框架切换。
三.Hibernate
实现了JPA规范的ORM框架,还提供了对数据增删改查的方法,减少人工SQL。
四.hibernate.cfg.xml基础配置
<!-- maven依赖 -->
<!-- hibernate包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.5.Final</version>
</dependency>
<!-- c3p0数据源包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>4.3.5.Final</version>
</dependency>
<!-- mysql连接驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 连接信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/myhibernate?CharacterEncoding=utf-8</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!-- 不使用hibernate自带连接池 -->
<!-- <property name="connection.pool_size">20</property> -->
<!-- c3p0连接池配置 -->
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.max_statement">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">true</property>
<!-- 数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 自动创建数据表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 格式化显示生成的SQL -->
<property name="show_sql">true</property>
<property name="sql_format">true</property>
<!-- 持久化类 -->
<mapping class="com.flyhuo.entity.Grade"/>
<mapping class="com.flyhuo.entity.Student"/>
</session-factory>
</hibernate-configuration>
4.PO 持久化对象
//低侵入式:PO = POJO(普通Java对象) + 持久化注解
@Entity //持久化类
@Table(name="student") //指定表名
public class Student {
@Id() //标志属性,对应主键 主键生成策略
@GeneratedValue(strategy=GenerationType.IDENTITY)
private String id;
@Column(name="name") //指定列名
private String name;
//提供无参构造方法,用于通过newInstance()创建实例
public Student() {
}
1.状态:
(1) 瞬态: PO实例从未与Session关联
(2) 持久化: PO实例与Session关联并且对应数据库记录,PO实例被修改会自动更新到持久层
(3) 脱管: PO实例曾与Session关联,但Session关闭脱离管理
2.要求:
(1) 提供无参构造方法 — 使用newInstance()创建实例
(2) 尽量避免使用基本类型 — 允许为null
(3) 使用非final类 — 生成代理对象(子类的实例)
(4) get和set方法,标志属性
5. 持久化操作
//configure默认加载hibernate.cfg.xml,也可指定文件名
Configuration cfg = new Configuration().configure();
ServiceRegistry sr = new StandardServiceRegistryBuilder().
applySettings(cfg.getProperties()).build();
//Session工厂,线程安全,提供二级缓存
SessionFactory sf = cfg.buildSessionFactory(sr);
//对PO进行持久化操作,单线程,提供一级缓存
Session session = sf.openSession();
//一个session可以开启多个事务
Transaction tx = session.beginTransaction();
//持久化操作
Student student = new Student();
student.setName("张三");
student.setId("2");
session.save(student);
student.setName("李四");
//提交事务,关闭session,关闭sessionFactory
tx.commit();
session.close();
sf.close();