加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Hibernate学习笔记

发布时间:2020-12-14 06:32:54 所属栏目:Java 来源:网络整理
导读:p class="l"转自a style="font-size: 14px;" href="http://blog.csdn.net/jiuqiyuliang/article/details/39078749"gt;【SSH进阶之路】Hibernate基本原理(一) Hibernate就是对数据库进行封装,使得程序员可以直接操作对象而不用写具体的数据库操作。 ORM(O

<p class="l">转自<a style="font-size: 14px;" href="http://blog.csdn.net/jiuqiyuliang/article/details/39078749"&gt;【SSH进阶之路】Hibernate基本原理(一)

Hibernate就是对数据库进行封装,使得程序员可以直接操作对象而不用写具体的数据库操作。

ORM(Object Relation Mapping,对象关系映射)的作用是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。这样,我们在操作数据库的时候,不需要再去和复杂SQL打交道,只要像操作对象一样操作它就可以了(把关系数据库的字段在内存中映射成对象的属性)。

Hibernate是一个开放源代码的ORM框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

Hibernate的核心:

? ? ?从上图中,我们可以看出Hibernate六大核心接口,两个主要配置文件,以及他们直接的关系。Hibernate的所有内容都在这了。那我们从上到下简单的认识一下,每个接口进行一句话总结。

1、Configuration接口:负责配置并启动Hibernate

2、SessionFactory接口:负责初始化Hibernate

3、Session接口:负责持久化对象的CRUD操作

4、Transaction接口:负责事务

5、Query接口和Criteria接口:负责执行各种数据库查询

注意:Configuration实例是一个启动期间的对象,一旦SessionFactory创建完成它就被丢弃了。

<h2 class="l">《<a href="http://www.imooc.com/learn/396" target="_blank">Hibernate初探之单表映射》

首先建一个hibernate.cfg.xml文件

com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/hibernate?useUnicode=truecharacterEncoding=UTF-8 jdbc:mysql:///hibernate?useUnicode=truecharacterEncoding=UTF-8 root 123456 org.hibernate.dialect.MySQLDialect
    <span style="color: #008000;"&gt;<!--</span><span style="color: #008000;"&gt; sql语句输出到控制台 </span><span style="color: #008000;"&gt;--></span>
    <span style="color: #0000ff;"&gt;<</span><span style="color: #800000;"&gt;property </span><span style="color: #ff0000;"&gt;name</span><span style="color: #0000ff;"&gt;="show_sql"</span><span style="color: #0000ff;"&gt;></span>true<span style="color: #0000ff;"&gt;</</span><span style="color: #800000;"&gt;property</span><span style="color: #0000ff;"&gt;></span>
    <span style="color: #008000;"&gt;<!--</span><span style="color: #008000;"&gt; 输出到控制台的sql语句进行排版 </span><span style="color: #008000;"&gt;--></span>
    <span style="color: #0000ff;"&gt;<</span><span style="color: #800000;"&gt;property </span><span style="color: #ff0000;"&gt;name</span><span style="color: #0000ff;"&gt;="format_sql"</span><span style="color: #0000ff;"&gt;></span>true<span style="color: #0000ff;"&gt;</</span><span style="color: #800000;"&gt;property</span><span style="color: #0000ff;"&gt;></span>
    <span style="color: #008000;"&gt;<!--</span><span style="color: #008000;"&gt; create:删除以前的创建新的  update:原有的基础上更新   </span><span style="color: #008000;"&gt;--></span>
    <span style="color: #0000ff;"&gt;<</span><span style="color: #800000;"&gt;property </span><span style="color: #ff0000;"&gt;name</span><span style="color: #0000ff;"&gt;="hbm2ddl.auto"</span><span style="color: #0000ff;"&gt;></span>create<span style="color: #0000ff;"&gt;</</span><span style="color: #800000;"&gt;property</span><span style="color: #0000ff;"&gt;></span>
    <span style="color: #008000;"&gt;<!--</span><span style="color: #008000;"&gt; 映射文件 </span><span style="color: #008000;"&gt;--></span>
    <span style="color: #0000ff;"&gt;<</span><span style="color: #800000;"&gt;mapping </span><span style="color: #ff0000;"&gt;resource</span><span style="color: #0000ff;"&gt;="Students.hbm.xml"</span><span style="color: #0000ff;"&gt;/></span>
<span style="color: #0000ff;"&gt;</</span><span style="color: #800000;"&gt;session-factory</span><span style="color: #0000ff;"&gt;></span>

<span style="color: #0000ff;"></<span style="color: #800000;">hibernate-configuration<span style="color: #0000ff;">>

写一个学生类 ?

实体类和数据库中的表相对应

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Students {

</span><span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; sid;
</span><span style="color: #0000ff;"&gt;private</span><span style="color: #000000;"&gt; String sname;
</span><span style="color: #0000ff;"&gt;private</span><span style="color: #000000;"&gt; String gender;
</span><span style="color: #0000ff;"&gt;private</span><span style="color: #000000;"&gt; Date birthday;
</span><span style="color: #0000ff;"&gt;private</span><span style="color: #000000;"&gt; String address;

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; Students() {

}

</span><span style="color: #0000ff;"&gt;public</span> Students(<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; sid,String sname,String gender,Date birthday,String address) {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;();
    </span><span style="color: #0000ff;"&gt;this</span>.sid =<span style="color: #000000;"&gt; sid;
    </span><span style="color: #0000ff;"&gt;this</span>.sname =<span style="color: #000000;"&gt; sname;
    </span><span style="color: #0000ff;"&gt;this</span>.gender =<span style="color: #000000;"&gt; gender;
    </span><span style="color: #0000ff;"&gt;this</span>.birthday =<span style="color: #000000;"&gt; birthday;
    </span><span style="color: #0000ff;"&gt;this</span>.address =<span style="color: #000000;"&gt; address;
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; getSid() {
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; sid;
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span> setSid(<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; sid) {
    </span><span style="color: #0000ff;"&gt;this</span>.sid =<span style="color: #000000;"&gt; sid;
}

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; String getSname() {
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; sname;
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; setSname(String sname) {
    </span><span style="color: #0000ff;"&gt;this</span>.sname =<span style="color: #000000;"&gt; sname;
}

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; String getGender() {
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; gender;
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; setGender(String gender) {
    </span><span style="color: #0000ff;"&gt;this</span>.gender =<span style="color: #000000;"&gt; gender;
}

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; Date getBirthday() {
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; birthday;
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; setBirthday(Date birthday) {
    </span><span style="color: #0000ff;"&gt;this</span>.birthday =<span style="color: #000000;"&gt; birthday;
}

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; String getAddress() {
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; address;
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; setAddress(String address) {
    </span><span style="color: #0000ff;"&gt;this</span>.address =<span style="color: #000000;"&gt; address;
}

@Override
</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; String toString() {
    </span><span style="color: #0000ff;"&gt;return</span> "Students [sid=" + sid + ",sname=" + sname + ",gender=" + gender + ",birthday=" +<span style="color: #000000;"&gt; birthday
            </span>+ ",address=" + address + "]"<span style="color: #000000;"&gt;;
}

}

创建对象-关系映射配置文件,后缀是.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;"&gt;private</span><span style="color: #000000;"&gt; SessionFactory sessionFactory;
</span><span style="color: #0000ff;"&gt;private</span><span style="color: #000000;"&gt; Session session;
</span><span style="color: #0000ff;"&gt;private</span><span style="color: #000000;"&gt; Transaction transaction;

@Before
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; init() {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 创建配置对象</span>
    Configuration config = <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; Configuration().configure();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 创建服务注册对象</span>
    ServiceRegistry serviceRegistry = <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 创建会话工厂对象</span>
    sessionFactory =<span style="color: #000000;"&gt; config.buildSessionFactory(serviceRegistry);
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 创建会话对象</span>
    session =<span style="color: #000000;"&gt; sessionFactory.openSession();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; session = sessionFactory.getCurrentSession();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 开启事务</span>
    transaction =<span style="color: #000000;"&gt; session.beginTransaction();
}
@After
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; destroy() {
    transaction.commit();    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 提交事务</span>
    session.close();        <span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 关闭会话</span>
    sessionFactory.close();    <span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 关闭会话工厂</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异常

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读