Hibernate 起步
标签: Java Hibernate
环境
//MySql:
mysql> select version();
+------------+
| version() |
+------------+
| 5.7.17-log |
+------------+
1 row in set
//Eclipse:
Eclipse Java EE IDE for Web Developers.
Version: Oxygen Release (4.7.0)
Build id: 20170620-1800
Helleoworld准备
- 在
Eclipse Marketplace
上hibernatetools
。 - 导入Hibernate必须的jar包
antlr-2.7.7.jar
classmate-1.3.0.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-5.0.1.Final.jar
hibernate-core-5.2.10.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
jandex-2.0.3.Final.jar
javassist-3.20.0-GA.jar
jboss-logging-3.3.0.Final.jar
jboss-transaction-api_1.2_spec-1.0.1.Final.jar
- 加入数据库驱动的jar包
mysql-connector-java-5.0.8-bin.jar
书写代码
创建Hibernate配置文件
<!-- 配置连接数据库的信息 -->
<property name="connection.username">root</property>
<property name="connection.password">102559</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3396/goods?useUnicode=true&characterEncoding=utf8</property>
<!-- 配置 hibernate 的基本信息 -->
<!-- hibernate 所使用的数据库方言 (支持事务) -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</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/ncu/hibernate/helloworld/News.hbm.xml"/>
创建持久化类
- 提供一个无参的构造器:使Hibernate可以使用Constructor.newInstance() 来实例化持久化类
- 提供一个标识属性(identifier property): 通常映射为数据库表的主键字段. 如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate()
- 为类的持久化类字段声明访问方法(get/set): Hibernate对JavaBeans 风格的属性实行持久化。
- 使用非 final 类: 在运行时生成代理是 Hibernate 的一个重要的功能. 如果持久化类没有实现任何接口, Hibnernate 使用 CGLIB 生成代理. 如果使用的是 final 类, 则无法生成 CGLIB 代理.
- 重写 eqauls 和 hashCode 方法: 如果需要把持久化类的实例放到 Set 中(当需要进行关联映射时), 则应该重写这两个方法
public class News {
public News() {}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
private int id;
private String title;
private String author;
private Date date;
}
Hibernate 不要求持久化类继承任何父类或实现接口,这可以保证代码不被污染。这就是Hibernate被称为低侵入式设计的原因
创建对象-关系映射文件
Hibernate 采用 XML 格式的文件来指定对象和关系数据之间的映射. 在运行时 Hibernate 将根据这个映射文件来生成各种 SQL 语句
映射文件的扩展名为 .hbm.xml
右键SRC,选择NEW一个Hibernate XML Mapping file(hbm.xml)
文件
通过Hibernate API编写访问数据库的代码
public class HibernateTest {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init() {
//// 创建服务注册对象
ServiceRegistry registry =
new StandardServiceRegistryBuilder().configure().build();
// 创建会话工厂
sessionFactory =
new MetadataSources(registry).buildMetadata().buildSessionFactory();
//创建一个Session对象
session = sessionFactory.openSession();
//开启事务
transaction = session.beginTransaction();
}
@Test
public void test() {
News news = session.get(News.class, 1);
System.out.println(news);
}
@After
public void destroy() {
//提交事务
transaction.commit();
//关闭Session和SessionFactory
session.close();
sessionFactory.close();
}
}
持久化
- 狭义的理解,“持久化”仅仅指把对象永久保存到数据库中
- 广义的理解,“持久化”包括和数据库相关的各种操作:
- 保存:把对象永久保存到数据库中。
- 更新:更新数据库中对象(记录)的状态。
- 删除:从数据库中删除一个对象。
- 查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。
- 加载:根据特定的OID,把一个对象从数据库加载到内存中。
为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。在关系数据库中称之为主键,而在对象术语中,则叫做对象标识(Object identifier-OID).
ORM
ORM(Object/Relation Mapping): 对象/关系映射
- ORM 主要解决对象-关系的映射
面向对象概念 | 面向关系概念 |
---|---|
类 | 表 |
对象 | 表的行 |
属性 | 表的列 |
- ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。
- ORM 采用元数据来描述对象-关系映射细节, 元数据通常采用 XML 格式, 并且存放在专门的对象-关系映射文件中.