一:hibernate框架开发准备
1.简介
Hibernate是一个对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关 系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得可以以操作对象的方式来操作数据库。
2.资源下载
在 hibernate.org官网中 的 hibernate ORM开源项目进行下载
3.jar包添加
解压下载的包,然后将斌目录下的required文件夹中的所有包添加进来(注意:hibernate与其他框架综合使用时应注意jar包冲突问题),jar包如下
//以下jar包均为写版本号
antl.jar
classmate.jar
dom4j.jar
hibernate-commons-annotations-.Final.jar
hibernate_core_Final.jar
hibernate-jpa-api.Fina.jar
jandex-Final.jar
javassist-GA.jar(该包struts中也有)
jboss-logging.Final.jar
jboss-transaction-api_spec_Final.jar
4.添加核心配置文件
在根目录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">驱动串</property>
<property name="hibernate.connection.password">用户密码</property>
<property name="hibernate.connection.url">url</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">数据库方言设置</property>
<property name="hibernate.show_sql">是否显示sql语句</property>
<property name="hibernate.format_sql">是否对sql语句进行格式化显示</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="映射元文件"/>
</session-factory>
</hibernate-configuration>
<!--hibernate.hbm2ddl.auto 该属性可设置四个值
1.create
每次加载hibernate都会删除之前对应的表,然后根据model类进行重新生成新表
2.create drop
每次加载hibernate都会根据model新建对应的表.但是sessionFactory关闭,表会自动删除
3.update
第一次加载hibernate时,在已创建对应数据库的情况下会创建对应的表,以后每次加载会根据model的改变自动修改表结构,只会增不会删
4.validate
每次加载会根据model和数据库表相对应,如果不一样,则报出异常
-->
二:开发步骤
1.定义实体类和添加映射元文件
定义实体类
public class User_Bean {
private int id;
private String username;
private String password;
private Date birth;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
}
方式一.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-4-10 10:49:54 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="对应的JavaBean类" table="数据库对应表名">
<id name="id" type="int">
<column name="ID" />声明主键
<generator class="assigned" />主键生成策略
</id>
<property name="username" type="java.lang.String">映射对应的数据库字段
<column name="USERNAME" />
</property>
<property name="password" type="java.lang.String">
<column name="PASSWORD" />
</property>
<property name="birth" type="java.util.Date">date类型一定要指出数据类型,其不能自动识别,因为存在数据精度问题
<column name="BIRTH" />
</property>
</class>
</hibernate-mapping>
//注意事项
映射应写为 <mapping resource="包名/类名"/>
方式二.注解
public class User implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@Column(name="username",length=20,nullable=false,unique=true)
private String username;
@Column(name="password",length=20)
private String password;
@Temporal(TemporalType.DATE)
@Column(columnDefinition="timestamp default current_timestamp")
private Date birth;
//注意时项:映射应写为<mapping class="包名.类名">
主键生成策略
1.increment:由Hibernate以递增的方式为代理主键赋值。Hibernate在初始化阶段读取表中最大主键值,
然后再最大值的基础上递增,增量为1。
2.identity:由底层DB来负责生成,要求底层DB把主键定义为自增类型,例如在SQL Server中,应该把主键
定义为identity类型,MySQL中,定义为auto_increment类型。数据库底层必须支持自增长类型,oracle不支
持,故不能使用(id必须为int long short 定义为byte会抛出异常)
3.sequence利用底层DB提供的序列生成。例如在Oracle中可以使用序列对象生成连续增长值(要求底层数据库必须支持序列oracle,db2支持 mysql sqlserver不支持 )
4.hilo高低位算法:由Hibernate按照一种high/low算法来生成标识符,Hibernate从DB的特定表的字段
中获取high值,hibernate自行维护了一个连续值充当低位值。
5.native:依据底层数据库自动生成标识符的能力,来选择使用identity、sequence标识符生成器。它能自动判断底层DB提供的生成标识符的机制。
6.assign表示由编程提供对应的id值,如果不定义生成器,则默认。一般用于自然主键
7.uuid表示通过全局唯一性算法提供一个全局唯一的必须是32位的16进制的字符串,一般用于分布式数据库,可以在网络范围类保证id唯一
2:编程调用
调用hibernate API
StandardServiceRegistry srr = new StandardServiceRegistryBuilder().configure().build();
SessionFactory factory = new MetadataSources(srr).buildMetadata().buildSessionFactory();
Session session = factory.openSession();
//使用session对象进行对数据的操作
Transaction tx = session.beginTransaction();//开启事务
tx.commit();//事务提交
增
session.persist(obj);//hibernate提供了JPA支持后新增的方法
session.save(obj);//hibernate的方法
删
session.remove(obj);//hibernate提供了JPA支持后的方法
session.delete(obj);//hibernate本身的方法
改
一般先通过id进行对象的获取有两个方法load()和get()方法
load()方法
在加载的时候,首先会在缓存中查找给对象,如果有立即返回,如果没有则返回一个代理对象并且不执行sql语句,当查询非键属性是才会执行,要求查询时session对象不能关闭,否则会报出异常
get()方法
在加载的时候,首先会在缓存中进行对象的查找,如果有该对象,立即返回,如果没有,立即执行查询操作返回对象
load()方法查询不存在的键值时会报出异常,而get()方法会返回一个null值
session.merge(obj);//session提供了JPA支持后的方法
session.update(obj);//session本身的方法