首页 > 代码库 > SSH框架第一天——hibernate框架

SSH框架第一天——hibernate框架

什么是框架?

是软件的半成品,它已经完成了部分功能。

 

什么是hibernate?

 hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

简单的说,hibernate框架通过映射(xml配置文件)来关联javabean和数据库,程序员可以操作对象来操作数据库了。)

 

三大框架在javaweb中的位置:

技术分享

Hibernate在开发中的位置:

技术分享
 
 

注      意:hibernate的底层依然还是jdbc规范,只不过我们只负责框架的操作方式,而不用在写jdbc代码了。

顺便提提:虽然dbutils工具类也封装了jdbc的接口规范,但javabean的属性和表的字段不一致时,开发则封装不了,而换做hibernate框架则可以智能的封装起来。

好         处:Jdbc代码非常固定繁琐,而hibernate简化我们开发,除此之外还提供一些新的功能,例如:缓存功能………

 

下面一起来完成第一个hibernate例子:

 

第一步:下载hibernate运行环境,导包(Mysql驱动包 +hibernate必须包 + 日志包)

 

Hibernate环境下载地址:

http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/hibernate-release-5.0.7.Final.zip/download

 

MySQL数据库驱动包下载:

http://download.csdn.net/download/happy516/1753230

 

下载后找到所需包,如下:

 

 技术分享

 

 

第二步:创建表结构


 



Create database employee;

Use employee;

CREATE TABLE `employee`(

`id` bigint(32) NOTNULL AUTO_INCREMENT COMMENT ‘员工编号‘,

`name` varchar(32) NOTNULL COMMENT ‘员工名称‘,

`source` varchar(32)DEFAULT NULL COMMENT ‘员工信息来源‘,

`industry` varchar(32)DEFAULT NULL COMMENT ‘员工所属行业‘,

`level` varchar(32)DEFAULT NULL COMMENT ‘员工级别‘,

`linkman` varchar(64)DEFAULT NULL COMMENT ‘联系人‘,

`phone` varchar(64)DEFAULT NULL COMMENT ‘固定电话‘,

`mobile` varchar(16)DEFAULT NULL COMMENT ‘移动电话‘,

PRIMARY KEY (`id`)

) ENGINE=InnoDBAUTO_INCREMENT=94 DEFAULT CHARSET=utf8;

 

第三步:写javabean

    public class employee{

       private Long id;

       private String name;

       private Long user_id;

       private Long create_id;

       private String source;

       private String industry;

       private String level;

       private String linkman;

       private String phone;

       private String mobile;

       // 生成get()…set()…

    }

 

第四步:写类与表的映射(一个javabean对应一个映射)

 

默认的命名规则:实体类名.hbm.xml

              这里就是employee.hbm.xml

 

引入约束:

       <!DOCTYPE hibernate-mapping PUBLIC

           "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

           "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

注意:引入的是hibernate3.0的dtd约束,不要引入4的约束(不向下兼容)

 

 

完整配置:

 

<?xmlversion="1.0"encoding="UTF-8"?>

    <!DOCTYPEhibernate-mappingPUBLIC

        "-//Hibernate/HibernateMapping DTD 3.0//EN"

        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

 

    <hibernate-mapping>

        <classname="com.demo.domain.employee"table="employee">

<!--name是javabean属性,column是表属性,在上面有说到,属性名和表明不一致时,hibernate也会智能的封装,不信可以测试一下-->

 

            <idname="id"column="id">

      <!--主键生成策略-->

                <generatorclass="native"/>

            </id>

            <propertyname="name"column="name"/>

            <propertyname="source"column="source"/>

            <propertyname="industry"column="industry"/>

            <propertyname="level"column="level"/>

            <propertyname="linkman"column="linkman"/>

            <propertyname="phone"column="phone"/>

            <propertyname="mobile"column="mobile"/>

        </class>

</hibernate-mapping>

 

关于<generator class="native"></generator>的不同属性含义推荐参考:http://blog.sina.com.cn/s/blog_7b8a637f010142if.html

 

第五步:写hibernate核心映射:

 

方式一(了解):

属性文件方式配置,级hibernate.properties

缺点:不能加载映射的配置文件,需要手动编写代码去加载

 

方式二:(主要方式)

 

 默认格式:hibernate.cfg.xml(不可以修改)

 不妨参考一下hibernate-release-5.0.7.Final.zip----àproject--àetc--àhibernate.properties

打开hibernate.properties会有相应数据库的映射格式(这里以mysql为例):

 

 

完整配置:

 

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEhibernate-configurationPUBLIC

   "-//Hibernate/HibernateConfiguration DTD 3.0//EN"

   "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

  

<hibernate-configuration>

   <!--一个数据库对应一个SessionFactory标签 -->

   <session-factory>

      <!-- 4大参数和数据库的方言 -->

      <propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

      <propertyname="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>

      <propertyname="hibernate.connection.username">root</property>

      <propertyname="hibernate.connection.password">1234</property>

      <!-- 数据库的方言 -->

      <propertyname="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

      <!--引入映射的配置文件 -->

      <mappingresource="com/demo/domain/employee.hbm.xml"/>

     

<!--下面的是可选配置 -->

      <!--在控制台显示sql语句 -->

      <propertyname="hibernate.show_sql">true</property>

      <!-- 格式化sql语句 -->

      <propertyname="hibernate.format_sql">true</property>

      <!-- 生成数据库的表结构

         update:如果没有表结构,创建表结构。如果存在,不会创建。

      -->

      <propertyname="hibernate.hbm2ddl.auto">update</property>

   <!--校验映射文件与表中字段是否一致如果不一致就会报错-->

      <propertyname="hibernate.hbm2ddl.auto">validate</property>

 

   </session-factory>

</hibernate-configuration> 

 

聊聊session-factory:

 

1. session-factory是工厂类,是生成Session对象的工厂类

2.SessionFactory类的特点:

 

一丶SessionFactory对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存。

 

常见的SQL语句是增删改查(通过主键来查询)

一个SessionFactory实例对应一个数据库,应用从该对象中获得Session实例。

 

二丶SessionFactory是线程安全的,一个实例可以被应用的多个线程共享。

 

三丶SessionFactory是重量级的,不能随意创建或销毁它的实例。如果只访问一个数据库,只需要创建一个SessionFactory实例,且在应用初始化的时候完成。

 

四丶SessionFactory需要一个较大的缓存,用来存放预定义的SQL语句及实体的映射信息。另外可以配置一个缓存插件,这个插件被称之为Hibernate的二级缓存,被多线程所共享。

 

第六步:写hibernate入门代码:

 

packagecom.demo.test;

 

importorg.hibernate.Session;

importorg.hibernate.SessionFactory;

importorg.hibernate.Transaction;

importorg.hibernate.cfg.Configuration;

importorg.junit.Test;

importcom.demo.domain.employee;

public class demo {

   @Test

   public void test(){

         // 1. 先加载配置文件

         Configuration config = new Configuration();

         // 默认加载src目录下hibernate.cfg.xml的配置文件

         //再次强调,写hibernate核心映射名字固定的,不许改变。

         config.configure();

 

         //核心映射为属性配置方式时,要手动加相应映射

//config.addResource("com/demo/domain/employee.hbm.xml");

                // 2. 创建SessionFactory对象

                SessionFactory factory =config.buildSessionFactory();

                // 3. 创建session对象

                Session session =factory.openSession();

                // 4. 开启事务

                Transaction tr =session.beginTransaction();

                // 5. 编写保存的代码

                employee e = new employee();

                // c.setid(cust_id); 主键是自动递增了,可以忽略

                e.setName("小明");

                e.setLevel("师傅");

                e.setPhone("10086");

                e.setLinkman("张三");

                e.setMobile("13800138000");

                e.setSource("人才网");

                e.setIndustry("清洁行业");

                // 保存数据,操作对象就相当于操作数据库的表结构

                session.save(e);

                // 6. 提交事务

                tr.commit();

                // 7. 释放资源

                session.close();

                factory.close();

   }

}

 

说明一下:这里测试类用到Junit,要导入Junit包,下载地址:http://download.csdn.NET/detail/zht0627/3125442

   有疑问或者要更正的,请您留言私信支持,谢谢!

   持续更新中。。。

SSH框架第一天——hibernate框架