Hibernate 学习(一)初识Hibernate
2017-05-09 19:09
344 查看
本文记录学习尚硅谷java视频的学习记录。
一个 Java 领域的持久化框架
一个 ORM 框架
2.广义的理解,“持久化”包括和数据库相关的各种操作:
- 保存:把对象永久保存到数据库中。
- 更新:更新数据库中对象(记录)的状态。
- 删除:从数据库中删除一个对象。
- 查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。
- 加载:根据特定的OID,把一个对象从数据库加载到内存中。
所谓OID是指为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。在关系数 据库中称之为主键,而在对象术语中,则叫做对象标识(Object identifier-OID).
ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。
ORM 采用元数据来描述对象-关系映射细节, 元数据通常采用 XML 格式, 并且存放在专门的对象-关系映射文件中.
在持久化层中Hibernate会提供API方法来方便对数据的操作,在配置文件中主要是做数据库与对象之间的具体的关系映射。下图给出一张Hibernate操作数据库与jdbc操作数据的对比图:
通过这图的对比可以看出使用Hibernate做数据的访问是很节省开发成本的,省下了很多不必要关系的逻辑,而是将重心放在本身的业务逻辑开发中。
项目结构如图很清晰的项目结构,lib包中放入的是Hibernate所需要的jar包,resources中放入的是Hibernate的配置文件。其中jar包的下载地址https://pan.baidu.com/s/1i4LfEFb,使用的数据库是oracle,下载地址中也包含了oracle需要的jar包。
从配置文件hibernate.cfg.xml开始分析
该配置文件是直接从Hibernate的官方开发文档中拷贝过来的,地址http://docs.jboss.org/hibernate/orm/4.3/devguide/en-US/html_single/#d5e83,使用的Hibernate版本是4.3版本。
该配置文件中包含了配置连接数据库的基本信息,和配置 hibernate 的基本信息,以及指定关联的.hbm.xml文件文件。
以下贴出配置mysql的配置文件信息:
需要注意的一点是,其中mapping配置关联文件使用的是目录地址,这个是需要注意的。
Student实体类的代码
只是简单的定义了二个基本属性,没说明好说的。
Student.hbm.xml orm映射文件
HibernateUtil工具类
用于返回SessionFactory
FirstTest测试类
运行项目控制台打印结果:
从控制台打印的消息可以看出,执行了一天查询语句。而在oracle数据库中Student表并不存在,现在打开Oracle数据库会发现:
数据库中自动创建了一张student表,表名和字段和我们在映射文件中定义的是对应的。
在数据库中插入一天数据在执行代码看控制台:
现在控制台是打印出了数据的。其中session.get(),这是Hibernate提供的API方法。
什么是Hibernate
对于Hibernate的定义按照以下三点来说明:
一个框架一个 Java 领域的持久化框架
一个 ORM 框架
首先解释什么叫持久化?
1.狭义的理解,“持久化”仅仅指把对象永久保存到数据库中。2.广义的理解,“持久化”包括和数据库相关的各种操作:
- 保存:把对象永久保存到数据库中。
- 更新:更新数据库中对象(记录)的状态。
- 删除:从数据库中删除一个对象。
- 查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。
- 加载:根据特定的OID,把一个对象从数据库加载到内存中。
所谓OID是指为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。在关系数 据库中称之为主键,而在对象术语中,则叫做对象标识(Object identifier-OID).
ORM(Object/Relation Mapping): 对象/关系映射
ORM 主要解决对象-关系的映射ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。
ORM 采用元数据来描述对象-关系映射细节, 元数据通常采用 XML 格式, 并且存放在专门的对象-关系映射文件中.
Hibernate中实现ORM如下图
在持久化层中Hibernate会提供API方法来方便对数据的操作,在配置文件中主要是做数据库与对象之间的具体的关系映射。下图给出一张Hibernate操作数据库与jdbc操作数据的对比图:
通过这图的对比可以看出使用Hibernate做数据的访问是很节省开发成本的,省下了很多不必要关系的逻辑,而是将重心放在本身的业务逻辑开发中。
现在编写一个简单的Hibernate项目
项目结构如下:项目结构如图很清晰的项目结构,lib包中放入的是Hibernate所需要的jar包,resources中放入的是Hibernate的配置文件。其中jar包的下载地址https://pan.baidu.com/s/1i4LfEFb,使用的数据库是oracle,下载地址中也包含了oracle需要的jar包。
从配置文件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> <!-- Database connection settings --> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <property name="connection.username">star2013</property> <property name="connection.password">star2013</property> <!-- JDBC connection pool (use the built-in) --> <property name="connection.pool_size">1</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <!-- Disable the second-level cache --> <propertyname="cache.provider_class"> org.hibernate.cache.internal.NoCacheProvider </property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <!-- 是否对 SQL 进行格式化 --> <property name="format_sql">true</property> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">update</property> <mapping resource="com/iflytek/test/domain/Student.hbm.xml"/> </session-factory> </hibernate-configuration>
该配置文件是直接从Hibernate的官方开发文档中拷贝过来的,地址http://docs.jboss.org/hibernate/orm/4.3/devguide/en-US/html_single/#d5e83,使用的Hibernate版本是4.3版本。
该配置文件中包含了配置连接数据库的基本信息,和配置 hibernate 的基本信息,以及指定关联的.hbm.xml文件文件。
以下贴出配置mysql的配置文件信息:
<?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.username">root</property> <property name="connection.password">123456</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql:///hibernate</property> <!-- 配置 hibernate 的基本信息 --> <!-- hibernate 所使用的数据库方言 --> <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> <!-- 执行操作时是否在控制台打印 SQL --> <property name="show_sql">true</property> <!-- 是否对 SQL 进行格式化 --> <property name="format_sql">true</property> <!-- 指定自动生成数据表的策略 --> <property name="hbm2ddl.auto">update</property> <!-- 指定关联的.hbm.xml文件 --> <mapping resource="com/iflytek/test/News.hbm.xml"/> </session-factory> </hibernate-configuration>
需要注意的一点是,其中mapping配置关联文件使用的是目录地址,这个是需要注意的。
Student实体类的代码
package com.iflytek.test.domain; /** * @desc: Hibernate01 * @author: star2013 * @createTime: 2017年5月11日 下午9:51:09 * @history: * @version: v1.0 */ public class Student { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Student(Long id, String name) { super(); this.id = id; this.name = name; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + "]"; } }
只是简单的定义了二个基本属性,没说明好说的。
Student.hbm.xml orm映射文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.iflytek.test.domain"> <class name="Student" table="TB_STUDENT"> <id name="id" column="ID" type="long"></id> <property name="name" column="NAME"></property> </class> </hibernate-mapping>
HibernateUtil工具类
package com.iflytek.test.util; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static SessionFactory sessionFactory; static{ Configuration configuration = new Configuration().configure(); //sessionFactory = configuration.buildSessionFactory(); StandardServiceRegistry ssr = new StandardServiceRegistryBuilder() .applySettings(configuration.getProperties()) .build(); sessionFactory = configuration.buildSessionFactory(ssr); } public static SessionFactory getSessionFactory(){ return sessionFactory; } }
用于返回SessionFactory
FirstTest测试类
package com.iflytek.test.main; import org.hibernate.Session; import org.hibernate.Transaction; import com.iflytek.test.domain.Student; import com.iflytek.test.util.HibernateUtil; public class FirstTest { public static void main(String[] args) { //创建session对象 Session session = HibernateUtil.getSessionFactory().openSession(); //开启事物 Transaction transaction = session.beginTransaction(); //select *from TB_studnet where id=? Student stu = (Student) session.get(Student.class, 1L); System.out.println(stu.toString()); session.close(); transaction.commit(); } }
运行项目控制台打印结果:
从控制台打印的消息可以看出,执行了一天查询语句。而在oracle数据库中Student表并不存在,现在打开Oracle数据库会发现:
数据库中自动创建了一张student表,表名和字段和我们在映射文件中定义的是对应的。
在数据库中插入一天数据在执行代码看控制台:
现在控制台是打印出了数据的。其中session.get(),这是Hibernate提供的API方法。
相关文章推荐
- 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架
- 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架
- hibernate学习(二)----初识标签
- 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架
- hibernate 学习笔记一(初识hibernate)
- Hibernate基础学习(一)—初识Hibernate
- Hibernate学习(1)- 初识
- 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架 .
- 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架
- 【Hibernate框架学习】:Hibernate初识
- 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架
- Hibernate框架学习之初识Hibernate
- 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架
- Hibernate学习笔记:初识Hibernate
- hibernate 学习笔记一(初识hibernate)
- Hibernate学习手记(一)
- 学习部署struts+hibernate例子--PowerAcl的笔记
- 记录hibernate 3学习过程中的报错(未完成)
- Hibernate学习资料---大会菜(方便公司内同事下载,公网用户不可使用!)
- 如何学习Hibernate