一、Hibernate了解

    Hibernate框架是Java持久层的框架,是Gavin King发明的,2001年发布的,JBoss公司的产品,2003年进入市场。

    Hibernate是基于对象来操作数据库的,但他最终还是被转换为SQL去进行操作

    Hibernate对JDBC进行封装,简化数据库访问操作,采用ORM(Object Relation Mapping,对象关系映射)技术的持久层框架,自动实现表记录和实体对象之间的映射。

    Hibernate与JDBC的区别:

      Hibernate与JDBC都应用在持久层上,但Hibernate轻量级封装JDBC

      Hibernate是自动的,不需要手写SQL语句的,它自动生成SQL语句,是面向对象的;

      Mybatis是半自动的;

      JDBC是手动的(需手写代码与数据库建立连接,获取对象,写SQL语句,执行SQL语句,返回结果,关闭连接),是面向过程的。

      

    Hibernate体系结构:

      1.框架工具包和驱动包

      2.hibernate.cfg.xml

      3.主配置文件,用于定义数据库连接参数

      4.实体类(以entity为例)

      5.映射描述文件entity.hbm.xml(这一步可以用注解代替)

      6.定义类和表对应关系,属性和字段对应关系

      

二、Hibernate框架搭建(想要以下内容涉及的资源包的网友评论留言私聊,我百度网盘分享)

    1.加载12个Hibernate包

      dom4j-1.6.jar

      geronimo-jta_1.2_spec-1.0-alpha-1.jar

      hibernate-commons-annotations-4.0.5.Final.jar

      hibernate-core-5.0.11.specid.jar

      hibernate-jpa-2.1-api-1.0.2.Final.jar

      javassist-3.18.0-ga-sources.jar

      jboss-logging-3.3.0.Final.jar

      mysql-connector-java-5.1.46.jar

      slf4j-api-2.0.0-alpha1.jar

      slf4j-jdk14-1.7.7.jar

      slf4j-log4j12-1.7.5.jar

      antlr-2.7.6.jar

      将上述12个工具包放到web项目文件夹下的WebRoot/WEB-INF/lib/下

    2.Hibernate两个配置文件(这一步也可以自己建xml文件配置参数,因为我之前建过,所以直接导入两个配置文件)

      配置XML文件步骤:windows->preferences->XML->XML Catelog->add->location(找到dtd的位置)->key对应配置文件键值->OK

      (1)*.hbm.xml         映射文件    建议放在entity/包下

      (2)hibernate.cfg.xml     主配置文件   建议放在src/下

      第一步:配置hibernate.cfg.xml文件(数据库连接信息,JDBC驱动,数据库dialect方言等)

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory>
<!--hibernate 方言 区分身份 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 数据库连接信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/hibernatetest</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property> <!-- hibernate自动生成表 --> <!-- hibernate在控制台显示SQL语句 -->
<property name="show_sql">true</property>
<!-- hibernate格式化SQL,控制台看起来更整齐 -->
<property name="format_sql">true</property>
<!-- 设置自动提交 -->
<property name="connection.autocommit">true</property> <!-- <property name="connection.characterEncoding">UTF-8</property> -->
<!--加载hibernate映射 -->
<mapping resource="com/hibernatetest/entity/User.hbm.xml" /> </session-factory> </hibernate-configuration>

      第二步:配置*hbm.xml文件

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- name:对应的实体类的权限定名称,table:对应数据库表名称 -->
<class name="com.hibernatetest.entity.User" table="hibernateUser">
<!-- id标签用于配置主键属性
name:对应实体类中属性名称
type:可以省略,如果省略默认实体类中属性的对应类型
-->
<id name="uid" type="java.lang.Integer">
<!-- column用于设置对应数据库表中字段名
name:数据库表中的字段名
length:设置字段长度
-->
<column name="u_id" length="32"></column>
<!-- generator用于设置主键生成策略 -->
<generator class="native"></generator>
</id> <!-- property标签用于配置其他属性
name:对应实体类中属性名称
type:可以省略,如果省略默认实体类中属性的对应类型
-->
<property name="uname" column="u_name">
<!-- column用于设置对应数据库表中字段名
name:数据库表中的字段名
length:设置字段长度
-->
<column name="u_name" ></column>
</property> </class>
</hibernate-mapping>

三.使用Hibernate框架操作数据库(Hibernate有五大核心接口一个核心类)

    Configuration:从hibernate.cfg.xml文件中加载主配置信息(数据库url,用户名,密码,jdbc驱动,数据库Dialect方言,数据库连接池,hibernate映射文件等)

    SessionFactory:用于创建Session对象工厂,它可通过configuration创建得到,保存了数据库的配置信息和所有的映射关系

    Session:用于执行数据库增删改查基本操作

    Query和Criteria接口:用于负责执行各种数据的查询,它可以使用HQL语言或SQL语句两种表达方式

    Transaction:用于事务控制(默认事务不自动提交)

    Hibernate框架运行原理:

      1.首先通过configuration去加载hibernate.cfg.xml这个配置文件

      2.根据配置文件的信息去创建SessionFactory,SessionFactory是线程安全的,是一个session工厂

      3.用SessionFactory来创建session,session不是线程安全的,通过session进行数据库的各种操作

      4.在进行增删查改操作的时候通过Session打开Transaction进行事务的控制

 public static void main(String[] args) {
//1.加载主配置文件
Configuration configuration = new Configuration().configure();//此处读取默认名称“hibernate.cfg.xml”,想要读取指定名称,需.configure("xxx.xml"); //2.建造Session工厂
SessionFactory sessionfactory = configuration.buildSessionFactory(); //3.获取Session,这个对象中提供了一套增删改查的方法
Session sess = sessionfactory.openSession(); //4.查询获取对象
User user = sess.get(User.class, 1);//在数据库数据表中获取id为1的记录
System.out.println(user);
//5.释放session
sess.close();
}

四、Session常用接口演示及Hibernate框架使用步骤

    第一步:编写hibernate工具类

 package HibernatenateUtils;

 import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class hibernateUtils {
public static Session getSession(){
//1.加载主配置文件
Configuration configuration = new Configuration().configure(); //2.建造Session工厂
SessionFactory sessfactory = configuration.buildSessionFactory(); //3.获取Session,这个对象中提供了一套增删改查的方法
Session session = sessfactory.openSession(); return session;
}
}

    第二步:编写实体类

 package com.hibernatetest.entity;

 public class User {
private Integer uid;
private String uname;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(Integer uid, String uname) {
super();
this.uid = uid;
this.uname = uname;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((uid == null) ? 0 : uid.hashCode());
result = prime * result + ((uname == null) ? 0 : uname.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (uid == null) {
if (other.uid != null)
return false;
} else if (!uid.equals(other.uid))
return false;
if (uname == null) {
if (other.uname != null)
return false;
} else if (!uname.equals(other.uname))
return false;
return true;
}
@Override
public String toString() {
return "User [uid=" + uid + ", uname=" + uname + "]";
} }

    第三步:进行数据库操作(此处只对Session相关常用操作进行注释)

package com.hibernatetest.test;
import java.io.Serializable;
import org.hibernate.Session;
import com.hibernatetest.entity.User;
import HibernatenateUtils.hibernateUtils; public class SessionTest {
public static void main(String[] args) {
Session session = hibernateUtils.getSession(); //4.数据库操作
/*save() 添加
*Update() 修改
*saveOrUpdate() 添加或修改
*createQuery() 创建Query查询对象
*delete() 删除
*get() 根据id查询,获取对象(立即加载,不管有没有访问对象,都会生成对应的SQL语句并执行)
*load() 根据id查询,获取对象(延迟加载,只有当访问对象的时候,才生成对应的SQL语句并执行)
*flush() 清理session缓存,在事务提交和session关闭时都会自动执行flush()
*beginTransaction()开启事务
* */
//(4 - 1)save添加操作
User user1 = new User(null,"lisi");
Serializable save = session.save(user1);//将对象添加到数据库中作为表的一条记录,返回的是一个主键值
//注意:此处我hibernate.cfg.xml设置的事务自动提交为true
// 事务自动提交默认为false,可在hibernate.cfg.xml中修改,
// 也可通过session.beginTracsation()开启事务和session2.getTransaction().commit();//提交事务
// 如果事务自动提交为false,此时数据并未同步到数据库中
// 如果事务自动提交为true,此时数据便已经同步到数据库中
System.out.println(save); //(4 - 2)Update修改操作
session.beginTransaction();//开启事务
User user2 = session.get(User.class, 5);//先从数据库中取出数据
user2.setUname("zhangsan");//再修改数据,此处不能修改设置了主键自增长的id.
session.update(user2);//最后再把数据放回去
session.getTransaction().commit();//提交事务 //(4 - 3)delete删除操作
//注意:使用delete操作必须保证删除对象在数据库中,如果数据库中没有则会报错:
//Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1;
session.beginTransaction();//开启事务
User user3 = new User(null,null);
user3.setUid(21);
session.delete(user3);
session.flush();
session.getTransaction().commit();//提交事务 //(4 - 4)saveOrUpdate删除操作:如果对象中主键不为null(并且这个主键的值在数据库中存在)做修改操作,如果为null做添加操作
//注意:如果对象中的主键在数据库中不存在,会报错:
//Error during managed flush [Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1]
session.beginTransaction();//开启事务
User user4 = new User(17,"zhangsan");
session.saveOrUpdate(user4);
User user5 = new User(null,"zhangsan");
session.saveOrUpdate(user5);
session.getTransaction().commit();//提交事务 //5.释放Session
session.close();//如果事务自动提交为false,此时session缓存中的数据会自动同步到数据库中,之后会自动调用flush清空缓存。
}
}

  

21-Java-Hibernate框架(一)的更多相关文章

  1. Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis

    https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=6 ...

  2. java三大框架之一hibernate使用入门

    综述:Hibernate的作用就是让实体类与数据库映射,使数据持久化,用于替代JDBC,使我们不致于写那么多sql语句代码. 1. 首先在官网www.hibernate.org下载hibernate包 ...

  3. Java最重要的21个技术点和知识点之JAVA集合框架、异常类、IO

    (三)Java最重要的21个技术点和知识点之JAVA集合框架.异常类.IO  写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享 ...

  4. Java ssh 框架 hibernate 详细理解

    Hibernate框架技术相信对大多数的 java 程序员并不陌生,数据表之间的关系如何通过Hibernate来建立,需要我们认真的分析数据表中数据项之间的交互: 数据库表的之间的关系有: (1)一对 ...

  5. JAVA框架之Hibernate框架的学习步骤

    首先介绍一下Java三大框架的关系 以CRM项目即客户关系管理项目示例 hibernate框架的学习路线: 1.学习框架入门,自己搭建框架,完成增删改查的操作 2.学习一级缓存,事物管理和基本查询 3 ...

  6. 轻量级Java持久化框架,Hibernate完美助手,Minidao 1.6.2版本发布

    Minidao 1.6.2 版本发布,轻量级Java持久化框架(Hibernate完美助手) Minidao产生初衷? 采用Hibernate的J2EE项目都有一个痛病,针对复杂业务SQL,hiber ...

  7. 深入浅出学习hibernate框架(三):java的反射机制

    上篇博客写到了JDBC的基本操作,今天准备写一篇关于JAVA反射机制的文章,因为java的反射机制和上一篇JDBC都是Hibernate框架的基本要素.在Hibernate的运行机制中,这两块的内容正 ...

  8. (转)Hibernate框架基础——Java对象持久化概述

    http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构  说明 ...

  9. java三大框架——Struts + Hibernate + Spring

    Struts主要负责表示层的显示 Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作) Hibernate主要是数据持久化到数据库 再用jsp的servlet做网页开发的时候有个 w ...

  10. java:Hibernate框架1(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态,增删查改)

    1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件  准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cf ...

随机推荐

  1. POJ 1182食物链(分集合以及加权两种解法) 种类并查集的经典

    题目链接:http://icpc.njust.edu.cn/Problem/Pku/1182/ 题意:给出动物之间的关系,有几种询问方式,问是真话还是假话. 定义三种偏移关系: x->y 偏移量 ...

  2. 升级 nop 4.1 Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.

    Incorrect syntax near 'OFFSET'.  Invalid usage of the option NEXT in the FETCH statement. nop.web 项目 ...

  3. Redis总结--【持续更新】

    # 什么是Redis? Redis 是完全开源免费的,是一个高性能的key-value内存数据库,读的速度是110000次/s,写的速度是81000次/s     它有以下三个特点:   Redis不 ...

  4. 学习Angular1

    教程: 参考教程: https://www.runoob.com/angularjs/angularjs-tutorial.html 一.angular的简介AngularJS 是一个 JavaScr ...

  5. [POJ1835]宇航员<模拟>

    链接:http://poj.org/problem?id=1835 题干太长我就不放描述了. 一道大模拟 看着就脑壳疼. 难点可能在于方向的确认上 要明确当前的头朝向和脸朝向,才能进行处理 一个小小坑 ...

  6. [codevs1049]棋盘染色<迭代深搜>

    题目链接:http://codevs.cn/problem/1049/ 昨天的测试题里没有打出那可爱的迭代深搜,所以今天就来练一练. 这道题其实我看着有点懵,拿着题我就这状态↓ 然后我偷偷瞄了一眼hz ...

  7. Material Design 组件之 AppBarLayout

    AppBarLayout 是一个垂直方向的 LinearLayout,它实现了许多符合 Material Design 设计规范的状态栏应该具有的功能,比如滚动手势. AppBarLayout 一般直 ...

  8. Sql练习201908210951

    表结构: create table SalePlan ( PlanId ,) primary key, GoodsId int, PlanPrice decimal(,) ); go create t ...

  9. ES6 class 类的理解(一)

    优点 ES6 的类提供了几点明显的好处: 兼容当前大量的代码. 相对于构造器和构造器继承,类使初学者更容易入门. 子类化在语言层面支持. 可以子类化内置的构造器. 不再需要继承库:框架之间的代码变得更 ...

  10. M - 湫湫系列故事——减肥记I

    M - 湫湫系列故事--减肥记I 对于吃货来说,过年最幸福的事就是吃了,没有之一! 但是对于女生来说,卡路里(热量)是天敌啊! 资深美女湫湫深谙"胖来如山倒,胖去如抽丝"的道理,所 ...