Hibernate5--课程笔记1

Hibernate简介:

  Hibernate是一个开放源代码的ORM(对象关系映射)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。 
                                                 ----  百度百科《Hibernate》

  实现持久化的方法:

    (1)对象的序列化

      即实现了Serializable接口的类。适合于少量的对象进行暂时的持久化,适合于在网络上传输对象。但不符合企业级应用的需要。因为企业应用中对数据的要求是大量的、长时间保存的、需要进行大规模查询。

    (2)JDBC

      优点:功能完备、从理论上说效率是最高的;可以存储海量的数据并且适合进行大规模检索

      缺点:开发效率和维护效率低;开发难度大,代码量大,占到到总代码量的1/3,或1/2

    (3)ORM

      ORM,即Object-Relational Mapping,对象关系映射。它是一种解决问题的思路,是一种思想。它的实质就是将关系数据库中的业务数据用对象的形式表示出来,并通过面向对象的方式将这些对象组织起来,以实现系统业务逻辑。或者说,ORM就是内存中的对象与数据库中的数据间的映射关系。

              

      ORM的特点:开源的,实现了JDBC的封装, 实现了简单的API,轻量级解决方案,持久化对象是一个POJO类。最有名的ORM框架就是Hibernate。

  JPA框架:

    JPA,Java Persistence API,是Java EE 5的标准ORM接口。它是一种规范,一套接口,但不是实现。用于实现这一规范的ORM很多,其中Hibernate就是之一。

  JPA、ORM、Hibernare之间的关系:

    ORM是一种思想。JPA则是这种思想的具体的表现形式,是以Java语法规范表现出来的一种形式,是一套标准接口。Hibernate则是这套接口的具体实现。

  Hibernate5基本jar包:略

Hibernate第一个程序:

  1. Hibernate工作原理:

    

    其中hibernate.cfg.xml文件名不能更改,*.hbm.xml中的*,最好用对应的类名替代。

  2. 搭建Hibernate程序过程:

    (1) 定义持久化对象:

 1 package com.tongji.beans;
 2
 3 public class Student {
 4     private Integer id; //定义实体的id要用Integer不能用int,因为底层要判断id == null
 5     private String name;
 6     private int age;
 7     private double score;
 8
 9     public Student() {
10         super();
11     }
12
13     public Student(String name, int age, double score) {
14         super();
15         this.name = name;
16         this.age = age;
17         this.score = score;
18     }
19
20     public Integer getId() {
21         return id;
22     }
23
24     public void setId(Integer id) {
25         this.id = id;
26     }
27
28     public String getName() {
29         return name;
30     }
31
32     public void setName(String name) {
33         this.name = name;
34     }
35
36     public int getAge() {
37         return age;
38     }
39
40     public void setAge(int age) {
41         this.age = age;
42     }
43
44     public double getScore() {
45         return score;
46     }
47
48     public void setScore(double score) {
49         this.score = score;
50     }
51
52     @Override
53     public String toString() {
54         return "Student [id=" + id + ", name=" + name + ", age=" + age + ", score=" + score + "]";
55     }
56
57 }

    (2)配置映射文件(*.hbm.xml):

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5
 6 <hibernate-mapping>
 7     <!-- 类到表的映射,属性到字段的映射 -->
 8     <class name="com.tongji.beans.Student" table="t_student">
 9         <id name="id" column="tid">
10             <generator class="native"/>
11         </id>
12         <property name="name" column="tname"/>
13         <property name="age" column="tage"/>
14         <property name="score" column="tscore"/>
15     </class>
16 </hibernate-mapping>

     其中,约束是在/org/hibernate/hibernate-mapping-3.0.dtd中查找,name是类名和类中的属性名,column是表名和对应的字段名,generator后面再介绍。

   (3) 配置住配置文件(hibernate.cfg.xml):

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 5
 6 <hibernate-configuration>
 7     <session-factory>
 8         <!-- DB连接四要素 -->
 9         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
10         <property name="hibernate.connection.url">jdbc:mysql:///mytest?useSSL=false</property>
11         <property name="hibernate.connection.username">root</property>
12         <property name="hibernate.connection.password">248xiaohai</property>
13         <!-- 方言 -->
14         <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
15         <!-- C3P0数据源 -->
16         <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
17         <!-- 当前Session上下文 -->
18         <property name="hibernate.current_session_context_class">thread</property>
19         <!-- 自动建表 -->
20         <property name="hibernate.hbm2ddl.auto">update</property>
21         <!-- 显示SQL -->
22         <property name="hibernate.show_sql">true</property>
23         <!-- 格式化SQL -->
24         <property name="hibernate.format_sql">true</property>
25
26         <!-- 注册映射文件 -->
27         <mapping resource="com/tongji/beans/Student.hbm.xml"/>
28     </session-factory>
29 </hibernate-configuration>

    约束是在/org/hibernate/hibernate-configuration-3.0.dtd种查找的;

    DB连接四要素,同JDBC要求(数据库连接的基本要求);

    方言,每个数据库管理系统都有自己的方言,每个数据库管理系统的不同版本也有自己的方言,选项在org.hibernate.dialect中查找;

    C3P0数据源,数据源是指数据库连接池,由于进行数据库连接比较耗时,系统就建立了一个数据路连接池,其中存放了一定数量的数据库连接,方便需要操作数据库时,直接从这个池中拿取数据库连接。C3P0是其中的一种数据源;

    当前Session上下文,指定缓存存放的位置,指定thread,表示将session放在每个线程中;

    自动建表,有三个选项:create(每次执行都重新创建表)、update(第一次执行创建表,之后的每次执行都是更新表)、create-drop;

    注册映射文件,前面配置的映射文件要在主配置文件中注册;

    显示SQL、格式化SQL,主要为了调试,在执行Hibernate程序时,显示底层自动生成的sql语句。

  (4) 定义测试类:

 1 package com.tongji.test;
 2
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.cfg.Configuration;
 6 import org.junit.Test;
 7
 8 import com.tongji.beans.Student;
 9
10 public class MyTest {
11     @Test
12     public void testSave() {
13         //1. 加载主配置文件
14         Configuration configure = new Configuration().configure();
15         //2. 创建Session工厂
16         SessionFactory SessionFactory = configure.buildSessionFactory();
17         //3. 获取Session
18         Session session = SessionFactory.getCurrentSession();
19         try {
20             //4. 开启事务
21             session.beginTransaction();
22             //session.getTransaction().begin();  同样
23             //5. 操作
24             Student student = new Student("张三", 23, 93.5);
25             session.save(student);
26             //6. 事务提交
27             session.getTransaction().commit();
28         } catch (Exception e) {
29             e.printStackTrace();
30             //7. 事务回滚
31             session.getTransaction().rollback();
32         }
33     }
34 }

    注意:session必须在事务之内操作,因为session是操作缓存中的数据,只有提交了事务之后,缓存中的数据才能写到数据库中。

时间: 2024-10-14 05:15:54

Hibernate5--课程笔记1的相关文章

《nodejs+gulp+webpack基础实战篇》课程笔记(四)-- 实战演练

一.用gulp 构建前端页面(1)---静态构建 npm install gulp-template --save-dev 通过这个插件,我们可以像写后台模板(譬如PHP)一样写前端页面.我们首先学习一下写法. 现在我们创建一个新任务:创建一个裸的index.html文件,然后在body里面写上 ,我的年龄是:<%= age %> 下载好gulp-template,我们引用并配置 var gulp_tpl = require("gulp-template"); gp.tas

Linux操作系统及应用课程笔记 索引

第0部分  软件的安装与配置 Linux下软件的安装与配置 第1部分*   绪论 第2部分*  Linux的安装过程 第3部分   系统Shell和常用命令 Shell文件相关常用命令及参数总结 Linux下常用命令 第4部分  VI编辑器 Linux下vi编辑器的使用 <<学习vi和vim编辑器>>1 <<学习vi和vim编辑器>>2 第5部分  Shell脚本 Shell入门之脚本管理 Shell入门之测试操作 Shell入门之条件循环 Shell入门之

Andrew Ng机器学习课程笔记(五)之应用机器学习的建议

Andrew Ng机器学习课程笔记(五)之 应用机器学习的建议 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7368472.html 前言 学习了Andrew Ng课程,开始写了一些笔记,现在写完第5章了,先把这5章的内容放在博客中,后面的内容会陆续更新! 这篇博客主要记录了Andrew Ng课程第五章应用机器学习的建议,主要介绍了在测试新数据出现较大误差该怎么处理,这期间讲到了数据集的分类,偏差,方差,学习曲线等概念,帮

JAVA课程笔记_1

一 课程内容 set path查看路径信息:当编译一个程序或命令时,先从当前目录查找,如果没有,按path中的路径按顺序查找,先找到后就不查找后面的路径了. 可以将目录加入环境变量,set path="复制的路径" 可以在.java程序中编写多个类,当编译时,每个类生成各自的字节码文件. 由于多个类的字节码文件不利于管理,使用bin目录下的jar命令可以将多个字节码文件打包成jar包发布给其他程序员使用. 使用方法:先在命令提示符下输入jar,会出现使用方法和实例.Jar打包两个cla

Django开发BBS---51网络课程笔记(目录)

这是51cto中bbs课程中的一个项目,这里写一下每节的目录: Django开发BBS---51网络课程笔记(1) 这部分主要介绍了数据库的搭建及站点管理 http://4440271.blog.51cto.com/4430271/1663863 Bootstrap开发 这不分主要讲前端的设计 http://4440271.blog.51cto.com/4430271/1663934 Django开发BBS---51网络课程笔记(2) 这部分主要讲view与前端的衔接部分 http://4440

跟我学《JavaScript高程3》第三讲,课程笔记

跟我学<JavaScript高程3> 第三讲:第4章 课程制作:bling,兴哥,5年Java,3年前端 课程知识:JavaScript.Html.Css 课程目标:前端体系课程,逐步深入,找到一份前端工作    课程大纲:本书目录结构 适合人群:前端初学者,可以0基础,但要认真,踏实 课程回顾 1.数据类型:5种基本类型,1中复杂类型. 2.操作符:需要注意运算优先级,算关逻条赋逗. 3.语句:if-else.for.for-in.while 4.函数:函数定义,目前的两种方法 补充:变量在

【课程笔记】需求挖掘与分析

*…* 产品定位与分析有三部分内容:需求分析.用户调研.市场分析. 下面是前两部分内容的课程笔记,整理成思维导图.

(转)妙味课堂—JavaScrip中级课程笔记

DOM基础概念.操作 DOM的概念及节点类型 childNodes children nodeType attributes 子节点和兄弟节点的操作 firstChild firstElementChild lastChild.lastElementChild nextSibling.previousSibling 父节点 parentNode offsetParent 元素位置宽高 offsetLeft.offsetTop offsetWidth.offsetHeight getPos() 操

Android网络项目课程笔记-----Volley框架

Volley 问题原因: Android4.x版本和2.x对AsyncTask的机制不同 2.x之中,同时执行5个,4.x同时只有一个 解决思路: 1) 使用Thread + Handler 注意: 使用线程池 2) 定制AsyncTask线程池 3) 开源框架Volley 1. 检查网络 2. 退出 3. 总结 有待改进 做的比较好的 商业级项目: 1) 稳定性   不要轻易FC    运行时异常 2) 用户体验:流畅(性能)/美观 3) 可扩展性 4) 可读性 5) 异常流程:提示 + 指导

Android网络项目课程笔记-----计划

目标:好用 充分:1) 角色完整 产品经理   灵魂 美工  交互设计师 开发   架构师 开发者 测试 小部分用户 2) 运营推广 基础:能用 必须: 1) API   框架 2) 模块(一个功能集合) * 3) 业务流程 4) bug 具备解决大部分中等难度bug的能力 5) 自学新技术的能力 6) 阅读代码 不合格:1) 做不了,有难度.需要很长时间 2) 只是做了,对过程负责.对结果不负责 3) 只是掌握了某个功能的基本实现方法,一旦出了bug, 解决效率很低 4) 没做过,没把握 合格