Hibernate基本原理

对象关系映射框架Hibernate。hibernate对JDBC做了轻量级的对象封装,对做java的来说,本着操作对象的想法去操作数据就简单了。

在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的介绍。就此写了这篇简单的记录。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值