Hibernate

mark

持久化

即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等,那么什么是持久层(Persistence Layer),即专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。

持久化是将程序数据在持久状态和瞬时状态间转换的机制。比如JDBC就是一种持久化机制。文件IO也是一种持久化机制。

广义的理解,“持久化"包括和数据库相关的各种操作: 保存:把对象永久保存到数据库中。 更新:更新数据库中对象(记录)的状态。 删除:从数据库中删除一个对象。 查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。 加载:根据特定的OID,把一个对象从数据库加载到内存中

ORM

对象关系映射 Object Relational Mapping,一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的——“虚拟对象数据库”。

面向对象概念 面向关系概念
对象 表的行(记录)
属性 表的列(字段)

ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。

ORM 采用元数据来描述对象 —— 关系映射细节, 元数据通常采用 XML 格式,并且存放在专门的对象 —— 关系映射文件中.

那么什么是元数据呢? 元数据是一种描述数据的数据,任何文件系统中的数据分为数据和元数据。数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息等等,其实在Linux文件系统中元数据就是INode! mark

hibernate

hibernate为应用程序提供了高效的O/R关系映射和查询服务,为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。

hibernate的Helloworld

hibernate这个框架呢我还是从helloworld开始复习,第一步纯粹当做是预习了,首先说一下普通的Java工程中如何使用hibernate框架,Java版本的HelloWorld正式开始!

首先需要一些jar包( 点击这里即可下载 ),我要说明的是这些jar包的hibernate版本是4.2,如果你需要新的去网上下载就好了!接着我使用的eclipse演示这个额HelloWorld程序,需要安装一个hibernate的插件: 在workwith里面输入:http://download.jboss.org/jbosstools/updates/stable/kepler/ mark

我的项目目录结构就是这样了: mark hibernate.cfg.xml是通过刚才安装的eclipse的hibernate插件生成的,内容如下(指定关联的 .hbm.xml 文件是后面生成的):

 1<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE hibernate-configuration PUBLIC
 3		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4		"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 5<hibernate-configuration>
 6    <session-factory>
 7    	<!-- 指定数据库的驱动、用户名、密码 -->
 8        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
 9        <property name="hibernate.connection.password">1234</property>
10        <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/hibernate4</property>
11        <property name="hibernate.connection.username">root</property>
12        
13        <!-- 重点,这里容易出错,最常使用MySQL5InnoDBDialect 或者 MySQLInnoDBDialect -->
14        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
15    	
16    	<!-- 在执行过程中打印sql语句 -->
17    	<property name="show_sql">true</property>
18    	<!-- 将打印的sql语句格式化-->
19    	<property name="format_sql">true</property>
20    	<!-- 指定自动生成数据表的策略 -->
21    	<property name="hbm2ddl.auto">update</property>
22    	
23		<!-- 设置Hibernate的事务隔离级别 -->
24		<property name="connection.isolation">2</property>
25		
26    	<!-- 指定关联的 .hbm.xml 文件 -->
27		<mapping resource="com/xpu/demo_01/News.hbm.xml"/>
28		
29    </session-factory>
30</hibernate-configuration>

从上面也可以看出来,hibernate.cfg.xml是hibernate的基本配置信息,在JDBC阶段就已经接触过,我就不在此一一细说了,接下来我们需要一个实体类来对应表,类的对象来对应表的记录,于是此设计如下:

 1package com.xpu.demo_01;
 2
 3import java.util.Date;
 4
 5public class News {
 6	private Integer id;
 7	private String title;
 8	private String author;
 9	private Date date;
10	public News() {
11		super();
12	}
13	//ID我们在数据库中设定的是自增,所以不在构造方法的参数中
14	public News(String title, String author, Date date) {
15		super();
16		this.title = title;
17		this.author = author;
18		this.date = date;
19	}
20	public Integer getId() {...}
21	public void setId(Integer id) {...}
22	public String getTitle() {...}
23	public void setTitle(String title) {...}
24	public String getAuthor() {...}
25	public void setAuthor(String author) {...}
26	public Date getDate() {...}
27	public void setDate(Date date) {...}
28	@Override
29	public String toString() {...}
30}

根据此类生成一个对象关系映射文件,就是News.hbm.xml:

 1<?xml version="1.0"?>
 2<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4<!-- Generated 2019-1-30 13:27:35 by Hibernate Tools 3.5.0.Final -->
 5<hibernate-mapping>
 6    <class name="com.xpu.demo_01.News" table="NEWS">
 7        <id name="id" type="java.lang.Integer">
 8            <!-- 主键自增让数据库原生的去操作 -->
 9            <column name="ID" />
10            <generator class="native" />
11        </id>
12        <property name="title" type="java.lang.String">
13            <column name="TITLE" />
14        </property>
15        <property name="author" type="java.lang.String">
16            <column name="AUTHOR" />
17        </property>
18        <property name="date" type="java.sql.Date">
19            <column name="DATE" />
20        </property>
21    </class>
22</hibernate-mapping>

相信这个还是非常容易明白的,ID主键自增让数据库原生的去操作,所以generaor配置的是native,其他的内容标题、作者等都是String类型,时间就是Java的java.util.Date类型,这样就建立了类的属性和表的字段的关系,这很关键! 接下来就该使用代码去操作了:

 1package com.xpu.demo_01;
 2
 3import java.util.Date;
 4
 5import org.hibernate.Session;
 6import org.hibernate.SessionFactory;
 7import org.hibernate.Transaction;
 8import org.hibernate.cfg.Configuration;
 9import org.hibernate.service.ServiceRegistry;
10import org.hibernate.service.ServiceRegistryBuilder;
11
12public class HibnateTest1 {
13	public void main(String[] args) {
14
15		// 1、创建配置对象 负责加载配置文件
16		Configuration configuration = new Configuration().configure();
17
18		// 2、创建一个 ServiceRegistry对象,hibernate的任何配置和服务都需要在该对象中注册后才能有效.
19		ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
20				.buildServiceRegistry();
21		// 3、创建一个 SessionFactory对象
22		SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
23
24		// 4、获得Session对象
25		Session session = sessionFactory.openSession();
26
27		// 5、开启事务
28		Transaction transaction = session.beginTransaction();
29
30		// 6、创建对象,通过Session保存相应的数据至数据库
31		News tabledataEntity = new News("Java", "Tim", new Date());
32		session.save(tabledataEntity);
33
34		// 6.1获取对象(如果你之前保存过一条数据,那么此时也可以取出)
35		// News news2 = (News)session.get(News.class, 15);
36		// System.out.println(news2);
37
38		// 7、提交事务
39		transaction.commit();
40
41		// 8、关闭Session
42		session.close();
43
44		// 9、关闭SessionFactory
45		sessionFactory.close();
46	}
47}

执行完毕后,数据库的表中就会多一条数据,如果失败,可能是由于编码问题导致的,我的eclipse工程配置的都是UTF-8的编码,你可以在项目属性中尝试如下编码配置方式: mark 普通Java工程的hibernate的Helloworld就说完了,API以后再慢慢解释,下面说一下Maven工程下如何搭建这个Helloworld,Maven的依赖如下:

 1<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
 2<dependency>
 3    <groupId>org.hibernate</groupId>
 4    <artifactId>hibernate-core</artifactId>
 5    <version>4.2.4.Final</version>
 6</dependency>
 7
 8<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 -->
 9<dependency>
10    <groupId>org.hibernate</groupId>
11    <artifactId>hibernate-c3p0</artifactId>
12    <version>4.2.4.Final</version>
13</dependency>
14
15<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
16<dependency>
17    <groupId>mysql</groupId>
18    <artifactId>mysql-connector-java</artifactId>
19    <version>5.1.6</version>
20</dependency>

与普通Java工程不同之处就在于News.hbm.xml文件和hibernate.cfg.xml文件的放置位置,很显然在Maven下,这两个文件都可以放在resource目录下: mark 只不过稍微有点不同的是:在hibernate.cfg.xml中配置News.hbm.xml的位置的时候,直接写名字就好了!