Hibernate
持久化
即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等,那么什么是持久层(Persistence Layer),即专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。
持久化是将程序数据在持久状态和瞬时状态间转换的机制。比如JDBC就是一种持久化机制。文件IO也是一种持久化机制。
广义的理解,“持久化"包括和数据库相关的各种操作: 保存:把对象永久保存到数据库中。 更新:更新数据库中对象(记录)的状态。 删除:从数据库中删除一个对象。 查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。 加载:根据特定的OID,把一个对象从数据库加载到内存中
ORM
对象关系映射 Object Relational Mapping,一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的——“虚拟对象数据库”。
面向对象概念 | 面向关系概念 |
---|---|
类 | 表 |
对象 | 表的行(记录) |
属性 | 表的列(字段) |
ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。
ORM 采用元数据来描述对象 —— 关系映射细节, 元数据通常采用 XML 格式,并且存放在专门的对象 —— 关系映射文件中.
那么什么是元数据呢? 元数据是一种描述数据的数据,任何文件系统中的数据分为数据和元数据。数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息等等,其实在Linux文件系统中元数据就是INode!
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/
我的项目目录结构就是这样了: 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的编码,你可以在项目属性中尝试如下编码配置方式: 普通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目录下: 只不过稍微有点不同的是:在hibernate.cfg.xml中配置News.hbm.xml的位置的时候,直接写名字就好了!