一、什么是hibernate

  1、 hibernate是开源的轻量级框架,应用在javaee三层结构中 dao层框架,使用orm思想对数据库进行crud操作

  2 、在dao层里面做对数据库crud操作,使用hibernate实现crud操作,hibernate底层代码就是jdbc,hibernate对jdbc进行封装,使用hibernate好处,不需要写复杂jdbc代码了,不需要写sql语句实现

二、什么是orm思想

  orm:object relational mapping,对象关系映射

文字描述:

(1)让实体类和数据库表进行一一对应关系

让实体类首先和数据库表对应

让实体类属性 和 表里面字段对应

(2)不需要直接操作数据库表,而操作表对应实体类对象

图解:

三、hibernate环境搭建

  1、导jar包

   

  2、创建实体类

     注意: 使用hibernate时候,不需要自己手动创建表,hibernate帮忙创建表

public class User {
/*hibernate 要求实体类有一个属性唯一的*/
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
} }

  3、配置实体类和数据库表的映射关系

    使用配置文件实现映射关系

    (1)创建xml格式的配置文件

      - 映射配置文件名称和位置没有固定要求

      - 建议:在实体类所在包里面创建,实体类名称.hbm.xml

    (2)在配置文件中首先引入xml约束

      

      

    (3)配置文件步骤:

          1、配置类和表对应:class标签

           2、配置实体类id和表id对应:id标签

          3、设置数据库表id的增长策略:generator标签

          4、配置其他属性和表字段对应:property标签

<?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>
<!--1、配置类和表对应:class标签
name属性:实体类全路径
table属性:数据库表名称
-->
<class name="cn.user.User" table=" t_user">
<!--2、配置实体类id和表id对应:id标签
hibernate要求实体类有一个属性唯一值
hibernate要求表有字段作为唯一值
-->
<!-- id标签
name属性:实体类里面id属性名称
column属性:生成的表字段名称
-->
<id name="id" column="id">
<!-- 3、设置数据库表id的增长策略:generator标签
native:生成表id值就是主键自动增长
-->
<generator class="native" ></generator>
</id>
<!-- 4、配置其他属性和表字段对应:property标签
name属性:实体类属性名称
column属性:生成表字段名称
-->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
</class> </hibernate-mapping>

  4、配置hibernate核心配置文件

    (1)核心配置文件格式xml,但是核心配置文件名称和位置固定的

      - 位置:必须src下面

      - 名称:必须hibernate.cfg.xml

    (2)引入dtd约束

      

      

    (3)配置详细步骤: 

        注意:hibernate操作过程中,只会加载核心配置文件,其他配置文件不会加载

        1、配置数据库信息 必须的配置

        2、配置hibernate信息 可选的配置

         3、把映射文件放到核心配置文件中 必须的配置

<?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>
<!-- 1、配置数据库信息,必须配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 配置hibernate信息 可选配置 -->
<!--输出底层sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 输出底层sql语句格式 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate帮创建表,需要配置之后
update:如果已经有表,更新,如果没有,创建
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置数据库方言
在mysql里面实现分页 使用关键字 limit(mysql特有的)只能在mysql里面使用
在oracle数据库中,实现分页使用rownum
在hibernate框架识别不同的数据库的自己有特定的语句
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 3、把映射文件放到核心配置文件中 必须配置 -->
<mapping resource="cn/user/user.hbm.xml"/>
</session-factory> </hibernate-configuration>

四、测试:实现添加操作

    步骤:

      1、加载核心配置文件(固定格式)

      2、创建SessionFactory对象(固定格式)

      3、使用SessionFactory对象创建session对象(固定格式)

      4、开启事物(固定格式)

      5、写具体逻辑crud操作(自己写操作逻辑)

      6、提交事物(固定格式)

      7、关闭资源(固定格式)

public class HibernateDome {
@Test
public void add(){
//第一步加载核心配置文件
//到src下面找到名称是hibernate.cfg.xml,并封装成对象
Configuration cfg = new Configuration();
cfg.configure(); //第二步:创建SessionFactory对象
//读取核心配置文件内容,创建sessionFactory
//在这个过程中,根据映射关系,在配置数据库里面把表创建
SessionFactory sessionFactory = cfg.buildSessionFactory(); //第三步:使用sessionFactory创建session对象
//类似于连接
Session session = sessionFactory.openSession(); //第四步:开启事物
Transaction tx = session.beginTransaction(); //第五步:写具体逻辑
//添加数据
User user = new User();
user.setUsername("张三");
user.setPassword("123");
//调用session的方法实现添加
session.save(user); //第六步:提交事物
tx.commit(); //第七步:关闭资源
session.close();
sessionFactory.close();
}

五、核心API

  1、Configuration

   代码:

       

   作用:到src下面找到名称hibernate.cfg.xml配置文件,创建对象,把配置文件放到对象里面(加载核心配置文件)

  2、SessionFactory

    1 创建sessionfactory过程中做事情:

      - 根据核心配置文件中,有数据库配置,有映射文件部分,到数据库里面根据映射关系把表创建

    2 创建sessionFactory过程中,这个过程特别耗资源的

      建议:在hibernate操作中,建议一个项目一般创建一个sessionFactory对象

    3 具体实现

      1 写工具类,写静态代码块实现

          静态代码块在类加载时候执行,执行一次

public class HibernateUtils {

         static Configuration cfg = null;
static SessionFactory sessionFactory = null;
//静态代码块实现
static {
//加载核心配置文件
cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
} //提供方法返回sessionFactory
public static SessionFactory getSessionFactory() {
return sessionFactory;
} }

优化后的代码

public class HibernateDome {
@Test
public void add(){
//第一步加载核心配置文件
//到src下面找到名称是hibernate.cfg.xml,并封装成对象
//Configuration cfg = new Configuration();
//cfg.configure(); //第二步:创建SessionFactory对象
//读取核心配置文件内容,创建sessionFactory
//在这个过程中,根据映射关系,在配置数据库里面把表创建
//SessionFactory sessionFactory = cfg.buildSessionFactory(); SessionFactory sessionFactory =HibernateUtils.getSessionFactory(); //第三步:使用sessionFactory创建session对象
//类似于连接
Session session = sessionFactory.openSession(); //第四步:开启事物
Transaction tx = session.beginTransaction(); //第五步:写具体逻辑
//添加数据
User user = new User();
user.setUsername("李四");
user.setPassword("312");
//调用session的方法实现添加
session.save(user); //第六步:提交事物
tx.commit(); //第七步:关闭资源
session.close();
sessionFactory.close();
} }

  3、Session

     1 session类似于jdbc中connection

    2 调用session里面不同的方法实现crud操作

      (1)添加 save方法

@Test
public void testSave() {
//1 调用工具类得到sessionFactory
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
//2 获取session
Session session = sessionFactory.openSession();
//3 开启事务
Transaction tx = session.beginTransaction();
//4 添加数据
User u = new User();
u.setUsername("jack");
u.setPassword("124"); //保存数据
session.save(u);
//5 提交事务
tx.commit();
//6 关闭
session.close();
sessionFactory.close();
}
}

      (2)修改 update方法

@Test
public void testUpdate() {
//1 调用工具类得到sessionFactory
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
//2 获取session
Session session = sessionFactory.openSession();
//3 开启事务
Transaction tx = session.beginTransaction(); //4 修改操作
// 修改id=2记录username值
//4.1 根据id查询
User user = session.get(User.class, 2);
//4.2 向返回的user对象里面设置修改之后的值
user.setUsername("岳不群");
//4.3 调用session的方法update修改
//执行过程:到user对象里面找到uid值,根据uid进行修改
session.update(user); //5 提交事务
tx.commit();
//6 关闭
session.close();
sessionFactory.close();
}

      (3)删除 delete方法

public void testDelete() {
//1 调用工具类得到sessionFactory
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
//2 获取session
Session session = sessionFactory.openSession();
//3 开启事务
Transaction tx = session.beginTransaction(); //4 删除操作
//第一种 根据id查询对象
User user = session.get(User.class, 2);
session.delete(user); //第二种
// User user = new User();
// user.setUid(3); // session.delete(user); //5 提交事务
tx.commit();
//6 关闭
session.close();
sessionFactory.close();
}

      (4)根据id查询 get方法

@Test
public void testGet() {
//1 调用工具类得到sessionFactory
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
//2 获取session
Session session = sessionFactory.openSession();
//3 开启事务
Transaction tx = session.beginTransaction();
//4 根据id查询
//调用session里面的get方法
//第一个参数:实体类的class
//第二个参数:id值
User user = session.get(User.class, 1); System.out.println(user);
//5 提交事务
tx.commit();
//6 关闭
session.close();
sessionFactory.close();
}
}

或者:

public class HibernateDemo {

    @Test
public void testSaveOrUpdate() {
//1 调用工具类得到sessionFactory
SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
//2 获取session
Session session = sessionFactory.openSession();
//3 开启事务
Transaction tx = session.beginTransaction(); User user = new User();
user.setId(1);
user.setUsername("mary");
user.setPassword("250"); session.save(user); //把uid=1的记录username修改
User user = new User();
user.setId(1);
user.setUsername("tom"); session.update(user); //1 添加操作
User user = new User();
user.setUsername("jack");
user.setPassword("520"); User user = new User();
user.setId(6);
user.setUsername("rose");
user.setPassword("1314"); User user = session.get(User.class, 7);
user.setUsername("lilei"); //实体类对象状态是持久态,做修改
session.saveOrUpdate(user); //5 提交事务
tx.commit();
//6 关闭
session.close();
sessionFactory.close();
}

     3 session对象单线程对象

        session对象不能共用,只能自己使用

  4 、Transaction:事物对象

    1 开启事物

      

    2、事物提交和回滚

      

六、最终优化后的crud代码

  

public class HibernateDome {
@Test
public void add(){
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try{
//1、调用工具类得到sessionFactory
sessionFactory = HibernateUtils.getSessionFactory();
//2、获取session
session = sessionFactory.openSession();
//3、开启事务
tx = session.beginTransaction();
//4、写具体逻辑
//添加数据
User user = new User();
user.setUsername("王4");
user.setPassword("333");
//调用session的方法实现添加
session.save(user); //5、提交事物
tx.commit();
}catch(Exception e){
e.printStackTrace();
//6、事物回滚
tx.rollback();
}finally{
//7、关闭操作,释放资源
session.close();
sessionFactory.close();
} }
}

Hibernate(1)的更多相关文章

  1. Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解

    在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基 ...

  2. Hibernate(四)基本映射

    映射的概念 在上次的博文Hibernate(三)Hibernate 配置文件我们已经讲解了一下 Hibernate中的两种配置文件,其中提到了两种配置文件的主要区别就是XML可以配置映射.这里提到的映 ...

  3. Hibernate(三)Hibernate 配置文件

    在上次的博文Hibernate(二)Hibernate实例我们已经通过一个实例的演示对Hibernate 的基本使用有了一个简单的认识,这里我们在此简单回顾一下Hibernate框架的使用步骤. Hi ...

  4. Hibernate(二)Hibernate 实例

    上篇Hibernate(一)JDBC简介,我们主要对JDBC进行了简单介绍和使用说明,这次我们做一个Hibernate简单实例,通过这个实例对比Hibernate和JDBC,了解Hibernate的优 ...

  5. 学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化

    准备工作 在上篇博客中学习ORM框架—hibernate(一):初识hibernate,通过简单的实例说明O和R的映射过程.本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernat ...

  6. Hibernate(四):Hello World

    下载hibernate开发包: 在本章之前需要继承hibernate开发插件到eclipse,详细操作请参考我的博文:<Hibernate(一):安装hibernate插件到eclipse环境& ...

  7. 一口一口吃掉Hibernate(五)——一对多单向关联映射

    版权声明:本文为博主原创文章,未经博主允许不得转载.如需转载请声明:[转自 http://blog.csdn.net/xiaoxian8023 ] 在上一篇博客<一口一口吃掉Hibernate( ...

  8. Hibernate——(2)增删改查

    案例名称:Hibernate完成增删改查 案例描述:抽取出工具类并完成删除.修改.查询功能. 具体过程: 1.使用上面的例子(Hibernate--(1)Hibernate入门http://blog. ...

  9. Hibernate(二)——一对多查询

    1. 前言 本章节我们讨论Hibernate一对多查询的处理. 在上一章节中(Hibernate(一)——入门),我们探讨了Hibernate执行最基本的增删改查操作.现在我们将情况复杂化:加入我们在 ...

  10. Hibernate(6)—— 一对多 和 多对多关联关系映射(xml和注解)总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XM ...

随机推荐

  1. Java基础—String总结

    特点 String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. String实 ...

  2. 剑指offer 面试49题

    面试49题: 题:丑数 题目:把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N ...

  3. maven 项目打包时无法解析读取properties文件

    在做项目时遇见一个问题,无法解析properties文件的 内容 异常为 Could not resolve placeholder ......... 在此之前均有做相关的 配置 但是从未出现过如上 ...

  4. Linux下运行java项目

    最近初步接触了linux,感觉很有新鲜感.之前在windows下干过的事情也便想到在linux环境下实现一下.正好手头在编java,就想既然java可以在windows的DOS操作下运行,是不是也可以 ...

  5. Java底层代码实现单文件读取和写入(解决中文乱码问题)

    需求: 将"E:/data/车站一次/阿坝藏族羌族自治州.csv"文件中的内容读取,写入到"E:/data//车站一次.csv". 代码: public cla ...

  6. 《Effective MySQL之SQL语句最优化》读书笔记——乱七八糟系列(给自己看)

    该书区别于诸如<MySQL技术内幕——InnoDB存储引擎>等书的一大特色是该书主要讲的是MySQL数据库中的索引技术,并分别讲了InnoDB.MyISAM.Memory三个存储引擎.其中 ...

  7. 【leetcode刷题笔记】Excel Sheet Column Number

    Related to question Excel Sheet Column Title Given a column title as appear in an Excel sheet, retur ...

  8. Java 中的会话管理—— HttpServlet,Cookies,URL Rewriting(转)

    索引 1.什么是 Session? 2.Java 中的会话管理—— Cookie 3.Java Servlet 中的 Session —— HttpSession 理解 JSESSIONID Cook ...

  9. css transform常用变化解析

    本文旨在对常用变化做最直观的简析 translate 移动 translateX() X轴正方向移动(单位可为px,也可为%,为%时以自身为参照物) translateY() Y轴反方向移动 tran ...

  10. 《网络对抗》 逆向及Bof基础实践

    <网络对抗>-逆向及Bof基础实践 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数, ...