一、Hibernate简介

1、Hibernate在开发中所处的位置

2、ORM映射

Object :面向对象领域的

Relational:关系数据库领域的

Mapping:映射

Object: Relational

public class Person{ create table presons(

  private String name; name varchar(100),

  private int age; age int

  // getter and setter

} );

new Person("test",25); sert into presons(name,age)values("test",25);

Hibernate:就是让程序员通过操作对象的方式来操作数据库中的表。

二、搭建开发环境

1、下载Hibernate的资源包

前往官网下载:http://hibernate.org/

2、准备Hibernate运行的必备jar包

前提准备:数据库的驱动jar包

hibernate的必须jar包

3、建立hibernate配置文件,配置数据源信息

在classpath下,建立一个默认名称为hibernate.cfg.xml配置文件

 <?xml version="1.0" encoding="UTF-8"?>
<!-- 搭建hibernate的开发环境:
前期准备:
导入必要的jar包。
1、在类的根路径下,创建一个hibernate.cfg.xml的配置文件。该配置文件是Hibernate的主配置文件。
2、导入dtd约束
约束的位置:hibernate的核心jar包中 hibernate-configuration-3.0.dtd
-->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- 配置session工厂创建时所必须的条件。
分为3部分
数据库连接的基本信息
hibernate配置的基本信息
映射信息
session-factory:session的工厂,作用就是生产session对象的。
session:它就相当于我们jdbc中的connection,作用就是对数据库进行增删改查操作。
-->
<session-factory>
<!-- 1、数据库连接的基本信息 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/ee0413_hibernate_day31</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- 配置数据库方言 -->
<!-- 2、hibernate的基本配置-->
<property name="hibernate.show_sql">true</property><!-- 显示SQL语句 -->
<property name="hibernate.format_sql">true</property><!-- 格式化SQL语句 -->
<!-- 采用何种方式生产DDL语句
#hibernate.hbm2ddl.auto create-drop 创建表结构,每次执行完都删除。
#hibernate.hbm2ddl.auto create 创建表结构,每次执行都重新创建
#hibernate.hbm2ddl.auto update 创建表结构在第一此执行,之后的每次执行都检查表结构是否有变化,有变化就更新(学习阶段使用此值)
#hibernate.hbm2ddl.auto validate 验证表结构是否有变化,有变化就改变
隐藏选项:none 什么都不做。
DDL是数据定义语言:在hibernate中,它不能创建库。必须由我们自己先创建数据库。
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 3、指定映射文件 -->
<mapping resource="cn/itcast/domain/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>

三、Hibernate中的常用接口和类

1、Configuration

作用:加载Hibernate的配置文件

1.1、另外一种配置方式

在classpath中建立一个hibernate.properties的配置文件。(不推荐使用)

1.2、自由指定映射文件:

1.3、自由指定加载的实体类:

2、SessionFactory(重点)

由Configuration通过加载配置文件创建该对象。

SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存

预定义SQL语句:(注意如果有多个映射文件,每个映射文件都会有这4条预定义SQL语句)

select * from students where id=? //根据主键查询

insert into students (name,age,birthday) values(?,?,?); //全字段插入

update students set name=?,age=?,birthday=? where id=? //根据主键全字段更新

delete from students where id=? //根据主键删除

一个SessionFactory实例对应一个数据库,应用从该对象中获得Session实例。

SessionFactory是线程安全的,意味着它的一个实例可以被应用的多个线程共享。

SessionFactory是重量级的,意味着不能随意创建或销毁它的实例。如果只访问一个数据库,只需要创建一个SessionFactory实例,且在应用初始化的时候完成。

SessionFactory需要一个较大的缓存,用来存放预定义的SQL语句及实体的映射信息。

另外可以配置一个缓存插件,这个插件被称之为Hibernate的二级缓存(后续会详解二级缓存),被多线程所共享

结论:一般应用使用一个SessionFactory,最好是应用启动时就完成初始化。

3、Session 非常重要。使用率非常高

不是线程安全的。应避免多个线程使用同一个Session实例。

Session是轻量级的,它的创建和销毁不会消耗太多的资源。应为每次客户请求分配独立的Session实例

Session有一个缓存,被称之为Hibernate的一级缓存。每个Session实例都有自己的缓存。

4、Transaction:事务管理

Hibernate应用通过它声明事务边界,有助于在不同的环境或容器中进行移植。

开启事务:Transaction tx = session.beginTransaction();//开启事务

tx.commit()事务提交 tx.rollback()事务回滚

 /*
* hibernate的步骤分析
* 1、加载配置文件(hibernate的主配置文件)
* 2、根据配置文件,构建session工厂
* 3、 使用Session工厂生产一个Session对象
* 4、开启事务
* 5、执行操作(现在就先保存一个学生到数据库)
* 6、提交事务
* 7、释放资源
*/
@Test
public void test1(){
Student student = new Student();
student.setName("泰斯特2");
student.setGender("male");
student.setBirthday(new Date()); //
Configuration cfg = new Configuration();
cfg.configure();
//手动指定实体
//cfg.addClass(Student.class);
//cfg.addResource("cn/itcast/domain/Student.hbm.xml");
//
SessionFactory factory = cfg.buildSessionFactory();
//3。此Session和HttpSession没有任何关系
Session session = factory.openSession();//打开一个新的Session
//
Transaction tx = session.beginTransaction();
//
session.save(student);
//
tx.commit();
//
session.close();
factory.close();
} /**
* Configuration:
* 作用:就是用于加载配置文件。它默认只会加载类的根路径下的配置文件。
* 常用方法:
* 默认构造函数:它默认只会加载类的根路径下的hibernate.properties配置文件。不会加载xml文件。
* configure:该方法会加载类的根路径下的hibernate.cfg.xml配置文件。
* addClass:手动指定实体类的字节码。目的也是指定映射文件。要求,映射文件的命名必须符合规范。实体类名称.hbm.xml
* addResource:手动指定映射文件的位置。
* 总结:
* 建议使用配置文件来指定映射文件的位置。
*
* SessionFactory:
* 作用:就是用于生产Session对象的。工厂的创建,是由Configuration对象来创建的。
* 常用的方法:
* openSession():每次打开一个新的Session对象。
* 说明:
* 1、该对象维护着应用中所有的映射文件信息。
* 2、它还维护类一些预定义的SQL语句。(只包含每个实体都通用的:全字段插入,全字段更新,根据ID查询,查询所有)
* 3、维护着连接数据库的信息,hibernate的基本配置
* 4、还维护着hibernate的二级缓存(关于二级缓存的内容,第四天再讲)
* 5、所有由该工厂生产的Session,共享工厂中的数据。结论:SessionFactory是线程安全的。
* SessionFactory的使用原则:
* SessionFactorty是一个重量级对象,里面维护了很多信息。不应该随意的创建和销毁。一个应用最好只有一个SessionFactory。
* 在web工程中,应该是随着应用的加载,而创建。随着应用的卸载而销毁。
*
* Session:
* 作用:对数据库进行增删改查的操作。开启事务等等。它是我们使用频率最高的一个对象。
* 常用方法:
* a lot of
* save:保存一个实体到数据库中
* 说明:
* 1、Session是一个轻量级的对象。绝大多数信息都是由SessionFactory维护的。
* 2、它的创建和销毁不会消耗太多资源。
* 3、Session对象不是线程安全的。*****
* 4、Session维护着hibernate的一级缓存。
* Session的使用原则:
* 保证一个线程只有一个Session。
* Transaction:
* 作用:针对事务的控制。
* 常用方法:
* commit();提交事务
* rollback();回滚事务
*
*/ /*
* 升级hibernate的基本操作
*/
@Test
public void test2(){
Student student = new Student();
student.setName("泰斯特3");
student.setGender("male");
student.setBirthday(new Date()); //1、使用HibernateUtil获取一个Session
Session session = HibernateUtil.getSession();
//
Transaction tx = session.beginTransaction();
//
session.save(student);
//
tx.commit();
//
session.close();
}

5、释放资源

(隐藏问题:hibernate把所有异常都变成了运行时异常)

抽取工具类:

 public class HibernateUtil {

     private static SessionFactory factory;

     /*
* 给factory赋值
*
* 异常是有的,只不过hibernate把异常全都转成了运行时异常
*/
static{//静态代码块:在类加载的时候就已经执行了
try {
Configuration cfg = new Configuration();
cfg.configure();
factory = cfg.buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
throw new ExceptionInInitializerError("创建SessionFactory失败!");
}
} //提供一个获取Session的方法
public static Session getSession(){
return factory.openSession();
}
}

6、Hibernate模板

 public void test(){
Student student = new Student();
student.setName("泰斯特");
student.setGender("male");
student.setBirthday(new Date()); Session session = null;
Transaction tx = null;
try{
//1、使用HibernateUtil获取一个Session
session = HibernateUtil.getSession();
//
tx = session.beginTransaction();
//
session.save(student);
//
tx.commit();
}catch(Exception e){
tx.rollback();
throw new RuntimeException(e);
}finally{
//
session.close();
}
}

四、CRUD操作

 public class HibernateDemo {

     //查询所有学生信息
@Test
public void testFindAll(){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//1.需要使用Session获取到一个查询对象
/*
* createQuery中的参数是一个字符串。
* 它是Hibernate的查询语句。HQL。不是SQL语句。
* HQL : hibernate query language
* 写法都是和类名以及类中的属性名称(set/get方法)
*/
Query query = session.createQuery("from Student ");
List<Student> list = query.list();
tx.commit();
session.close();
System.out.println(list);
} //删除学生信息
@Test
public void testDelete(){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Student s = session.get(Student.class, 1);
session.delete(s);
tx.commit();
session.close();
} //更新学生信息
@Test
public void testUpdate(){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Student s = session.get(Student.class, 1);
s.setGender("female");
session.update(s);
tx.commit();
session.close(); } //根据id查询一个学生信息
@Test
public void testFindOne(){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
/*
* get方法:根据id查询一个实体对象。
* 参数1:实体对象的字节码
* 参数2:查询条件的id
*/
Student s = session.get(Student.class, 1);
System.out.println(s);
tx.commit();
session.close();
} //添加
@Test
public void testAdd(){
Student student = new Student();
student.setName("泰斯特");
student.setGender("male");
student.setBirthday(new Date()); Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
session.save(student);
tx.commit();
session.close();
} }

Java实战之02Hibernate-01简介、常用接口、CRUD操作的更多相关文章

  1. Java单体应用 - Markdown - 01.简介

    原文地址:http://www.work100.net/training/monolithic-markdown.html 更多教程:光束云 - 免费课程 简介 序号 文内章节 视频 1 概述 2 特 ...

  2. 「小程序JAVA实战」小程序的微信api菜单操作(67)

    转自:https://idig8.com/2018/09/25/xiaochengxujavashizhanxiaochengxudeweixinapicaidancaozuo66/ 菜单按钮的介绍, ...

  3. [C#]获取连接MySql数据库及常用的CRUD操作

    测试如下: 首先添加引用:MySql.Data.dll 链接:http://pan.baidu.com/s/1dEQgLpf 密码:bnyu *将链接数据库的信息放入配置文件中(app.config) ...

  4. Elasticsearch技术解析与实战(二)文档的CRUD操作

    启动Elasticsearch和kibana 访问Elasticsearch:http://localhost:9200/?pretty 访问kibana:http://localhost:5601 ...

  5. JDBC 学习笔记(三)—— JDBC 常用接口和类,JDBC 编程步骤

    1. JDBC 常用接口和类 DriverManager 负责管理 JDBC 驱动的服务类,程序中主要的功能是获取连接数据库的 Connection 对象. Connection 代表一个数据库连接对 ...

  6. Java程序员的现代RPC指南(Windows版预编译好的Protoc支持C++,Java,Python三种最常用的语言,Thrift则支持几乎主流的各种语言)

    Java程序员的现代RPC指南 1.前言 1.1 RPC框架简介 最早接触RPC还是初学Java时,直接用Socket API传东西好麻烦.于是发现了JDK直接支持的RMI,然后就用得不亦乐乎,各种大 ...

  7. Java企业实训 - 01 - Java前奏

    前言: 虽然个人专攻.NET方向,不过由于个人是干教育行业的,方方面面的东西,不能说都必须精通,但肯定多少都会涉及到. 一个菜鸟学员,从啥都不会,经过一步步学习,最后到企业上手掌管一个模块甚至一个项目 ...

  8. 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING

    <Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th  2014 Email:skyseraph00@163.com 更多精彩请直接 ...

  9. [java] 注释以及javadoc使用简介-汇率换算器的实现-插曲3

    [java] 注释以及javadoc使用简介-汇率换算器的实现-插曲3 // */ // ]]>   [java] 注释以及javadoc使用简介-汇率换算器的实现-插曲3 Table of C ...

随机推荐

  1. weekend110(Hadoop)的 第一天笔记

    (2015年1月10日) 课程目录 01-hadoop职位需求状况 02-hadoop课程安排 03-hadoop应用场景 04-hadoop对海量数据处理的解决思路 05-hadoop版本选择和伪分 ...

  2. iOS的UILabel设置居上对齐,居中对齐,居下对齐

    在iOS中默认的UILabel中的文字在竖直方向上只能居中对齐,博主参考国外网站,从UILabel继承了一个新类,实现了居上对齐,居中对齐,居下对齐.具体如下: // //  myUILabel.h ...

  3. oc学习之路----通过代码自定义cell

    需求背景:由于tableView中每一个cell的数据与布局都不一样,故不能用xib实现功能,这是用代码写自定义cell就有必要了. 步骤 1.新建一个继承自UITableViewCell的类 2.重 ...

  4. 性能优化-列表类型转换(ConvertList<TSource, TResult>)

    之前,在项目中看到过一段通用列表类型转换的代码,直接的实现便是用反射.大概看了下,它用在领域模型转DTO和SOA接口中契约实体的转换等等.首先,它使用了反射,其次,还是在循环中使用,便有了优化的想法. ...

  5. error C2589: “(”: “::”右边的非法标记 error C2059: 语法错误 : “::

    1. 错误输出 ./zlibrary/ui/src/win32/w32widgets/W32VBorderBox.cpp(114) : error C2589: “(”: “::”右边的非法标记    ...

  6. Spring 3.0 注解注入详解

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  7. Cocos2d-x 3.0- 在Visual Studio 2012中执行測试项目

    Cocos2d-x - 怎样在Win32执行cpp-tests 2014年4月30日 星期三 小雨 微凉 稍显疲惫 注:本篇文章来自Cocos2d-x官网,小巫仅仅是粗略翻译眼下最新版本号的,教大家怎 ...

  8. 正尝试在 OS 载入程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内执行托管代码,这样做会导致应用程序挂起。

    出错提示: 正尝试在 OS 载入程序锁内执行托管代码. 不要尝试在 DllMain 或映像初始化函数内执行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中添加了42种非常强大的调试助 ...

  9. android开发Proguard混淆与反射

    http://charles-tanchao.diandian.com/post/2012-05-24/20118715 由于前面开发数据操作类,所以利用反射,封装了一个BaseDao,本来在平常的时 ...

  10. java 5 Lock

    import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public clas ...