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.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c\:mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.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。
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.流程分析