一.Hibernate介绍
以前学习过Struts2,对于Hibernate和Spring只有初步的认识,现在工作中处处都是SSH,所以要偷空把这两样要好好研究下,争取早日达到高薪。 嘿嘿……
JPA:定义了一系列的接口,用来实现各种O/R Mapping Framewords,仅仅只定义了一个标准
而hibernate就是JPA的一个具体实现,同样的实现还有toplink、jdo等等
二.Hibernate基础配置
一.hibernate.cfg.xml配置
1.<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
用于定义数据库方言,hibernate根据这个配置,自动生成对应数据库的SQL语句
具体的各种方言,可以查阅文档
2.<property name="hbm2ddl.auto">create</property>
指的是当xml或者Annotation映射的表不存在时,将自动创建
可选值还有update,update-drop,都不常用,一般只用create,其实也很少用,
因为在真正的工作中,都是先建表再建类。
3.<property name="show_sql">true</property>
在执行的过程中打印出hibernate自动生成的SQL语句
<property name="format_sql">true</property>
进一步将生成的SQL语句格式化
4.<property name="current_session_context_class">tread</property>
主要是用于Session.getCurrentSession();方法
二.XML与Annotation映射数据库表和字段
一.XML(不常用,企业遗留的项目可能会用)
在对应的Java类目录下创建classname.hbm.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">
<hibernate-mapping package="com.sean.hibernate.model">
<class name="Student" table="student"> // table默认与classname一致,可以不写
<id name="id" column="id"></id> //映射主键
<property name="name" column="name"></property> //column默认的值与类中的属性名一致,可以不写
<property name="profession" column="profession"></property>
</class>
</hibernate-mapping>
然后再hibernate.cfg.xml配置文件添加如下代码
<mapping resource="classname.hbm.xml的具体文件路径如:com/sean/hibernate/model/Student.hbm.xml"/>
测试函数:
Student student = new Student();
student.setId(1);
student.setName("Sean");
student.setProfession("Computer");
Configuration cfg = new Configuration();
SessionFactory sf = cfg.configure().buildSessionFactory();
Session session = sf.openSession();
session.beginTransaction();
session.save(student);
session.getTransaction().commit();
session.close();
sf.close();
二.Annotation(最常用,Hibernate3.0以上新特性)
在Java类上注解@Entity 在javax.persistance.Entity;包里
在Java主键属性上注解@Id 一般在属性的get方法上注解
然后再hibernate.cfg.xml配置文件里添加
<mapping class="类的具体路径如:com.seam.hibernate.model,Student"/>
例子:
@Entity
@Table(name="表名")默认与Java类同名,如Teacher
public class Teacher
{
private int id;
private String name;
private String addr;
@Id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@column(name="数据库字段名")默认和属性名一致,如name
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Transient不和数据库表字段做映射,而在XML中,只要不在classname.hbm.xml中配置就可以不映射
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
测试函数:
Teacher teacher = new Teacher();
teacher.setId(1);
teacher.setName("sean");
Configuration cfg = new AnnotationConfiguration();//此处与XML不同
SessionFactory sf = cfg.configure().buildSessionFactory();
Session session = sf.openSession();
session.beginTransaction();
session.save(teacher);
session.getTransaction().commit();
session.close();
sf.close();
三.ID生成策略
1.自动增长
1.XML
在classname.hbm.xml配置主键的时候
<id name="id" column="id">
<generator class="native"></generator>
class常用选值有native(自动判断,用于跨数据库平台),identity(SQL Server),sequence(Orcale)
</id>
2.Annotation
在主键属性上注解@GeneratedValue
四.核心开发接口
1.Configuration
AnnotationConfiguration用于Annotation
进行配置信息的管理,也就是用来访问hibernate.cif.xml
用来产生SessionFactory
可以在configure方法中指定hibernate配置文件,默认访问src目录下的hibernate.cfg.xml
可以通过重载方法configure("配置文件路径");访问其他配置文件
生成SessionFactory只需要关注一个方法:buildSessionFactory();
2.Session
用户和数据库交互
可以通过
SessionFactory sessionFactory = Configuration.configure().buildSessionFactory();
Session session = sessionFactory.openSession();
每次都打开新的Session
commit()后每次都需要close();
Session session = sessionFactory.getCurrentSession();
默认为当前线程中的Session,如果当前线程不存在,则创建新的实例
commit()后自动close();
用途:界定事务边界
再hibernate.cfg.xml中的设置,tread最常用,还有Jta(Java Transaction api)用于分布式数据库
<property name="current_session_context_class">tread</property>
3.对象的三种状态
Session缓存:简单理解为session里保存一个Java对象实例的引用即可,为了提高访问效率。
Transient:对象没有ID,再数据库里没有,是刚new出来的对象,Session缓存里也没有,只有内存有
Persistant:对想有ID,数据库有,缓存里面有,内存里也有
Detached:内存有,缓存没有,数据库有。(Session关闭,对象实例的引用消失,所以叫分离态)
4.session.save(Object object);略
5.session.delete(Object object);
只要object的Id属性有值,并且在数据库有对应的数据,即可删除
6.session.load(class arg0,Serializable arg1)
例子 Teacher teacher = (Teacher)session.load( Teacher.class,1);
session.get(class arg0,Serializable arg1)
例子 Teacher teacher = (Teacher)session.load( Teacher.class,1);
load和get的区别
load返回的是代理对象,等到真正用到对象内容的时候,才发出SQL语句,从数据库读取数据
get直接发出SQL语句,直接读取数据
7.session.update(Object object);
只要object的Id有值,并且在数据库里有对应的ID记录,就可以更新,但是更新全部字段!!!
更新部分字段
XML:
在classname.hbm.xml里<class name="com.sean.hibernate.Student" dynamic-update="true">
既可以更新对象更新的部分字段
HQL语句:(常用)
Student s = new Student(1,"Sean","boy");
Query q = session.createQuery("update Student s set s.name='Sean2' where s.Id=1");
q.executeUpdate();
8.session.clear();
用于清除session缓存
9.session.flush();
强制将session缓存与数据库做同步,简单理解就是将session缓存保存到数据库
以上是简单的Hibernate应用。随着工作时间的加长,相信会对其有更深刻的了解。