今日学习:hibernate是什么

一、hibernate是什么

框架是什么:

1.框架是用来提高开发效率的

2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现.

3.所以框架可以理解成是一个半成品的项目.只要懂得如何驾驭这些功能即可.

hibernate框架是什么:

hibernate的好处:

操作数据库的时候,可以以面向对象的方式来完成.不需要书写SQL语句

hibernate是一款orm框架:

orm:object relationg mapping. 对象关系映射

orm分4级:

hibernate属于4级:完全面向对象操作数据库

mybatis属于2级

dbutils属于1级

二、hibernate框架的搭建

1.导包

驱动包

2.创建数据库,准备表,实体

3.书写orm元数据(对象与表的映射配置文件)

4.书写主配置文件(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.  
  8. <!--
  9. #hibernate.dialect org.hibernate.dialect.MySQLDialect
  10. #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
  11. #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
  12. #hibernate.connection.driver_class com.mysql.jdbc.Driver
  13. #hibernate.connection.url jdbc:mysql:///test
  14. #hibernate.connection.username gavin
  15. #hibernate.connection.password
  16. -->
  17. <!-- 数据库驱动 -->
  18. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  19. <!-- 数据库url -->
  20. <property name="hibernate.connection.url">jdbc:mysql:///hibernate_32</property>
  21. <!-- 数据库连接用户名 -->
  22. <property name="hibernate.connection.username">root</property>
  23. <!-- 数据库连接密码 -->
  24. <property name="hibernate.connection.password">1234</property>
  25. <!-- 数据库方言
  26. 不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
  27. sql99标准: DDL 定义语言 库表的增删改查
  28. DCL 控制语言 事务 权限
  29. DML 操纵语言 增删改查
  30. 注意: MYSQL在选择方言时,请选择最短的方言.
  31. -->
  32. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  33.  
  34. <!-- #hibernate.show_sql true
  35. #hibernate.format_sql true
  36. -->
  37. <!-- 将hibernate生成的sql语句打印到控制台 -->
  38. <property name="hibernate.show_sql">true</property>
  39. <!-- 将hibernate生成的sql语句格式化(语法缩进) -->
  40. <property name="hibernate.format_sql">true</property>
  41. <!--
  42. ## auto schema export 自动导出表结构. 自动建表
  43. #hibernate.hbm2ddl.auto create 自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
  44. #hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
  45. #hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
  46. #hibernate.hbm2ddl.auto validate 校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
  47. -->
  48. <property name="hibernate.hbm2ddl.auto">update</property>
  49. <!-- 引入orm元数据
  50. 路径书写: 填写src下的路径
  51. -->
  52. <mapping resource="cn/xyp/domain/Customer.hbm.xml" />
  53.  
  54. </session-factory>
  55. </hibernate-configuration>

5.书写代码测试

  1. //测试Hibernate框架
  2. public class Demo {
  3.  
  4. @Test
  5. //保存客户
  6. public void fun1(){
  7. Configuration conf = new Configuration().configure();
  8.  
  9. SessionFactory sessionFactory = conf.buildSessionFactory();
  10.  
  11. Session session = sessionFactory.openSession();
  12.  
  13. Transaction tx = session.beginTransaction();
  14. //----------------------------------------------
  15. Customer c = new Customer();
  16. c.setCust_name("google公司");
  17.  
  18. session.save(c);//执行保存
  19.  
  20. //----------------------------------------------
  21. tx.commit();
  22. session.close();
  23. sessionFactory.close();
  24. }
  25. }

三、配置文件详解

orm元数据

  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. <!-- package属性:填写一个包名.在元素内部凡是需要书写完整类名的属性,可以直接写简答类名了. -->
  7. <hibernate-mapping package="cn.xyp.domain" >
  8. <!--
  9. class元素: 配置实体与表的对应关系的
  10. name: 完整类名
  11. table:数据库表名
  12. -->
  13. <class name="Customer" table="cst_customer" >
  14. <!-- id元素:配置主键映射的属性
  15. name: 填写主键对应属性名
  16. column(可选): 填写表中的主键列名.默认值:列名会默认使用属性名
  17. type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
  18. 每个类型有三种填法: java类型|hibernate类型|数据库类型
  19. not-null(可选):配置该属性(列)是否不能为空. 默认值:false
  20. length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
  21. -->
  22. <id name="cust_id" >
  23. <!-- generator:主键生成策略(明天讲) -->
  24. <generator class="native"></generator>
  25. </id>
  26. <!-- property元素:除id之外的普通属性映射
  27. name: 填写属性名
  28. column(可选): 填写列名
  29. type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
  30. 每个类型有三种填法: java类型|hibernate类型|数据库类型
  31. not-null(可选):配置该属性(列)是否不能为空. 默认值:false
  32. length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
  33. -->
  34. <property name="cust_name" column="cust_name" >
  35. <!-- <column name="cust_name" sql-type="varchar" ></column> -->
  36. </property>
  37. <property name="cust_source" column="cust_source" ></property>
  38. <property name="cust_industry" column="cust_industry" ></property>
  39. <property name="cust_level" column="cust_level" ></property>
  40. <property name="cust_linkman" column="cust_linkman" ></property>
  41. <property name="cust_phone" column="cust_phone" ></property>
  42. <property name="cust_mobile" column="cust_mobile" ></property>
  43. </class>
  44. </hibernate-mapping>

hibernate主配置:

必选属性配置(5个)

  1. <!-- 数据库驱动 -->
  2. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  3. <!-- 数据库url -->
  4. <property name="hibernate.connection.url">jdbc:mysql:///hibernate_32</property>
  5. <!-- 数据库连接用户名 -->
  6. <property name="hibernate.connection.username">root</property>
  7. <!-- 数据库连接密码 -->
  8. <property name="hibernate.connection.password">1234</property>
  9. <!-- 数据库方言
  10. 不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
  11. sql99标准: DDL 定义语言 库表的增删改查
  12. DCL 控制语言 事务 权限
  13. DML 操纵语言 增删改查
  14. 注意: MYSQL在选择方言时,请选择最短的方言.
  15. -->
  16. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

可选属性配置(3个)

  1. <!-- #hibernate.show_sql true
  2. #hibernate.format_sql true
  3. -->
  4. <!-- 将hibernate生成的sql语句打印到控制台 -->
  5. <property name="hibernate.show_sql">true</property>
  6. <!-- 将hibernate生成的sql语句格式化(语法缩进) -->
  7. <property name="hibernate.format_sql">true</property>
  8. <!--
  9. ## auto schema export 自动导出表结构. 自动建表
  10. #hibernate.hbm2ddl.auto create 自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
  11. #hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
  12. #hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
  13. #hibernate.hbm2ddl.auto validate 校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
  14. -->
  15. <property name="hibernate.hbm2ddl.auto">update</property>

元数据引入配置

  1. <!-- 引入orm元数据
  2. 路径书写: 填写src下的路径
  3. -->
  4. <mapping resource="cn/xyp/domain/Customer.hbm.xml" />

四、hibernateAPI详解

学习Configuration对象

  1. //学习Configuration对象
  2. // Configuration功能: 配置加载类.用于加载主配置,orm元数据加载
  3. public class Demo {
  4.  
  5. @Test
  6. public void fun1(){
  7. //1 创建,调用空参构造
  8. Configuration conf = new Configuration();
  9. //2 读取指定主配置文件 => 空参加载方法,加载src下的hibernate.cfg.xml文件
  10. conf.configure();
  11. //3 读取指定orm元数据(扩展),如果主配置中已经引入映射配置.不需要手动加载
  12. //conf.addResource(resourceName);
  13. //conf.addClass(persistentClass);
  14.  
  15. //4 根据配置信息,创建 SessionFactory对象
  16. SessionFactory sf = conf.buildSessionFactory();
  17.  
  18. }
  19. }

学习SessionFactory对象

  1. //学习SessionFactory对象
  2. // SessionFactory功能: 用于创建操作数据库核心对象session对象的工厂.
  3. // 简单说功能就一个---创建session对象
  4. //注意:1.sessionfactory 负责保存和使用所有配置信息.消耗内存资源非常大.
  5. // 2.sessionFactory属于线程安全的对象设计.
  6. //结论: 保证在web项目中,只创建一个sessionFactory.
  7. public class Demo2 {
  8.  
  9. @Test
  10. public void fun1(){
  11. //1 创建,调用空参构造
  12. Configuration conf = new Configuration();
  13. //2 读取指定主配置文件 => 空参加载方法,加载src下的hibernate.cfg.xml文件
  14. conf.configure();
  15. //3 读取指定orm元数据(扩展),如果主配置中已经引入映射配置.不需要手动加载
  16. //conf.addResource(resourceName);
  17. //conf.addClass(persistentClass);
  18.  
  19. //4 根据配置信息,创建 SessionFactory对象
  20. SessionFactory sf = conf.buildSessionFactory();
  21. //--------------------------------------------------
  22. //5 获得session
  23. //打开一个新的session对象
  24. sf.openSession();
  25. //获得一个与线程绑定的session对象(明天讲解)
  26. sf.getCurrentSession();
  27. }
  28. }

学习Session对象:增删查改

  1. //学习Session对象
  2. //session对象功能: 表达hibernate框架与数据库之间的连接(会话).session类似于
  3. // JDBC年代的connection对象. 还可以完成对数据库中数据的增删改查操作.
  4. // session是hibernate操作数据库的核心对象
  5. public class Demo3 {
  6.  
  7. @Test
  8. //事务操作
  9. public void fun1(){
  10. //1 创建,调用空参构造
  11. Configuration conf = new Configuration().configure();
  12. //2 根据配置信息,创建 SessionFactory对象
  13. SessionFactory sf = conf.buildSessionFactory();
  14. //3 获得session
  15. Session session = sf.openSession();
  16. //4 session获得操作事务的Transaction对象
  17. //获得操作事务的tx对象
  18. //Transaction tx = session.getTransaction();
  19. //开启事务并获得操作事务的tx对象(建议使用)
  20. Transaction tx2 = session.beginTransaction();
  21. //----------------------------------------------
  22.  
  23. //----------------------------------------------
  24. tx2.commit();//提交事务
  25. tx2.rollback();//回滚事务
  26. session.close();//释放资源
  27. sf.close();//释放资源
  28. }
  29.  
  30. @Test
  31. //session的新增
  32. public void fun2(){
  33. //1 创建,调用空参构造
  34. Configuration conf = new Configuration().configure();
  35. //2 根据配置信息,创建 SessionFactory对象
  36. SessionFactory sf = conf.buildSessionFactory();
  37. //3 获得session
  38. Session session = sf.openSession();
  39. //4 session获得操作事务的Transaction对象
  40. //获得操作事务的tx对象
  41. //Transaction tx = session.getTransaction();
  42. //开启事务并获得操作事务的tx对象(建议使用)
  43. Transaction tx2 = session.beginTransaction();
  44. //----------------------------------------------
  45. Customer c = new Customer();
  46. c.setCust_name("传智播客");
  47.  
  48. session.save(c);
  49. //----------------------------------------------
  50. tx2.commit();//提交事务
  51. session.close();//释放资源
  52. sf.close();//释放资源
  53. }
  54. @Test
  55. //session的查询
  56. //查询id为1的customer对象
  57. public void fun3(){
  58. //1 创建,调用空参构造
  59. Configuration conf = new Configuration().configure();
  60. //2 根据配置信息,创建 SessionFactory对象
  61. SessionFactory sf = conf.buildSessionFactory();
  62. //3 获得session
  63. Session session = sf.openSession();
  64. //4 session获得操作事务的Transaction对象
  65. //获得操作事务的tx对象
  66. //Transaction tx = session.getTransaction();
  67. //开启事务并获得操作事务的tx对象(建议使用)
  68. Transaction tx2 = session.beginTransaction();
  69. //----------------------------------------------
  70.  
  71. Customer customer = session.get(Customer.class, 1l);
  72.  
  73. System.out.println(customer);
  74. //----------------------------------------------
  75. tx2.commit();//提交事务
  76. session.close();//释放资源
  77. sf.close();//释放资源
  78. }
  79. @Test
  80. //session的修改
  81. //修改id为1的customer对象的name属性为黑马程序员
  82. public void fun4(){
  83. //1 创建,调用空参构造
  84. Configuration conf = new Configuration().configure();
  85. //2 根据配置信息,创建 SessionFactory对象
  86. SessionFactory sf = conf.buildSessionFactory();
  87. //3 获得session
  88. Session session = sf.openSession();
  89. //4 session获得操作事务的Transaction对象
  90. //获得操作事务的tx对象
  91. //Transaction tx = session.getTransaction();
  92. //开启事务并获得操作事务的tx对象(建议使用)
  93. Transaction tx2 = session.beginTransaction();
  94. //----------------------------------------------
  95. //1 获得要修改的对象
  96. Customer c = session.get(Customer.class, 1l);
  97. //2 修改
  98. c.setCust_name("黑马程序员");
  99. //3 执行update
  100. session.update(c);
  101. //----------------------------------------------
  102. tx2.commit();//提交事务
  103. session.close();//释放资源
  104. sf.close();//释放资源
  105. }
  106. @Test
  107. //session的删除
  108. //删除id为1的customer对象
  109. public void fun5(){
  110. //1 创建,调用空参构造
  111. Configuration conf = new Configuration().configure();
  112. //2 根据配置信息,创建 SessionFactory对象
  113. SessionFactory sf = conf.buildSessionFactory();
  114. //3 获得session
  115. Session session = sf.openSession();
  116. //4 session获得操作事务的Transaction对象
  117. //获得操作事务的tx对象
  118. Transaction tx = session.getTransaction();
  119. tx.begin();
  120. //开启事务并获得操作事务的tx对象(建议使用)
  121. Transaction tx2 = session.beginTransaction();
  122. //----------------------------------------------
  123. //1 获得要修改的对象
  124. Customer c = session.get(Customer.class, 1l);
  125. //2 调用delete删除对象
  126. session.delete(c);
  127. //----------------------------------------------
  128. tx2.commit();//提交事务
  129. session.close();//释放资源
  130. sf.close();//释放资源
  131. }
  132. }

五、CRM练习:保存客户

前面的步骤参考前面的笔记。

5.思路分析

在完成作业之前可以先编写一个方便操作的工具类,免去重复的代码:

  1. public class HibernateUtils {
  2. private static SessionFactory sf;
  3.  
  4. static{
  5. //1 创建,调用空参构造
  6. Configuration conf = new Configuration().configure();
  7. //2 根据配置信息,创建 SessionFactory对象
  8. sf = conf.buildSessionFactory();
  9. }
  10.  
  11. //获得session => 获得全新session
  12. public static Session openSession(){
  13. //3 获得session
  14. Session session = sf.openSession();
  15.  
  16. return session;
  17.  
  18. }
  19. //获得session => 获得与线程绑定的session
  20. public static Session getCurrentSession(){
  21. //3 获得session
  22. Session session = sf.getCurrentSession();
  23.  
  24. return session;
  25. }
  26. public static void main(String[] args) {
  27. System.out.println(HibernateUtils.openSession());
  28. }
  29.  
  30. }

作业核心代码:

web层:

  1. /**
  2. * Servlet implementation class AddCustomerServlet
  3. */
  4. public class AddCustomerServlet extends HttpServlet {
  5. private static final long serialVersionUID = 1L;
  6.  
  7. private CustomerService customerService = new CustomerServiceImpl();
  8.  
  9. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  10. //1 获得参数并封装到Customer对象
  11. Customer c = new Customer();
  12. try {
  13. BeanUtils.populate(c, request.getParameterMap());
  14. } catch (IllegalAccessException e) {
  15. e.printStackTrace();
  16. } catch (InvocationTargetException e) {
  17. e.printStackTrace();
  18. }
  19. //2 调用Service保存客户
  20. customerService.save(c);
  21. //3 重定向到客户列表
  22. response.sendRedirect(request.getContextPath()+"/ListCustomerServlet");
  23. }
  24.  
  25. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  26. doGet(request, response);
  27. }
  28.  
  29. }

service层:

  1. public class CustomerServiceImpl implements CustomerService {
  2.  
  3. private CustomerDao customerDao = new CustomerDaoImpl();
  4.  
  5. public void save(Customer c) {
  6. //调用Dao保存客户
  7. customerDao .save(c);
  8. }
  9.  
  10. }

dao层:

  1. public class CustomerDaoImpl implements CustomerDao {
  2.  
  3. public void save(Customer c) {
  4. //1 获得session
  5. Session session = HibernateUtils.openSession();
  6. //2 打开事务
  7. Transaction tx = session.beginTransaction();
  8. //3 执行保存
  9. session.save(c);
  10. //4 提交事务
  11. tx.commit();
  12. //5 关闭资源
  13. session.close();
  14. }
  15. }

 

【JAVAEE学习笔记】hibernate01:简介、搭建、配置文件详解、API详解和CRM练习:保存客户的更多相关文章

  1. JAVAEE学习——hibernate01:简介、搭建、配置文件详解、API详解和CRM练习:保存客户

    今日学习:hibernate是什么 一.hibernate是什么 框架是什么: 1.框架是用来提高开发效率的 2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现. 3.所以框架 ...

  2. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...

  3. Android Studio 学习笔记(一)环境搭建、文件目录等相关说明

    Android Studio 学习笔记(一)环境搭建.文件目录等相关说明 引入 对APP开发而言,Android和iOS是两大主流开发平台,其中区别在于 Android用java语言,用Android ...

  4. Linux内核学习笔记-1.简介和入门

    原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  5. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78516 ...

  6. Solr 6.7学习笔记(02)-- 配置文件 managed-schema (schema.xml) -- 样例(6)

    managed-schema 样例: <?xml version="1.0" encoding="UTF-8" ?> <!-- License ...

  7. Solr 6.7学习笔记(02)-- 配置文件 managed-schema (schema.xml)(3)

         5. <fieldType> fieldType主要定义了一些字段类型,其name属性值用于前面<field>中的type属性的值.e.g. <fieldTyp ...

  8. Solr 6.7学习笔记(02)-- 配置文件 managed-schema (schema.xml) - filter(5)

    自定义fieldType时,通常还会用到filter.filter必须跟在tokenizer或其它filter之后.如: <fieldType> <analyzer> < ...

  9. hadoop学习笔记壹 --环境搭建及配置文件的修改

    Hadoop生态和其他生态最大的不同之一就是“单一平台多种应用”的理念了. hadoop能解决是什么问题: 1.HDFS :海量数据存储 MapReduce: 海量数据分析   YARN :资源管理调 ...

随机推荐

  1. vue router-link 上添加点击事件

    在vue学习中遇到给router-link 标签添加事件@click .@mouseover等无效的情况 我想要做的是鼠标移上去出现删除标签,移除标签消失的效果 原代码: <router-lin ...

  2. iOS多线程的三种方法

    前言 在多线程简介中,我已经说明过了,为了提高界面的流畅度以及用户体验.我们务必要把耗时的操作放到别的线程中去执行,千万不要阻塞主线程.iOS中有以下3种多线程编程方法: NSThread Grand ...

  3. 【Java 并发】详解 ThreadPoolExecutor

    前言 线程池是并发中一项常用的优化方法,通过对线程复用,减少线程的创建,降低资源消耗,提高程序响应速度.在 Java 中我们一般通过 Exectuors 提供的工厂方法来创建线程池,但是线程池的最终实 ...

  4. Xamarin.Android 绑定友盟社会化分享组件

    Xamarin.Android 绑定友盟社会化分享组件 最近在开发博客园Android App的时候需要用到友盟社会化分享组件,在github上搜了一下都没有找到最新版本绑定好的项目,就自己动手来绑定 ...

  5. Javascript中this关键字

    this 是谁调用的时候,指定的是谁,通俗一点讲就是,函数是谁执行是不是由其中一个对象点出来的那就是代表它, 比如执行对象a中b函数a.b();这个b函数中this代表a; 当换成var c=a.b; ...

  6. JQuery 根据ID在页面中定位

    1.锚点跳转简介 锚点其实就是可以让页面定位到某个位置上的点.在高度较高的页面中经常见到.比如百度的百科页面,wiki中的page内容. 我知道实现锚点的跳转有两种形式,一种是a标签+name属性:还 ...

  7. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

  8. haproxy安装配置for mysql负载均衡(ubantu)

    1.安装pcre apt-get update (apt-get install openssl libssl-dev  ==>可能需要安装的依赖包) apt-get install libpc ...

  9. POJ1006: 中国剩余定理的完美演绎(非原创)

    问题描述 人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天.一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好.通常这三个周期的峰值不会是同一天.现在给出 ...

  10. js获取一组不重复的随机数的方法

    一.基本思路: 建立一个数组存放所有可以取到的值,每次从该数组中随机取走一个,放到新的数组中,直到完成. 二.实现方法 1.方法一: (1)创建一个数组arr,数组元素为所有可能出现元素的集合: (2 ...