<p class="l">转自<a style="font-size: 14px;" href="http://blog.csdn.net/jiuqiyuliang/article/details/39078749">【SSH进阶之路】Hibernate基本原理(一)
ORM(Object Relation Mapping,对象关系映射)的作用是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。这样,我们在操作数据库的时候,不需要再去和复杂SQL打交道,只要像操作对象一样操作它就可以了(把关系数据库的字段在内存中映射成对象的属性)。
Hibernate是一个开放源代码的ORM框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
? ? ?从上图中,我们可以看出Hibernate六大核心接口,两个主要配置文件,以及他们直接的关系。Hibernate的所有内容都在这了。那我们从上到下简单的认识一下,每个接口进行一句话总结。
<h2 class="l">《<a href="http://www.imooc.com/learn/396" target="_blank">Hibernate初探之单表映射》
<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Students {
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> sid;
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String sname;
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String gender;
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> Date birthday;
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String address;
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Students() {
}
</span><span style="color: #0000ff;">public</span> Students(<span style="color: #0000ff;">int</span><span style="color: #000000;"> sid,String sname,String gender,Date birthday,String address) {
</span><span style="color: #0000ff;">super</span><span style="color: #000000;">();
</span><span style="color: #0000ff;">this</span>.sid =<span style="color: #000000;"> sid;
</span><span style="color: #0000ff;">this</span>.sname =<span style="color: #000000;"> sname;
</span><span style="color: #0000ff;">this</span>.gender =<span style="color: #000000;"> gender;
</span><span style="color: #0000ff;">this</span>.birthday =<span style="color: #000000;"> birthday;
</span><span style="color: #0000ff;">this</span>.address =<span style="color: #000000;"> address;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> getSid() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> sid;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> setSid(<span style="color: #0000ff;">int</span><span style="color: #000000;"> sid) {
</span><span style="color: #0000ff;">this</span>.sid =<span style="color: #000000;"> sid;
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getSname() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> sname;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setSname(String sname) {
</span><span style="color: #0000ff;">this</span>.sname =<span style="color: #000000;"> sname;
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getGender() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> gender;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setGender(String gender) {
</span><span style="color: #0000ff;">this</span>.gender =<span style="color: #000000;"> gender;
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Date getBirthday() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> birthday;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setBirthday(Date birthday) {
</span><span style="color: #0000ff;">this</span>.birthday =<span style="color: #000000;"> birthday;
}
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getAddress() {
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> address;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setAddress(String address) {
</span><span style="color: #0000ff;">this</span>.address =<span style="color: #000000;"> address;
}
@Override
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String toString() {
</span><span style="color: #0000ff;">return</span> "Students [sid=" + sid + ",sname=" + sname + ",gender=" + gender + ",birthday=" +<span style="color: #000000;"> birthday
</span>+ ",address=" + address + "]"<span style="color: #000000;">;
}
}
创建对象-关系映射配置文件,后缀是.hbm.xml
使用 junit 测试:
@Test 测试注释标签 测试方法
@Before 初始化方法 执行测试方法之前会执行这个方法
@After 释放资源 ?执行测试方法之后会执行这个方法
<span style="color: #0000ff;">import<span style="color: #000000;"> org.hibernate.Session;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.hibernate.SessionFactory;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.hibernate.Transaction;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.hibernate.cfg.Configuration;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.hibernate.jdbc.Work;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.hibernate.service.ServiceRegistry;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.hibernate.service.ServiceRegistryBuilder;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.junit.After;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.junit.Before;
<span style="color: #0000ff;">import<span style="color: #000000;"> org.junit.Test;
<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> StudentsTest {
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> SessionFactory sessionFactory;
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> Session session;
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> Transaction transaction;
@Before
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> init() {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 创建配置对象</span>
Configuration config = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Configuration().configure();
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 创建服务注册对象</span>
ServiceRegistry serviceRegistry = <span style="color: #0000ff;">new</span><span style="color: #000000;"> ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 创建会话工厂对象</span>
sessionFactory =<span style="color: #000000;"> config.buildSessionFactory(serviceRegistry);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 创建会话对象</span>
session =<span style="color: #000000;"> sessionFactory.openSession();
</span><span style="color: #008000;">//</span><span style="color: #008000;"> session = sessionFactory.getCurrentSession();
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 开启事务</span>
transaction =<span style="color: #000000;"> session.beginTransaction();
}
@After
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> destroy() {
transaction.commit(); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 提交事务</span>
session.close(); <span style="color: #008000;">//</span><span style="color: #008000;"> 关闭会话</span>
sessionFactory.close(); <span style="color: #008000;">//</span><span style="color: #008000;"> 关闭会话工厂</span>
<span style="color: #000000;"> }
@Test
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> testSaveStudents() {
Students s = <span style="color: #0000ff;">new Students(1,"段文弱","男",<span style="color: #0000ff;">new Date(),"天朝"<span style="color: #000000;">);
session.save(s);
}
}
Hibernate执行流程

session是一个操纵数据库对象,session与connection是多对一的关系。
session默认事务不是自动提交。需要Transaction提交。transaction.commit();
可以通过设置doWork()变成自动提交(不推荐)
session.doWork( execute(Connection connection)
获得session:
1.openSession ? 每次都获得一个新的session,需要手动关闭
2.getCurrentSession 使用现有的session对象,需要在hibernate.cfg.xml中配置
??
在事务提交或者回滚之后会自动关闭,(所以啊……不需要关闭……会有错误!错了好多次才反应过来!
基本数据类型:

时间类型:

对象类型

1.clob和text对应大文本文件,blob对应大的二进制文件,例如视频音频图片
2.java中的clob对应存储大文本文件,java中的blob对应存储大二进制文件
MySQL不支持标准SQL的CLOB类型,在Mysql中,用TEXT,MEDIUMTEXT及LONGTEXT类型来表示长度超过255的长文本数据
testWriteBlob() = Students(100,"天朝"= File("E:"+File.separator+"图片"+File.separator+"bobo.jpg"
InputStream input =
Blob image =
@Test
<span style="color: #0000ff;">public <span style="color: #0000ff;">void testReadBlob() <span style="color: #0000ff;">throws<span style="color: #000000;"> Exception {
Students s = (Students)session.get(Students.<span style="color: #0000ff;">class,1<span style="color: #000000;">);
Blob image =<span style="color: #000000;"> s.getPicture();
InputStream input =<span style="color: #000000;"> image.getBinaryStream();
File file = <span style="color: #0000ff;">new File("E:"+File.separator+"bobo.jpg"<span style="color: #000000;">);
OutputStream output = <span style="color: #0000ff;">new<span style="color: #000000;"> FileOutputStream(file);
<span style="color: #008000;">//<span style="color: #008000;"> 创建缓冲区
<span style="color: #0000ff;">byte[] buffer = <span style="color: #0000ff;">new <span style="color: #0000ff;">byte<span style="color: #000000;">[input.available()];
<span style="color: #008000;">//<span style="color: #008000;">System.out.println(input.available());
<span style="color: #000000;"> input.read(buffer);
output.write(buffer);
input.close();
output.close();
}
组件属性:某个属性是用户自定义的对象
会在数据库中将自定义类中的属性也当做一个字段。
增删改查:
Students s =
<span style="color: #008000;">//<span style="color: #008000;">增加数据
<span style="color: #000000;">session.save(s);
<span style="color: #008000;">//<span style="color: #008000;"> 获取 Object get/load(Class,主键)
Students s = (Students)session.get(Students.<span style="color: #0000ff;">class,1<span style="color: #000000;">);
Students s = (Students)session.load(Students.<span style="color: #0000ff;">class,1<span style="color: #000000;">);
<span style="color: #008000;">//<span style="color: #008000;"> 修改
<span style="color: #000000;">session.update(s);
<span style="color: #008000;">//<span style="color: #008000;"> 删除
session.delete(s);
get load区别:
1.get调用后立即发出sql语句,并返回对象。load调用后返回代理对象,保存了实体对象id,直到使用了对象的非主键属性时才发出sql语句
2.当查询到数据为空时,get返回null,load返回objectNotFound异常
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!