Hibernate实例

一、Hibernate简介

Hibernate是简化项目中连接数据库的一个框架工具

Hibernate是Java领域类技术成熟稳定的ORM框架

* ORM是对象关系映射
* 使用ORM的好处:使得习惯使用面向对象编程的程序员在项目中尽量少写和底层数据库相关的sql语句
* 这样做的好处:方便程序维护和修改以及跨平台性和扩展

二、使用的工具

(1)eclipse

Eclipse Java EE IDE for Web Developers. Version: Neon.3 Release (4.6.3)

(2)mysql

mysql-5.7.17

(3)Navicat

Navicat Premium_11.2.7简体中文破解版

(4)hibernate插件

jbosstools-4.4.4.Final

(5)junit工具

junit-4.8.2

* JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。
* Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。
* Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。

(6)jdbc

mysql-connector-java-5.1.7

(三)Hibernate开发的基本步骤

* (1)编写项目配置文档hibernate.cfg.xml
* (2)编写实体类(需遵循Java bins的规范)
* (3)生产对应实体类的映射文件并添加到配置文档中
* (4)调用Hibernate API函数进行测试

hibernate执行流程图

1)编写项目配置文档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. <hibernate-configuration>
  6. <session-factory>
  7. <property name="connection.username">root</property><!--数据库用户名 -->
  8. <property name="connection.password">1314</property><!--数据库密码 -->
  9. <property name="connection.driver_class">com.mysql.jdbc.Driver</property><!--数据库驱动 -->
  10. <!--数据库链接 -->
  11. <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8</property>
  12.  
  13. <!--表示数据库的方言,对数据库的语言结构进行优化 -->
  14. <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
  15.  
  16. <!--是否把要执行的语句输出到控制台 -->
  17. <property name="show_sql">true</property>
  18. <!--是否对要执行的语句格式化 -->
  19. <property name="format_sql">true</property>
  20. <!--生成表结构的策略,create表示删除原表重新生成,update表示更新原表 -->
  21. <property name="hbm2ddl.auto">create</property>
  22. <!--给数据库中的所有表加上前缀 -->
  23. <property name="hibernate.default_schema">hibernate</property>
  24. <!--getCurrentSession方法创建session要用到的属性 -->
  25. <property name="hibernate.current_session_context_class">thread</property>
  26.  
  27. <mapping class="Students" />
  28. <!--掉用映射 Students.hbm.xml -->
  29. <mapping resource="Students.hbm.xml" />
  30.  
  31. </session-factory>
  32. </hibernate-configuration>

2)编写实体类(需遵循Java bins的规范)

Students.java

这是这个hibernate实例中的实体类,会映射到数据库的表中

  1. import java.util.Date;
  2.  
  3. //学生类
  4. public class Students {
  5.  
  6. /*
  7. * Java bin类的原则 1.公有的类 2.提供公有的不带参数的默认的构造方法 3.属性私有 4.属性setter/getter封装
  8. *
  9. */
  10.  
  11. private int sid;// 学号
  12. private String sname;// 姓名
  13. private String gender;// 性别
  14. private Date birthday;// 出生日期
  15. private String address;// 地址
  16.  
  17. public Students() {
  18.  
  19. }
  20.  
  21. public Students(int sid, String sname, String gender, Date birthday, String address) {
  22. // super();
  23. this.sid = sid;
  24. this.sname = sname;
  25. this.gender = gender;
  26. this.birthday = birthday;
  27. this.address = address;
  28. }
  29.  
  30. public int getSid() {
  31. return sid;
  32. }
  33.  
  34. public void setSid(int sid) {
  35. this.sid = sid;
  36. }
  37.  
  38. public String getSname() {
  39. return sname;
  40. }
  41.  
  42. public void setSname(String sname) {
  43. this.sname = sname;
  44. }
  45.  
  46. public String getGender() {
  47. return gender;
  48. }
  49.  
  50. public void setGender(String gender) {
  51. this.gender = gender;
  52. }
  53.  
  54. public Date getBirthday() {
  55. return birthday;
  56. }
  57.  
  58. public void setBirthday(Date birthday) {
  59. this.birthday = birthday;
  60. }
  61.  
  62. public String getAddress() {
  63. return address;
  64. }
  65.  
  66. public void setAddress(String address) {
  67. this.address = address;
  68. }
  69.  
  70. @Override
  71. public String toString() {
  72. return "Students [sid=" + sid + ", sname=" + sname + ", gender=" + gender + ", birthday=" + birthday
  73. + ", address=" + address + "]";
  74. }
  75.  
  76. }

3)生产对应实体类的映射文件并添加到配置文档中

这个配置文件就是将java中的类映射到数据库中的表

每修改一次实例的属性,这个配置文件就需要修改

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <!-- Generated 2017-5-29 9:53:03 by Hibernate Tools 3.5.0.Final -->
  5. <hibernate-mapping>
  6. <class name="Students" table="STUDENTS"><!--name表示在java中的类 table表示映射在数据库中的表名-->
  7. <id name="sid" type="int"><!--id整个这个标签表示主键 -->
  8. <!--sid表示在java类中的属性名 type表示这个属性的类型-->
  9. <column name="SID" /><!--SID表示的是这个属性映射在数据库中的字段名称-->
  10. <generator class="assigned" /><!--generator表示的是主键的生产方式 assigned表示人为指定 active表示数据库自动生成-->
  11. </id>
  12. <property name="sname" type="java.lang.String"><!--property是属性的意思-->
  13. <column name="SNAME" />
  14. </property>
  15. <property name="gender" type="java.lang.String">
  16. <column name="GENDER" />
  17. </property>
  18. <property name="birthday" type="java.util.Date">
  19. <column name="BIRTHDAY" />
  20. </property>
  21. <property name="address" type="java.lang.String">
  22. <column name="ADDRESS" />
  23. </property>
  24. </class>
  25. </hibernate-mapping>

4)调用Hibernate API函数进行测试

通过junit进行测试

  1. //这里报错我一直在纠结,其实视频里面这里也有错啊,我浪费时间
  2. //多去看视频下面的评论,有告诉我们很多问题的解决方案
  3. //运行代码时老犯配置错误,原来配置文件中不支持java注释的写法
  4. //我是通过删减犯错位置的代码来发现错误的
  5.  
  6. /*
  7. * 理解hibernate
  8. * hibernate是对jdbc进行了轻量级的封装,本身还是用的jdbc
  9. */
  10.  
  11. /*
  12. * 理解session
  13. * Session对象相当于jdbc中的connection数据库,因为要面对对象的思想操作数据库,
  14. * 所以用session而不是用而不是直接用jdbc
  15. * hibernate是对jdbc进行了轻量级的封装,本身还是用的jdbc
  16. * 所以可以简单理解session为操作数据库对象
  17. * session与connection是一对多的关系,每个session都有一个与之对应的connection,
  18. * 一个connection不同时刻可以供多个session使用
  19. * session的增删改查:save(),update(),delete().createQuery()
  20. */
  21.  
  22. /*
  23. * 理解transaction
  24. * hibernate对数据的操作都是封装在事务当中,并且默认是非自动提交方式,
  25. * 所以用session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中
  26. * 如果不开事务,要用session的doWork()方法将数据提交到数据库
  27. */
  28.  
  29. /*
  30. * session详解
  31. * 如何获得session对象
  32. * 1)openSession
  33. * 2)getCurrentSession
  34. */
  35. import java.sql.Connection;
  36. import java.sql.SQLException;
  37. import java.util.Date;
  38.  
  39. import org.hibernate.Session;
  40. import org.hibernate.SessionFactory;
  41. import org.hibernate.Transaction;
  42. import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
  43. import org.hibernate.cfg.Configuration;
  44. import org.hibernate.jdbc.Work;
  45. import org.hibernate.service.ServiceRegistry;
  46. import org.junit.After;
  47. import org.junit.Before;
  48. import org.junit.Test;
  49.  
  50. //测试类
  51. public class StudentsTest {
  52.  
  53. private SessionFactory sessionFactory;
  54. private Session session;
  55. private Transaction transaction;
  56.  
  57. @Before
  58. public void init(){
  59. //创建配置对象
  60. Configuration config = new Configuration().configure();
  61. //创建服务注册对象
  62. ServiceRegistry serviceRegistry = new
  63. StandardServiceRegistryBuilder().applySettings(config.getProperties()).configure().build();//这里有点不一样
  64. //创建会话工厂对象
  65. sessionFactory = config.buildSessionFactory(serviceRegistry);
  66. //创建会话对象
  67. session = sessionFactory.openSession();
  68. //开启事务
  69. transaction = session.beginTransaction();
  70. }
  71.  
  72. @After
  73. public void destory(){
  74. transaction.commit();//提交事务
  75. session.close();//关闭会话
  76. sessionFactory.close();//关闭会话工厂
  77. }
  78.  
  79. @Test
  80. public void testSaveStudents(){
  81. //生产学生对象
  82. Students s = new Students(1,"饭饭","男",new Date(),"博客园");
  83. // session.doWork(new Work() {//匿名内部类
  84. // @Override
  85. // public void execute(Connection connection) throws SQLException {
  86. // // TODO Auto-generated method stub
  87. // connection.setAutoCommit(true);
  88. // }
  89. // });
  90. session.save(s);//保存对象进入数据库
  91. // session.flush();//强制刷新流
  92. }
  93.  
  94. }

四、hibernate基本操作

hibernate基本数据类型

hibernate对象类型

hibernate常用基本类型

五、总结

* 1、什么是ORM?为什么要使用Hibernate?
* ORM是对象关系映射
* 使用ORM的好处是使得习惯使用面向对象编程的程序员在项目中尽量少写和底层数据库相关的sql语句
* 这样做的好处:方便程序维护和修改以及跨平台性和扩展
* Hibernate是Java领域类技术成熟稳定的ORM框架

* 2、Hibernate开发的基本步骤
* (1)编写项目配置文档hibernate.cfg.xml
* (2)编写实体类(需遵循Java bins的规范)
* (3)生产对应实体类的映射文件并添加到配置文档中
* (4)调用Hibernate API函数进行测试

* 3、什么是session?
* hibernate对数据库的操作都要使用session对象,session对象相当于我们使用jdbc开发的一个connection对象
* 我们使用hibernate对数据库的操作本质上就是调用session的API函数来实现的
* save():(增)保存数据 get()/load():(查)取出数据 update():(改)更新数据 delete():(删)删除数据

* 4、openSession与getCurrentSession
* openSession每次创建一个新的实例对象,需要我们显示关闭
* getCurrentSession使用的是一种单例模式,每次创建的都是相同的对象,自动关闭

* 5、单表操作有哪些方法?
* save():(增)保存数据 delete():(删)删除数据 update():(改)更新数据 get()/load():(查)取出数据

* 6、get和load
* get使用时立刻发送sql语句,而且直接获得实体类本身
* load是在使用到具体的实例的非主属性的时候才会发送sql语句,返回的是代理对象

Hibernate实例的更多相关文章

  1. 使用MyEclipse可视化开发Hibernate实例

    2.7  使用MyEclipse可视化开发Hibernate实例 2.7节的例子源代码在配套光盘sourcecode/workspace目录的chapter02_first项目中. 这个实例主要演示如 ...

  2. Hibernate实例二

    Hibernate实例二 一.测试openSession方法和getCurrentSession方法 hebernate中可以通过上述两种方法获取session对象以对数据库进行操作,下面的代码以及注 ...

  3. SSH---整合Struts2&Spring&Hibernate(实例)

    一.SSH回顾 Struts2:核心为过滤器+拦截器.过程:Filter--->FilterDispatcher-->ActionMapper-->ActionProxy--> ...

  4. Hibernate从入门到精通(二)Hibernate实例演示

    上篇Hibernate从入门到精通(一)JDBC简介,我们主要对JDBC进行了简单介绍和使用说明,这次我们做一个Hibernate简单实例,通过这个实例对比Hibernate和JDBC,了解Hiber ...

  5. Hibernate(二)Hibernate 实例

    上篇Hibernate(一)JDBC简介,我们主要对JDBC进行了简单介绍和使用说明,这次我们做一个Hibernate简单实例,通过这个实例对比Hibernate和JDBC,了解Hibernate的优 ...

  6. Spring MVC4 + Spring Security4 + Hibernate实例

    http://www.yiibai.com/spring-security/spring-mvc-4-and-spring-security-4-integration-example.html 在这 ...

  7. Hibernate实例——Customer表的展示

    Hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibe ...

  8. (Hibernate进阶)Hibernate搭建开发环境+简单实例(二)

    hibernate是非常典型的持久层框架,持久化的思想是非常值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和 ...

  9. 深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架

    这篇博客是hibernate学习的第一篇,主要简介hibernate框架,之后简单说一下hibernate的文件夹结构,最后写一个简单的hibernate实例.通过这三步来简单的认识一下hiberna ...

随机推荐

  1. http-equiv="Refresh" 实现定时刷新页面

    ***.html自动跳转文件代码如下: <HTML> <HEAD><META http-equiv="Refresh" content="5 ...

  2. pm2 观察报错时 pm2 start app.js --watch

    pm2 start app.js --watch[PM2][ERROR] Script already launched, add -f option to force re-execution

  3. String内存分析,for-each,参数传递

    上午总结: 蓝白书P245 (一)Iterator用法 import java.util.*; public class HashSetTest{ public static void main(St ...

  4. Django框架介绍之一

    这片博文就是对django有个大概的了解,通俗的说,就是先让django跑起来. django安装 在linux上安装如下: 源码安装: tar -zxvf Django-1.9.13.tar.gz ...

  5. C++面向对象高级开发课程(第三周)

    一,类与类之间的关系:继承(Inheritance).复合(Composition).委托(Delegation). 二,复合:表示 is-a ,该设计思想可以参照C语言的 struct . 1. 例 ...

  6. 如何在 Linux 中将文件编码转换为 UTF-8

    一个文件:vim 文件名.txt输入 :e ++enc=gbk 强制用gbk打开输入 :w ++enc=utf8 转换到utf8保存. 多个文件:for i in *.txt; do iconv -f ...

  7. 移动页面click延迟引发的touch问题

    一.事件捕获与冒泡 先扯一下事件的触发流程,这个之后会用到. DOM2级事件规定事件包括三个阶段: ① 事件捕获阶段 ② 处于目标阶段 ③ 事件冒泡阶段 大概的流程就是事件从最外层一层一层往里面传递( ...

  8. Duilib Edit编辑框禁止输入中文的方法

    转载:http://www.myexception.cn/vc-mfc/300749.html 编辑框是供用户输入的,但有时候我们要限制用户输入的内容,比如我们不让用户输入中文,只能输入字符和数字,因 ...

  9. 网站精准查询IP

    分享一些网站能精准查询IP的 https://www.chaidu.com/App/Web/IP/ http://www.ipip.net/ip.html http://www.hao7188.com ...

  10. Linux进程间通信--使用信号量【转】

    本文转载自:http://blog.csdn.net/ljianhui/article/details/10243617 这篇文章将讲述别一种进程间通信的机制——信号量.注意请不要把它与之前所说的信号 ...