为什么会产生 Hibernate Mybatis 这类的dao层框架

传统的jdbc 虽然执行速度很快,但是开发效率很低,随着面向对象开发的设计思想,在面向对象编程中 将对象 进行持久化,存入关系型的数据库时,由于关系型数据库的设计思想是数学思维,在持久化时,必须要对象拆分各个属性值,才可存入数据库;传统的jdbc 持久化时 对象持久化时 ,取出对象的一个一个属性,过去繁琐,并且不便于维护,而市场上的面向对象的数据库还并不成熟,所以为了调节面向对象设计的开发思想与落后的关系型数据库之间持久化时繁琐的问题,产生了一种新的设计规范

ORM (Object Relation Mapping) 

对象关系映射,是一种规范,调节目前面向对象的程序设计与主流的关系型数据库之间 发展不同步的问题,
关系 到对象的映射;
让编程时 可以全身心的用面向对象的设计思想去编程,用对象映射关系数据表,在持久化时,可以直接操作对象进行持久化。
优点:
开发效率高;
可维护性高;
缺点:
高效率的开发 对应也要失去性能,处理复杂关系时,性能会变差;
实现这种规范的框架之一
Hibernate
介绍:免费的开源java包,对象到关系之间的转变很容易,程序开发时可以完全的以面向对象的设计思想去开发。轻量级框架,低侵入,开发者活跃,开发文档也很全,
支持多种数据库,并且为了更好的操作各种数据库,它专门为每种数据库都准备了一套“方言”组件
可以这样理解:天津人对外讲普通话,但是对家乡人会用天津话去沟通,这样沟通更加容易,
它很有特点的一功能就是在配置完实体对象和表结构的映射文件之后,可以自动为你去创建表,
而且通过主配置文件 配置过数据库连接 事务,等操作之后,获取到的session 可以直接对“对象”持久化,不需要你去考虑sql语句,
但是由于它的这种方式,在处理复杂的sql语句持久化时,就显示出不足了,不够灵活;
 
环境搭建:
第一步:导入jar包
 
第二步:创建实体类
  1. package hibernateDemo;
  2.  
  3. import java.util.Date;
  4.  
  5. /**
  6. * 持久化的bean类
  7. * 注意:
  8. * 1: id唯一标识 建议 使用封装类型
  9. * 2:这个类不能final修饰
  10. * 3:需要给这个类提供一个无参数的构造器,
  11. * 4:给所有的属性提供get set方法;
  12. * 5: 如果有设计集合数据的操作,集合类型 要使用接口类型 list 不允许实现类的类型 arrylist;
  13. * 创建对象的时候 是用 new 构造器方法
  14. * @author Administrator
  15. *
  16. */
  17. public class Person {
  18. public Person(){
  19.  
  20. }
  21. private Integer id;
  22. private String name;
  23. private int passWord;
  24. private Date birthday;
  25.  
  26. public Integer getId() {
  27. return id;
  28. }
  29. public void setId(Integer id) {
  30. this.id = id;
  31. }
  32. public String getName() {
  33. return name;
  34. }
  35. public void setName(String name) {
  36. this.name = name;
  37. }
  38. public int getPassWord() {
  39. return passWord;
  40. }
  41. public void setPassWord(int passWord) {
  42. this.passWord = passWord;
  43. }
  44. public Date getBirthday() {
  45. return birthday;
  46. }
  47. public void setBirthday(Date birthday) {
  48. this.birthday = birthday;
  49. }
  50. @Override
  51. public String toString() {
  52. return "Person [id=" + id + ", name=" + name + ", passWord=" + passWord + ", birthday=" + birthday + "]";
  53. }
  54. }

第三部:创建相应的映射文件

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
  3. <!-- 映射文件 java对象Dao关系数据库的映射配置文件 -->
  4. <hibernate-mapping package = "hibernateDemo">
  5. <!-- class配置 类 对应表的映射
  6. 对应的实体类就是 package+class的name
  7. table 表示关系数据库的表名
  8. -->
  9. <class name="Person" table="t_person">
  10. <!-- id 指定 实体类中哪一个属性为 唯一标识ID -->
  11. <id name="id" >
  12. <!-- 自动生成id策略 -->
  13. <generator class="native"/>
  14. </id>
  15. <!-- 实体类的其他属性配置
  16. name:对应实体类的属性 column:对应表的字段名(若不指定 将默认使用类的属性名)
  17.  
  18. -->
  19. <property name="name" column="t_name"/>
  20. <property name="passWord" column="t_passWord"/>
  21. <property name="birthday"/>
  22.  
  23. </class>
  24. </hibernate-mapping>

第四步 主配置文件 放在src目录下 官方的api上会默认去src下查hibernate.cfg.xml这个文件 还有其他方式下面介绍

  1. <!DOCTYPE hibernate-configuration PUBLIC
  2. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  4.  
  5. <hibernate-configuration>
  6. <session-factory>
  7. <!-- 显示执行的SQL语句 -->
  8. <property name="show_sql">true</property>
  9. <!-- 驱动 -->
  10. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  11. <!-- 数据库url-->
  12. <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/medicine?useUnicode=true&amp;characterEncoding=utf-8</property>
  13. <!-- 访问数据库用户名 -->
  14. <property name="hibernate.connection.username">root</property>
  15. <!-- 访问数据库密码 -->
  16. <property name="hibernate.connection.password">root</property>
  17. <!-- 如果使用的mysql数据版本在5.5之后的话,方言通常建议使用MySQL5InnoDBDialect
  18. MySQLDialect 不支持事务
  19. MySQLInnoDBDialect 支持事务
  20. 为了更好的操作各种数据库,所以为每个数据库 准备了不同的方言
  21. -->
  22. <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
  23. <!-- 自动创建表结构配置
  24. create-drop 在程序启动的时候创建对应数据库表结构,当SessionFatory关闭的时候会将创建的表结构删除
  25. create 在每次程序启动的时候先删除上次创建的数据库表结构,然后再创建对应新数据库表结构。
  26. update 在每次启动的时候会追加修改的表结构,但是不会影响原来的数据 (通常用这个)
  27. validate 在每次启动的时候会验证并修改的表结构。
  28. -->
  29. <property name="hibernate.hbm2ddl.auto">update</property>
  30.  
  31. <!-- 告诉映射文件的位置 引入需要对应的配置文件-->
  32. <mapping resource="hibernateDemo/Person.hbm.xml"/>
  33.  
  34. </session-factory>
  35. </hibernate-configuration>

最后一步测试代码了

  1. package test;
  2.  
  3. import java.util.Date;
  4.  
  5. import org.hibernate.Session;
  6. import org.hibernate.SessionFactory;
  7. import org.hibernate.Transaction;
  8. import org.hibernate.cfg.Configuration;
  9.  
  10. import hibernateDemo.Person;
  11.  
  12. public class test {
  13. public static void main(String[] args) {
    //加载 主配置文件的方式 还有一种读取properties文件的方式
  14. //创建Configuration读取配置文件的 对象 可传参数,并加载配置文件hibernate.cfg.xml
  15. Configuration conf = new Configuration().configure();
  16. //通过配置文件中的配置信息 获取数据库连接
  17. //这种写法是hibernate4之前的写法
  18. //sessionFactory是与应用程序生命周期一致的,多线程共享的
  19. SessionFactory factory = conf.buildSessionFactory();
  20. //相当于一次数据库的交互 代表一次操作 只为一次线程使用 线程结束 声明 over
  21. Session session = factory.openSession();
  22. /**
  23. * 增删改 是需要 事务
  24. */
  25. Transaction tx = session.beginTransaction();
  26. Person entity = new Person();
  27. entity.setName("tom");
  28. entity.setPassWord(123456);
  29. entity.setBirthday(new Date());
  30. //面向对象的方式 持久化
  31. session.persist(entity);
  32. /**
  33. * 提交事务
  34. */
  35. tx.commit();
  36. session.close();
  37.  
  38. }
  39. }

数据库的显示

 查询 get方法 立即执行
  1. /**
  2. * get方式返回的是一个持久化类的实例 一执行就立即查询 执行查询语句立即查询
  3. *
  4. */
  5.  
  6. public static void get(){
  7. Configuration conf = new Configuration().configure();
  8. /**
  9. * 推荐使用的获取factory 高效安全
  10. */
  11. ServiceRegistry sb = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
  12. SessionFactory factory = conf.buildSessionFactory(sb);
  13. Session session = factory.openSession();
  14. //根据id查询数据
  15. Person o = (Person)session.get(Person.class, 2);
  16. System.out.println(o);
  17. session.close();
  18. factory.close();
  19.  
  20. }

查询 2 load延迟查询

  1. /**
  2. * load 返回的是一个持久化类的代理,当正真访问除了id以外的属性时,才去发起sql查询;
  3. * 延迟查询 ,第一次查询只不过是给你一个代理 不是真的查询。真正的查询是你在调用这个实例的某一个属性才会具体查询;
  4. * 当给定的id不存在时,什么时候调用什么时候抛出错误异常;不调用不会报错;
  5. * 可通过 映射文件上的class标签内的 lazy="false" 改成立即执行
  6. */
  7. public static void load(){
  8. Configuration conf = new Configuration().configure();
  9. /**
  10. * 推荐使用的获取factory 高效安全
  11. */
  12. ServiceRegistry sb = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
  13. SessionFactory factory = conf.buildSessionFactory(sb);
  14. Session session = factory.openSession();
  15. //根据id查询数据
  16. Person o = (Person)session.load(Person.class, 10);
  17. System.out.println(o);
  18. session.close();
  19. factory.close();
  20. }

更新 引进session的持久化对象概念

当获取到 session管理的对象时(get load merge 等等获取到的对象),你可以完全不用update 或merge 方法 去再次修改
 对于session管理的对象,在session的连接断开的时候,会自动同步被管理的对象与数据库中的数据,若相同则不改变,若不相同,会以管理的对象为主更新数据库中的数据;

  1. /**
  2. * 修改通过get方法获得持久化对象
  3. * 更新了全部字段 更改的加上未更改的全部更新了仪表
  4. * 真正的执行sql语句是在session关闭的时候
  5. */
  6. public static void update1(){
  7. Configuration conf = new Configuration().configure();
  8. /**
  9. * 推荐使用的获取factory 高效安全
  10. */
  11. ServiceRegistry sb = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
  12. SessionFactory factory = conf.buildSessionFactory(sb);
  13. Session session = factory.openSession();
  14. Transaction tx = session.beginTransaction();
  15. Person o = (Person) session.get(Person.class, 1);
  16. System.out.println(o.getName());
  17. o.setName("Json");
  18. session.update(o);
  19. tx.commit();
  20. session.close();
  21. factory.close();
  22.  
  23. }
  24. /**
  25. * 修改通过自己创建的的对象
  26. * 更新了全部字段 更改的加上未更改的全部更新了表
  27. * 若只设置一个属性值 其他值全部被覆盖为空
  28. * 真正的执行sql语句是在session关闭的时候
  29. * 1:id必须有 ,并且必须对应数据库里某一条记录。
  30. */
  31. public static void update2(){
  32. Configuration conf = new Configuration().configure();
  33. /**
  34. * 推荐使用的获取factory 高效安全
  35. */
  36. ServiceRegistry sb = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
  37. SessionFactory factory = conf.buildSessionFactory(sb);
  38. Session session = factory.openSession();
  39. Transaction tx = session.beginTransaction();
  40. Person o = new Person();
  41. o.setId(2);
  42. o.setName("高效");
  43. session.merge(o);
  44. tx.commit();
  45. session.close();
  46. factory.close();
  47.  
  48. }
  49. /**
  50. *
  51. * 引进持久化状态
  52. * 当获取到 session管理的对象时(get load merge 等等获取到的对象),你可以完全不用update 或merge 方法 去再次修改
  53. * 对于session管理的对象,在session的连接断开的时候,会自动把被管理的对象去数据库比对,若相同则不改变,若不相同,会以管理的对象为主更新数据库中的数据;
  54. */
  55. public static void merge(){
  56. Configuration conf = new Configuration().configure();
  57. /**
  58. * 推荐使用的获取factory 高效安全
  59. */
  60. ServiceRegistry sb = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
  61. SessionFactory factory = conf.buildSessionFactory(sb);
  62. Session session = factory.openSession();
  63. Transaction tx = session.beginTransaction();
  64. Person o = new Person();
  65. o.setId(2);
  66. o.setName("高效2");
  67. Person p = (Person) session.merge(o);
  68. System.out.println("修改后o"+o);
  69. System.out.println("修改后p"+p);
  70. o.setName("高效33");
  71. p.setName("高效pp");
  72. System.out.println("再次修改后o"+o);
  73. System.out.println("再次修改后p"+p);
  74. tx.commit();
  75. session.close();
  76. factory.close();
  77.  
  78. }
 
 
 

Hibernate 初体验的更多相关文章

  1. hibernate初体验

    简介: Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使 ...

  2. Hibernate初体验及简单错误排除

    Hibernate是什么,有多少好处,想必查找这类博文的都知道,所以就不多说了.下面是我对Hibernate简单使用的一个小小的总结.与君(主要是刚入门的)共勉吧! 创建的顺序 创建Hibernate ...

  3. hibernate初使用

    准备工作,安装及配置Hibernate http://zhoualine.iteye.com/blog/1190141 在产生数据库表映射 Java 对象时,我增加了数据库中的两张表分别为Chatlo ...

  4. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  5. hibernate--CRUD初体验

    hibernate的crud操作初体验. 看具体实例 package com.fuwh.model; import javax.persistence.Column; import javax.per ...

  6. SSH初体验系列--Hibernate--2--crud操作

    Ok,今天比较详细的学习一下hibernate的C(create).R(read).U(update).D(delete) 相关api... 前言 Session: 是Hibernate持久化操作的基 ...

  7. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  8. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  9. Xamarin.iOS开发初体验

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0

随机推荐

  1. hexo的流程

    1.基于node 的npm包管理工具2.npm install -g hexo(hexo-cli)3.下载的资源是国外的可能比较慢,可以使用淘宝镜像(代理的仓库)npm install -g hexo ...

  2. 对象转JSON字符串与json字符串转对象方法

    JSON.stringify()[从一个对象中解析出字符串] JSON.parse()[从一个json字符串中解析出对象] var data = {"nums": 1, " ...

  3. Java基础__Java中异常处理那些事

    一.Exception 类的层次 所有的异常类是从 java.lang.Exception 类继承的子类. Exception 类是 Throwable 类的子类.除了Exception类外,Thro ...

  4. [DTOJ3996]:Lesson5!(DP+拓扑+线段树)

    题目描述 “最短的捷径就是绕远路,绕远路就是我最短的捷径” 转眼就$Stage\ X$了,$Stage\ X$的比赛路线可以看做一个$n$个点$m$条边的有向无环图,每条边长度都是$1$.杰洛$\cd ...

  5. LeetCode 第 3 题:无重复字符的最长子串(滑动窗口)

    LeetCode 第 3 题:无重复字符的最长子串 (滑动窗口) 方法:滑动窗口 滑动窗口模板问题:右指针先走,满足了一定条件以后,左指针向前走,直到不满足条件. 特点:左右指针的方向是一致的,并且是 ...

  6. uswgi

    1.安装uwsgi注意: 1)在系统环境安装,非虚拟环境 2)使用对应python版本安装 3)要先安装python开发包 ###sudo apt-get install python3.6-dev ...

  7. CentOS 6.5上的Tomcat启动报错问题

    最近在搭建虚拟机环境,装的是CentOSQL 6.5版本,然后装的OpenJDK1.7,在Apache下载了一个纯净的Tomcat放到虚拟机上启动报错了: 这里有两个错误: 1.第一个错误,APR的问 ...

  8. jQuery Validate 验证成功时的提示信息

    大多数时候我们使用validate进行前台验证的时候,都是验证错误的时候给出提示信息,最近在做一个项目的时候,想这验证成功后给出一个验证成功的提示.于是在网上找了一些资料. <!doctype ...

  9. SpringBoot&Dubbo&Zookeeper远程调用项目搭建

    序言 Dubbo一款分布式服务框架,作为阿里巴巴SOA服务化治理方案的核心框架,通过高性能和透明化的RPC实现服务的远程调用,对服务的负载均衡以及项目的耦合性提供很强的解决方式;具体Dubbo的介绍和 ...

  10. 使用KFold进行训练集和验证集的拆分,使用准确率和召回率来挑选合适的阈值(threshold) 1.KFold(进行交叉验证) 2.np.logical_and(两bool数组都是正即为正) 3.np.logical_not(bool数组为正即为反,为反即为正)

    ---恢复内容开始--- 1. k_fold = KFold(n_split, shuffle) 构造KFold的索引切割器 k_fold.split(indices) 对索引进行切割. 参数说明:n ...