Hibernate-入门案例

来源:互联网 发布:壳中少女知乎 编辑:程序博客网 时间:2024/05/15 22:05

Hibernate是一个开放源代码的ORM(Object Relational Mapping,对象关系映射)框架,它对JDBC进行了轻量级的对象封装,是的Java开放人员可以使用面向对象的编程思想来操作数据库。

ORM就是利用描述对象和数据库表之间映射的元数据,自动把Java应用程序中的对象,持久化到关系型数据库的表中。通过操作Java对象,就可以完成对数据库表的操作。

Hibernate的下载和安装

去官网http://hibernate.org/orm/ ,点击左边菜单的DownLoads,Older releases can be found on SourceForge or in JBoss’s Maven repository.点击on SourceForge这个超链接,点击Parent folder,点击hibernate3,点击3.6.10.Final,hibernate-distribution-3.6.10.Final-dist.zip是Windows下的版本,Final表示版本号为正式版。hibernate-distribution-3.6.10.Final-dist.tar.gz是Linux下的版本。把Windows版本的下载下来,解压,目录结构如下

  • documentation:相关文档
  • lib:相关jar包
    • bytecode:操作字节码额jar包
    • jpa:实现的jpa规范
    • optional:可选的jar包
    • required:必须的jar包
  • project:源码
  • hibernate3.jar:核心jar包

例子

1.导入jar包。11个

  • hibernate3.jar:Hibernate的核心类库
  • required目录下的全部jar包
    • antlr-2.7.6.jar:语言转换工具,实现HQL到SQL的转换
    • commons-collections-3.1.jar:collections Apache,增强Java对集合的处理
    • dom4j-1.6.1.jar:解析xml
    • javassist-3.12.0.GA.jar:分析,编辑和创建Java字节码的类库
    • jta-1.1.jar:标准的Java事务(跨数据库)处理接口
    • slf4j-api-1.6.1.jar:只是一个接口,用于整合log4j
  • jpa目录下的
    • hibernate-jpa-2.0-api-1.0.1.Final.jar:JPA接口开发包
  • log4j-1.2.16.jar:日志记录
  • slf4j-log4j12-1.7.2.jar:整合log4j的包
  • mysql-connector-java-5.0.8.zip:数据库驱动

2.在src下建一个log4j.properties文件

### direct log messages to stdout ###log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.errlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### direct messages to file mylog.log ###log4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=c\:mylog.loglog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### set log levels - for more verbose logging change 'info' to 'debug' ###log4j.rootLogger=info, stdout,file

3.创建表

create table customer(    id int(11) not null auto_increment comment '主键id',    name varchar(20) default null comment '姓名',    age int(11) default null comment '年龄',    sex varchar(2) default null comment '性别',    city varchar(20) default null comment '城市',    primary key (id));

4.编写实体类(持久化类)

持久化类是应用程序中的业务实体类,这里的持久化是指类的对象能够被持久化保存到数据库中。

public class Customer {    private Integer id;    private String name;    private Integer age;    private String sex;    private String city;    //这里省略了相关的get和set方法    ...}

持久化类的编写规范

  • 必须提供一个无参的public的构造函数(如果没有提供,虚拟机默认创建一个,如果提供了其他有参数的构造方法的话,虚拟机不再提供默认的构造方法,必须手动编写无参构造方法)
  • 属性用private修饰,提供public的get和set方法。Hibernate默认访问的是各个属性的get和set方法。
  • 持久化类不要用final进行修饰,用final修饰的类不能被继承,无法生成代理对象。(延迟加载的时候要返回代理对象)
  • 尽量使用包装类型。如果使用基本数据类型,默认值为0。我成绩存了0,是代表没有考试还是考试成绩为0?包装类型的话,没有成绩就会存null。
  • 必须提供标识属性OID,与数据库表中主键对应,例如Customer类的id属性。(虚拟机区分两个对象,是否使用同一个地址;数据库区分两条记录是否一致,使用主键;Hibernate区分持久化对象是否是同一个,根据OID)

5.编写映射文件

实体类Customer目前还不具备持久化操作的能力,而Hibernate需要知道实体类Customer映射到数据库Hibernate中的那个表,以及类中的哪个属性对应数据库表中的那个字段,这些都需要在映射文件中配置。

持久化类:实体类+映射文件

映射文件就是一个xml文件,名字任意。通常是实体类名称.hbm.xml,这个文件通常和实体类在同一个包下。

dtd约束在hibernate3.jar/org.hibernate/hibernate-mapping-3.0.dtd中

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping>    <class name="cn.itcast.hibernate3.demo1.Customer" table="customer">        <id name="id" column="id">            <generator class="native"/>        </id>        <property name="name" column="name" type="string" length="20"/>        <property name="age" column="age" type="integer"/>        <property name="sex" column="sex" type="string"/>        <property name="city" column="city" type="string"/>    </class></hibernate-mapping>
  • class节点:用于配置一个实体类的映射信息,name属性对应实体类名,table属性对应表名。注意order在数据库中是关键字,不能作为表名

  • id节点:class节点下,必须有一个id节点,用于定义实体的标识属性(对应数据库表中的主键),id节点的name属性对应实体类的属性,column对应数据库表中的列,generator用于指定主键的生成策略。

    • 自然主键:把具有业务含义的字段作为主键。
    • 代理主键:不具备业务含义的字段作为主键。
    • increment:自动增长,用于long,short或int类型。使用hibernate框架提供的自动增长方式(select max(id) from 表,在最大值的基础上+1)。会有多线程问题,在集群下不要使用。
    • identity:自动增长,用于long,short或int类型。采用数据库的增长机制。不适合Oracle数据库,因为Oracle里边没有自动增长。
    • sequence:用于long,short或int类型,根据底层数据库序列生成标识符,应用在Oracle。
    • uuid:生成一个长度为32位的十六进制的字符串。
    • native:根据底层数据库不同,自动选择使用identity还是sequence。
    • assigned:hibernate框架不维护主键,由程序手动设置id
    • foreign:主键是外来的,应用在多表的一对一的关系。
  • property节点用于映射普通节点。type属性用来指定属性的类型,也可以不写,会自动完成转换。type有三种写法(Java类型:java.lang.String;Hibernate类型:string;SQL类型:不能直接使用type属性,需要子标签column,<column name="name" sql-type="varchar(20)"/>)。unique属性,是否对映射列产生一个唯一性约束。如果name属性和column属性的值相同,可以省略column。

    hibernate-1

6.编写核心配置文件

Hibernate的映射文件反映了持久化类和数据库表的映射关系,而Hibernate的配置文件则主要用来配置数据连接以及Hibernate运行时所需要的各个属性的值。在src下创建一个名称为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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>      <property name="hibernate.connection.url">jdbc:mysql:///day06</property>      <property name="hibernate.connection.username">root</property>      <property name="hibernate.connection.password">123</property>      <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>      <property name="hibernate.show_sql">true</property>      <property name="hibernate.format_sql">true</property>      <property name="hibernate.connection.autocommit">false</property>      <property name="hibernate.hbm2ddl.auto">update</property>      <!-- C3P0连接池设定 -->    <!-- 使用c3po连接池 配置连接池提供的供应商 -->    <property name="connection.provider_class">        org.hibernate.connection.C3P0ConnectionProvider    </property>    <!--在连接池中可用的数据库连接的最少数目 -->    <property name="c3p0.min_size">5</property>    <!--在连接池中所有数据库连接的最大数目 -->    <property name="c3p0.max_size">20</property>    <!--设定数据库连接的过期时间,以秒为单位, 如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->    <property name="c3p0.timeout">120</property>    <!--每3000秒检查所有连接池中的空闲连接 以秒为单位 -->    <property name="c3p0.idle_test_period">3000</property>    <mapping resource="cn/itcast/hibernate3/demo1/Customer.hbm.xml" />  </session-factory></hibernate-configuration>

dtd约束在hibernate3.jar/org.hibernate/hibernate-configuration-3.0.dtd中

必须要配置的属性:数据库驱动,连接数据库的url,数据库的用户名,数据库的密码,指定方言(要把hql编译成哪种sql语句)property元素name属性的名称可以在hibernate-distribution-3.6.10.Final-dist\hibernate-distribution-3.6.10.Final\project\etc在这个路径下的hibernate.properties文件中可以看到连接各种库怎么写的。

可选配置:显示SQL语句(在控制台显示hql转换成的SQL语句),格式化SQL语句(如果不写这句话,SQL语句都会在在一行),事务是否自动提交(为false的话,增删改不会自动提交,要手动设置事务提交。默认的配置也是false),设置只要有实体类和映射文件就可以自动把表创建好(当SessionFactory创建时是否根据映射文件自动验证表结构或自动创建、自动更新数据库表结构)。该参数的取值为validate,update,create和create-drop。

还要通知Hibernate加载那些映射文件。添加这句话的简单方式,hibernate.cfg.xml,右键,Open with,MyEclipse Hibernate Config Editor,打开之后,把Customer.hbm.xml拖到Mappings菜单那部分,文件中就会自动加上这句话了。

Hibernate对从c3p0连接池提供了内嵌支持,可以在Hibernate中直接配置和使用c3p0.

导入存c3p0的jar包,可以在optional文件夹中找到(c3p0-0.9.1.jar),然后在配置文件中添加配置信息。

6.编写测试类

package cn.itcast.hibernate3.demo1;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.junit.Test;public class CustomerTest {    @Test    public void insertTest(){        //1.加载hibernate.cfg.xml配置文件        Configuration config=new Configuration().configure();        //2.获取SessionFactory        SessionFactory sessionFactory=config.buildSessionFactory();        //3.得到一个Session        Session session=sessionFactory.openSession();        //4.开启事务        Transaction t=session.beginTransaction();        Customer c=new Customer();        c.setName("王五");        c.setAge(10);        c.setCity("北京");        c.setSex("男");        //6.将数据存储到表中        session.save(c);        //7.提交事务        t.commit();        //8.关闭资源        session.close();        sessionFactory.close();    }}

7.流程分析
这里写图片描述