在ssh集成中,hibernate主要作用在底层对数据操作上。
一、原理:
1)、JDBC封装:java中对数据库的操作,想到的了JDBC,以往连接数据库都是通过写一连串的 jdbc 语句:
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//DriverManager获取数据库连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:port/databasesname",username,pssword);
//使用Connection来创建一个Statement对象
Statement stmt=conn.createStatement();
//执行SQL语句
ResultSet rs=stmt.executeQuery(sql);
现在 hibernate 对JDBC连接做了封装,只需做一个配置文件就OK: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/test</property>
<property name="connection.username">root</property>
<property name="connection.password">mysecretpassword</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hbm2dll.auto">update</property>
<property name="javax.persistence.validation.mode">none</property>
<property name="show_sql">true</property>
<!-- 实体映射关系 -->
<mapping resource="com/bean/User.hbm.xml"/>
<mapping resource="com/bean/Journal.hbm.xml"/>
<mapping resource="com/bean/Article.hbm.xml"/>
<mapping resource="com/bean/Chapter.hbm.xml"/>
<mapping resource="com/bean/Paragraph.hbm.xml"/>
</session-factory></hibernate-configuration>
2)、分层作用域:通常所说的mvc (model, view, controller),习惯性的将其分为三个层面(表现层、业务逻辑层、持久层),往高了说hibernate就是在持久层作用,对数据操作。
3)、hibernate 作为一个开源的ORM框架(Object-Relational-Mapping),在关系型数据库和java实体对象之间建立一个映射,通过这个映射,达到操作实体对象即可操作数据库表的目的,下面就来一个实体和映射文件:
java实体:Journal.java
public class Journal {
private Integer journal_id;
private String journal_title;
private String ISSN;
private Set<Article> articles = new HashSet<Article>();
public String getISSN() {
return ISSN;
}
public void setISSN(String iSSN) {
ISSN = iSSN;
}
public String getJournal_title() {
return journal_title;
}
public void setJournal_title(String journal_title) {
this.journal_title = journal_title;
}
public Integer getJournal_id() {
return journal_id;
}
public void setJournal_id(Integer journal_id) {
this.journal_id = journal_id;
}
public Set<Article> getArticles() {
return articles;
}
public void setArticles(Set<Article> articles) {
this.articles = articles;
}
}
hibernate建立的实体映射:Journal.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.bean.Journal" table="journal" catalog="test">
<id name="journal_id" type="java.lang.Integer">
<column name="journal_id"></column>
<generator class="identity"></generator>
</id>
<property name="journal_title" type="java.lang.String">
<column name="journal_title" length="20" not-null="false"></column>
</property>
<property name="ISSN" type="java.lang.String">
<column name="ISSN" length="20" not-null="false"></column>
</property>
<set name="articles" inverse="true" cascade="all">
<key column="journal_id"></key>
<one-to-many class="com.bean.Article"></one-to-many>
</set>
</class>
</hibernate-mapping>
二、hibernate中的核心接口,下面就拿这几个接口的调用顺序来说说事儿。
1)、Configuration:
初始化Hibernate配置管理类Configuration;
启动hibernate和加载配置文件的事儿就靠它了,像上文提到的hibernate.cfg.xml文件和Journal.hbm.xml都是通过它来加载的;
创建下一步将要用到的SessionFactory类,创建完成后将会被丢弃;
//读取hibernate.cfg.xml文件
Configuration cinfiguration = new Configuration().configure();
2)、SessionFactory:
该接口负责初始化Hibernate,它充当数据存储源的代理,并负责创建Session对象;
创建下一步将要用到的 Session;
//创建SessionFactory
SessionFactory factory = cinfiguration.buildSessionFactory();
3)、Session:
该接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句);
通过 Query 和 Criteria 两个接口,执行SQL语句,达到操作数据库的目的;
下面就来一段具体的流程代码:
//启动hibernate,读取加载 hibernate.cfg.xml 相关文件;<span style="color:black;"> Hibernate</span><span style="color:black;">会自动在目录下搜索</span><span style="color:black;">hibernate.cfg.xml</span><span style="color:black;">文件,</span>也可以设置路径动态加载
Configuration configuration = new Configuration().configure();
//建立SessionFactory
SessionFactory factory =cfg.buildSessionFactory();
//取得session
Session session = null;
try{
//开启session
session = factory.openSession();
//开启事务
session.beginTransaction();
Journal journal = new Journal();
Journal.setISSN("1232");
Journal.setJournal_title("测试");
//保存Journal对象
session.save(journal);
//提交事务,到此完成实体对象到数据库表的操作流程
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
//回滚事务
session.getTransaction().rollback();
}finally{
if(session != null){
if(session.isOpen()){
//关闭session
session.close();
}
}
}
三、优势劣势
优势: 上头说完了hibernate的基本配置和应用,现在就来挑挑鸡骨头
1)、封装JDBC,然后通过建立映射关系来达到操作数据库表的目的;作为一名开发者,面向对象开发开发是跑不掉了;实体-映射关系-数据库表 这种方式让人更容易理解,开发也简便了许多。
2)、作为一个轻量级的应用框架,hibernate不需要实现其它接口,可以用在任何JDBC使用的场合。
3)、提供了缓存机制,提供一级缓存和二级缓存,查询更快,提高了效率。
4)、移植性会很好,来一般应用中,涉及数据迁移时,只需修改hib的相关配置文件即可,减少了工作量。
劣势:
1)、第一个就是对数据量大的数据更新,不适合批量操作。
2)、配置文件中指定了DB,则将使用该数据库特性的相关语句,优化的难度也就增加了。
完了,自己的一些经验,网上系统的看了下hibernate的介绍。就此写了这篇简单的记录。