微信公众号:compassblog

欢迎关注、转发,互相学习,共同进步!

有任何问题,请后台留言联系!

1、Hibernate框架概述

(1)、什么是Hibernate
Hibernate是一个开放源代码的 ORM 框架,是主流的Java持久层框架之一,它对 JDBC进行了轻量级的对象封装,使得Java开发人员可以使用面向对象的编程思想来操作数据库。
(2)、Hibernate在三层架构中的位置
上篇文章所讲的Struts2框架取代的是三层框架中的web层,而Hibernate框架取代的则是dao层,具体描述如下图:


(3)、什么是ORM
ORM(Object Relational Mapping),即对象关系映射,就是利用描述对象和数据库表之间映射的元数据,自动把Java应用程序中的对象,持久化到关系型数据库的表中。通过操作Java对象,就可以完成对数据库表的操作。可以把 ORM 理解为关系型数据和对象的一个纽带,开发人员只需要关注纽带一端映射的对象即可。ORM 实现原理如下图:

(4)、Hibernate框架的优势与功能

  • Hlbernate对JDBC访问数据库的代码做了轻量级封装,大大简化了数据访问层繁琐的重复性代码,并且减少了内存消耗,加快了运行效率。
  • Hlbernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度的简化了DAO (DataAccess Object,数据访问对象)层编码工作。操作数据库的时候,可以以面向对象的方式来完成,不再需要书写SQL语句。
  • Hlbernate的性能非常好,映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。
  • 可扩展性强,由于源代码的开源以及API的开放,当本身功能不够用时,可以自行编码进行扩展。

2、搭建Hibernate框架,完成第一个应用实例

(1)、创建一个web项目,导入所需要的jar包,包括数据库驱动包,如下图所示:


(2)、创建数据库demo_project和表user,建表语句如下:

创建数据库demo_project语句:

  1. create database demo_project;

常见表user语句:

  1. CREATE TABLE `user` (
  2. `id` int(10) NOT NULL,
  3. `name` varchar(50) DEFAULT NULL,
  4. `age` int(3) DEFAULT NULL,
  5. `height` int(11) DEFAULT NULL,
  6. `weight` double(10,0) DEFAULT NULL,
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(3)、创建实体User.java,具体代码如下:

User.java

  1. package com.hibernate.demo;
  2. public class User {
  3. //基本属性
  4. private int id;
  5. private String name;
  6. private int age;
  7. private int height;
  8. private int weight;
  9. //setter和getter方法
  10. public int getId() {
  11. return id;
  12. }
  13. public void setId(int id) {
  14. this.id = id;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public int getAge() {
  23. return age;
  24. }
  25. public void setAge(int age) {
  26. this.age = age;
  27. }
  28. public int getHeight() {
  29. return height;
  30. }
  31. public void setHeight(int height) {
  32. this.height = height;
  33. }
  34. public int getWeight() {
  35. return weight;
  36. }
  37. public void setWeight(int weight) {
  38. this.weight = weight;
  39. }
  40. }

(4)、导入约束,在与实体同一个包下新建ORM配置文件User.hbm.xml,书写ORM元数据,具体配置代码如下:

User.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 package="com.hibernate.domain" >
  7. <class name="User" table="user" >
  8. <id name="id" >
  9. <generator class="native"></generator>
  10. </id>
  11. <property name="name" column="name" ></property>
  12. <property name="age" column="age" ></property>
  13. <property name="height" column="height" ></property>
  14. <property name="weight" column="weight" ></property>
  15. </class>
  16. </hibernate-mapping>

(5)、在src下新建hibernate.cfg.xml主配置文件,具体配置代码如下:

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. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  9. <!-- 数据库url -->
  10. <property name="hibernate.connection.url">jdbc:mysql:///demo_project</property>
  11. <!-- 数据库连接用户名 -->
  12. <property name="hibernate.connection.username">root</property>
  13. <!-- 数据库连接密码 -->
  14. <property name="hibernate.connection.password">root</property>
  15. <!-- 数据库方言-->
  16. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  17. <property name="hibernate.show_sql">true</property>
  18. <property name="hibernate.format_sql">true</property>
  19. <property name="hibernate.hbm2ddl.auto">update</property>
  20. <!-- 引入orm元数据 -->
  21. <mapping resource="com/hibernate/domain/User.hbm.xml" />
  22. </session-factory>
  23. </hibernate-configuration>

(6)、新建测试类TestDemo.java,书写测试代码,具体如下:

TestDemo.java

  1. package com.hibernate.test;
  2. import org.hibernate.Session;
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.Transaction;
  5. import org.hibernate.cfg.Configuration;
  6. import org.junit.Test;
  7. import com.hibernate.domain.User;
  8. //测试Hibernate框架
  9. public class TestDemo {
  10. @Test
  11. //插入信息
  12. public void test(){
  13. Configuration conf = new Configuration().configure();
  14. SessionFactory sessionFactory = conf.buildSessionFactory();
  15. Session session = sessionFactory.openSession();
  16. Transaction tx = session.beginTransaction();
  17. //保存信息
  18. User u = new User();
  19. u.setName("孔乙己");
  20. u.setAge(22);
  21. u.setHeight(172);
  22. u.setWeight(120);
  23. session.save(u);
  24. tx.commit();
  25. session.close();
  26. sessionFactory.close();
  27. }
  28. }

(7)、使用JUnit测试运行,信息插入成功,具体结果如下图:



本项目运行环境:jdk1.7、Tomcat7.0

3、Hibernate配置文件详解

(1)、orm元数据配置详解:

package

  1. <!-- package属性:填写一个包名,在元素内部凡是需要书写完整类名的属性,就可以直接写简答类名 -->
  2. <hibernate-mapping package="com.hibernate.domain" >

class

  1. <!--
  2. class元素: 配置实体与表的对应关系的
  3. name: 完整类名
  4. table:数据库表名
  5. -->
  6. <class name="User" table="user" >

id

  1. <!-- id元素:配置主键映射的属性
  2. name: 填写主键对应属性名
  3. column(可选): 填写表中的主键列名.默认值:列名会默认使用属性名
  4. type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
  5. 每个类型有三种填法: java类型|hibernate类型|数据库类型
  6. not-null(可选):配置该属性(列)是否不能为空. 默认值:false
  7. length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
  8. -->
  9. <id name="id" >
  10. <!-- generator:主键生成策略 -->
  11. <generator class="native"></generator>
  12. </id>

property

  1. <!-- property元素:除id之外的普通属性映射
  2. name: 填写属性名
  3. column(可选): 填写列名
  4. type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
  5. 每个类型有三种填法: java类型|hibernate类型|数据库类型
  6. not-null(可选):配置该属性(列)是否不能为空. 默认值:false
  7. length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
  8. -->
  9. <property name="name" column="name" >
  10. <!-- <column name="cust_name" sql-type="varchar" ></column> -->
  11. </property>
  12. <property name="age" column="age" ></property>
  13. <property name="height" column="height" ></property>
  14. <property name="weight" column="weight" ></property>

(2)、Hibernate主配置文件详解:

必选配置

  1. <!-- 数据库驱动 -->
  2. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  3. <!-- 数据库url -->
  4. <property name="hibernate.connection.url">jdbc:mysql:///demo_project</property>
  5. <!-- 数据库连接用户名 -->
  6. <property name="hibernate.connection.username">root</property>
  7. <!-- 数据库连接密码 -->
  8. <property name="hibernate.connection.password">root</property>
  9. <!-- 数据库方言-->
  10. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

可选配置

  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>

引入orm元数据配置

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

关注微信公众号compassblog,后台回复 “Hibernate系列一” 获取本项目源码

原文链接:https://mp.weixin.qq.com/s?__biz=MzU5MTE0ODcwNQ==&mid=2247483975&idx=1&sn=24f28cdc3399c0d295a5ceb209383e10&chksm=fe322189c945a89f0c2723de0c7c1ef48cbd218e14ed2c8ea0a9c7c4da241737011bc7cf66d7#rd

本系列后期仍会持续更新,欢迎关注!

如果你认为这篇文章有用,欢迎转发分享给你的好友!

本号文章可以任意转载,转载请注明出处!

扫码关注微信公众号,了解更多

【SSH框架】之Hibernate系列一的更多相关文章

  1. SSH框架中hibernate 出现 user is not mapped 问题

    SSH框架中hibernate 出现 user is not mapped 问题      在做SSH框架整合时,在进行DAO操作时.这里就只调用了chekUser()方法.运行时报  user is ...

  2. SSH框架之-hibernate 三种状态的转换

    一.遇到的神奇的事情 使用jpa操作数据库,当我使用findAll()方法查处一个List的对象后,给对这个list的实体进行了一些操作,并没有调用update 或者 saveOrUpdate方法,更 ...

  3. SSH框架之hibernate《四》

    hibernate第四天     一.JPA相关概念         1.1JPA概述             全称是:Java Persistence API.是sun公司推出的一套基于ORM的规范 ...

  4. SSH框架之hibernate《三》

    Hibernate03     一.多表设计         1.1多表设计的总则             问题:我们为什么要学习多表映射?             答:                ...

  5. SSH框架之hibernate《二》

    Hibernate第二天     一.hibernate的持久化类和对象标识符         1.1持久化类的编写规范             1.1.1什么是持久化类:               ...

  6. SSH框架之Hibernate《一》

    hibernate的基础入门 一:hibernate和ORM的概念部分         1.1hibernate概述:             Hibernate框架是当今主流的Java持久层框架之一 ...

  7. SSH框架之Hibernate第四篇

    Hibernate中有两套实现数据库数据操作的方式 : hibernate前3天讲解的都是 : hibernate自己的操作方式(纯XML配置文件的方式) 另一种方式是基于JPA的操作方式(通过注解的 ...

  8. SSH框架之Hibernate第二篇

    1.1 持久化类的编写规则 1.1.1 什么是持久化类? 持久化类 : 与表建立了映射关系的实体类,就可以称之为持久化类. 持久化类 = Java类 + 映射文件. 1.1.2 持久化类的编写规则 ( ...

  9. SSH框架之Hibernate第一篇

    1.2Hibernate的概述: 1.2.1 什么Hibernate? Hibernate(开发源代码的对象关系映射框架)是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它 ...

  10. SSH框架之Hibernate(1)——映射关系

    ORM的实现思想就是将关系数据库中表的数据映射成对象.以对象的形式展现,这样开发者就能够把对数据库的操作转化为对这些对象的操作.Hibernate正是实现了这样的思想,达到了方便开发者以面向对象的思想 ...

随机推荐

  1. Angular 选项卡

    <div ng-init="now=0;" class="nav"> <h4>选项卡</h4> <div > & ...

  2. [国嵌笔记][008-009][远程登录Linux]

    [国嵌笔记][008][远程登录Linux] 1.windows与Linux能够相互ping通 2.关闭Linux防火墙 /etc/init.d/iptables stop 3.通过ssh(字符界面) ...

  3. [学习OpenCV攻略][012][读取、修改、保存图像]

    使用 imread 读取图像,图像路径为 imageName ,图像按BGR格式读取. image = imread( imageName, CV_LOAD_IMAGE_COLOR); 将RGB图像转 ...

  4. [转载]织梦CMS首页调用分类信息栏目及列表方法

    原文地址:织梦CMS首页调用分类信息栏目及列表方法作者:小武哥 不懂代码,搜索学习一晚上,都是说调用特定栏目分类信息列表的,用这个代码 {dede:arclistsg row='10' titlele ...

  5. Yourphp是一款完全开源免费的.核心采用了Thinkphp框架

    Yourphp企业网站管理系统,是一款完全开源免费的PHP+MYSQL系统.核心采用了Thinkphp框架,同时也作为开源软件发布.集众多开源项目于一身的特点,使本系统从安全,效率,易用及可扩展性上更 ...

  6. Python3 的序列

    序列 1.根据列表.元组.字符串的共同点把它们统称为序列(他们都是兄弟呀) 1)都可以通过索引来的到每一个元素 2)默认索引值都是从零开始(Python也支持负数索引) 3)都可以通过分片(切片)的方 ...

  7. Python3基础知识之元组、集合、字典

    1.元组 元组特点元组是不可变的两个元组可以做加法,不能做减法 元组的方法 >>> S('a', 'b', 'c', 'd', 'e')>>> S=('a','b' ...

  8. winform webbrowser如何强制使用ie11内核?

    webkit.net ,cefsharp,openwebkit.net等这些基于谷歌或者基于firfox内核的浏览器有个共同点,就是必须指定winform为x86的才能使用, 而且使用过程中也是各种坑 ...

  9. AF_INET 和PF_INET区别;AF_LOCAL PF_LOCAL 区别.

    从字面理解: AF_INET = Address Format, Internet = IP Addresses PF_INET = Packet Format, Internet = IP, TCP ...

  10. RocketMQ-quickstart(批量消费问题)

    基本概念: Producer:消息生产者,负责生产消息,一般由业务系统负责生产消息. Consumer:消息消费者,负责消费消息,一般是后台系统负责异步消费. Push Consumer:Consum ...