ORM框架:
ORM是什么?
ORM(Object/Relation Mapping,对象、关系数据库映射),用于实现Java应用中的对象与关系数据库中的数据的映射,从而可以通过持久化对象(PO)以面向对象的方式来操作数据库。
为什么使用ORM框架?
面向对象语言和数据库之间存在模型不匹配(阻抗不匹配)问题。面向对象语言:对象模型,主要概念是类、对象、继承、多态、关联等。关系型数据库:关系模型,主要概念是表、记录、主键、外键等。
怎么使用ORM框架?
主流的ORM框架有hibernate、TopLink等,其中hibernate应用最广泛
Hibernate是什么?
Hibernate是轻量级的Java EE应用的持久层解决方案。它对JDBC进行了轻量级的封装,不仅能管理Java类到数据库表的映射,还能提供数据查询和获取数据的方法。
使用Hibernate可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间
怎么使用Hibernate?
创建Hibernate应用的步骤:
搭建Hibernate运行环境。
创建Hibernate配置文件。
创建持久化类。
创建对象-关系映射文件。
通过Hibernate API编写访问数据库的代码。
搭建Hibernate运行环境,我这里使用的是idea,用的是maven管理
<dependencies>
<!-- https://mvnrepository.com/artifact/antlr/antlr -->
<dependency>
<groupId>antlr</groupId>
<artifactId>antlr</artifactId>
<version>2.7.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy -->
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.10.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml/classmate -->
<dependency>
<groupId>com.fasterxml</groupId>
<artifactId>classmate</artifactId>
<version>1.5.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sun.xml.fastinfoset/FastInfoset -->
<dependency>
<groupId>com.sun.xml.fastinfoset</groupId>
<artifactId>FastInfoset</artifactId>
<version>1.2.15</version>
</dependency>
<dependency>
<groupId>org.hibernate.common</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>5.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.22.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sun.istack/istack-commons-runtime -->
<dependency>
<groupId>com.sun.istack</groupId>
<artifactId>istack-commons-runtime</artifactId>
<version>3.0.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss/jandex -->
<dependency>
<groupId>org.jboss</groupId>
<artifactId>jandex</artifactId>
<version>2.1.3.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.24.0-GA</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.activation/javax.activation-api -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.persistence/javax.persistence-api -->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
<version>2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging -->
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.3.2.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss.spec.javax.transaction/jboss-transaction-api_1.2_spec -->
<dependency>
<groupId>org.jboss.spec.javax.transaction</groupId>
<artifactId>jboss-transaction-api_1.2_spec</artifactId>
<version>1.1.1.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jvnet.staxex/stax-ex -->
<dependency>
<groupId>org.jvnet.staxex</groupId>
<artifactId>stax-ex</artifactId>
<version>1.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/txw2 -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>txw2</artifactId>
<version>2.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
</dependencies>
Hibernate配置文件:
作用:用于配置数据库连接设置、Hibernate属性设置及映射文件设置等内容。
怎么做:
两种形式:hibernate.cfg.xml文件或者hibernate.properties属性文件,两者取一
hibernate.cfg.xml:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/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://localhost:3306/hibernate_1</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!--连接池-->
<!-- <property name="connection.pool_size">2</property>-->
<!--数据库方言定义-->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="current_session_context_class">thread</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<mapping resource="Person.hbm.xml"/>
</session-factory>
</hibernate-configuration>
持久化类:
作用:ORM的作用是把对PO的CRUD等操作转换成对数据库的相关操作。
持久化类编写规范:
必须具有无参构造方法
具有一个主键属性
非final类,否则无法使用懒加载以及代理
使用JavaBean的编写规范来编写属性的setter和getter方法
映射文件:
作用:用于设置持久化类与数据库表的映射关系,是hibernate的核心所在。一般以持久化类名+hbm.xml来命名,如Person.hbm.xml;并保存在与持久化类同目录下,不过一般为了文件分离开,路径用对即可,不一定非得要在同一持久化类的目录下
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.hibernate.org/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.sise.hibernate.lesson1.domain">
<class name="Person" table="person">
<id name="id">
<generator class="native" />
</id>
<property name="name" type="java.lang.String" length="12" not-null="true" column="name"/>
<property name="age" type="integer" />
</class>
</hibernate-mapping>
常用的主键解释:
increment:由Hibernate自动以递增的方式生成主键,每次增量为1。
identity: 使用数据库提供的自增长主键机制,如Mysql
sequence: 使用数据库提供的sequence机制生成主键,如oracle
native:由hibernate根据数据库驱动定义,自动选择主键生成机制
hilo:由Hibernate根据hight/low算法来生成主键
foreign:用另一个关联的对象的标识符作为当前对象的标识符,主要用于一对一关联设置
assigned: 由应用程序生成
Hibernate核心API
Configuration类:
负责读取及解析Hibernate的配置信息
创建SessionFactory实例
SessionFactory接口:
是数据库编译后的内存镜向,其中缓存了解析
后的配置信息
在应用初始化时创建,对于使用一个数据库的
应用程序只有一个会话工厂
用于创建Session实例
Session接口:
Session封装了与数据库之间的一系列操作
所有持久化操作都需要使用该接口
所有持久化操作完成后,需要关闭会话
Session接口常用的几个方法
Transaction接口:
使用Hibernate进行持久化操作必须显式开启事务
使用Session实例开启事务
持久化操作在事务提交后生效
Hibernate中Java对象的状态
在hibernate中,Java对象在整个生命周期中存在以下三种状态:
瞬时状态:在内存中刚刚创建的对象,数据库中没有数据与之对应,与session也没有关联
持久化状态:数据库中有数据与之对应,且与session有关联; 持久对象状态发生改变时,事务提交时会自动更新数据库
游离(脱管)状态:数据库中有数据与之对应,但当前没有session与之关联;对象状态发生改变,hibernate不能检测到,必须调用更新数据库方法才能更新到数据库
基于持久层框架的DAO模式应用示例
上传资源后我会把链接放到这里
pom.xml导入的依赖:
<dependencies>
<!-- https://mvnrepository.com/artifact/antlr/antlr -->
<dependency>
<groupId>antlr</groupId>
<artifactId>antlr</artifactId>
<version>2.7.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy -->
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.10.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml/classmate -->
<dependency>
<groupId>com.fasterxml</groupId>
<artifactId>classmate</artifactId>
<version>1.5.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sun.xml.fastinfoset/FastInfoset -->
<dependency>
<groupId>com.sun.xml.fastinfoset</groupId>
<artifactId>FastInfoset</artifactId>
<version>1.2.15</version>
</dependency>
<dependency>
<groupId>org.hibernate.common</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>5.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.22.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sun.istack/istack-commons-runtime -->
<dependency>
<groupId>com.sun.istack</groupId>
<artifactId>istack-commons-runtime</artifactId>
<version>3.0.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss/jandex -->
<dependency>
<groupId>org.jboss</groupId>
<artifactId>jandex</artifactId>
<version>2.1.3.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.javassist/javassist -->
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.24.0-GA</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.activation/javax.activation-api -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.persistence/javax.persistence-api -->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
<version>2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging -->
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.3.2.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss.spec.javax.transaction/jboss-transaction-api_1.2_spec -->
<dependency>
<groupId>org.jboss.spec.javax.transaction</groupId>
<artifactId>jboss-transaction-api_1.2_spec</artifactId>
<version>1.1.1.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jvnet.staxex/stax-ex -->
<dependency>
<groupId>org.jvnet.staxex</groupId>
<artifactId>stax-ex</artifactId>
<version>1.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/txw2 -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>txw2</artifactId>
<version>2.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
</dependencies>