Hibernate学习笔记(二)

1.Hibernate.cfg.xml常用配置
  hibernate.show_sql   是否把Hibernate运行时的sql语句输出到控制台,值true、false
  hibernate.format_sql 输出到控制台的sql语句是否格式化,值true、false
  hbm2ddl.auto   sql语句生成策略,值create、update、create-dorp、validate
  hibernate.default_schema 默认的数据库
  hibernate.dialect 配置数据库方言,可以优化sql语句。

2.Session对象简介

类似于jdbc的Connection,但Hibernate不建议使用Connection连接数据库。下图是Hibernate执行流程:

Session和Connection是多对一的关系,一个连接可以有多个会话。session常用方法有sava(),update(),delete(),createQuery(),

3.事务Transaction

Hibernate对数据库的操作都是封装在transaction中,并且默认都是费自动提交的。保存数据必须提交事务。可以通过session.doWork()设置自动提交,但并不推荐这么做!

@Test
    public void testSaveStudent(){
        Students s=new Students(1,"张三丰","男",new Date(),"武当山");
        session.doWork(new Work(){

            @Override
            public void execute(Connection connection) throws SQLException {
                connection.setAutoCommit(true);
            }

        });
        session.save(s);
        session.flush();//一定要有刷新会话的操作,sql才会立即执行
    }

4.Session详解

获取session的两种方法:

这张图中需要强调的是使用getCurrentSession()必须在Hibernate.cfg.xml中进行配置参数!

getCurrentSession()和openSession()的区别

1)getCurrentSession()在事务提交或回滚后都会自动关闭,而openSession()需要手动关闭,如果多次不关闭会造成数据库连接池溢出。

试验方法:testOpenSession()、testGetCurrentSession()

2)getCurrentSession()是得到现有的Session,openSession()每次创建新的Session。

试验方法:testSavaStudentWithOpenSession()、testSavaStudentWithGetCurrentSession()。见如下代码:

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.jdbc.Work;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;

public class SessionTest {
    @Test
    public void testOpenSession() {
        // 获取参数配置对象
        Configuration config = new Configuration().configure();
        // 获取服务注册对象
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
                .applySettings(config.getProperties()).buildServiceRegistry();
        // 得到SessionFactory对象
        SessionFactory sessionFactory = config
                .buildSessionFactory(serviceRegistry);
        // session对象创建
        Session session = sessionFactory.openSession();
        Session session2 = sessionFactory.openSession();
        if (session == session2)
            System.out.println("这是同一个session对象");
        else
            System.out.println("这是不同的session对象");
        if (session != null) {
            System.out.println("session创建成功!");
        } else {
            System.out.println("session创建失败!");
        }
    }

    @Test
    public void testGetCurrentSession() {
        Configuration config = new Configuration().configure();
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
                .applySettings(config.getProperties()).buildServiceRegistry();
        SessionFactory sessionFactory = config
                .buildSessionFactory(serviceRegistry);
        Session session = sessionFactory.getCurrentSession();
        Session session2 = sessionFactory.getCurrentSession();
        System.out.println(session == session2);
        if (session != null) {
            System.out.println("session创建成功!");
        } else {
            System.out.println("session创建失败!");
        }
    }

    @Test
    public void testSavaStudentWithOpenSession() {
        Configuration config = new Configuration().configure();
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
                .applySettings(config.getProperties()).buildServiceRegistry();
        SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
        Session session1=sessionFactory.openSession();
        Transaction transaction=session1.beginTransaction();
        Students s=new Students(1,"张三丰","男",new Date(),"武当山");
        session1.doWork(new Work(){

            @Override
            public void execute(Connection connection) throws SQLException {
                System.out.println("connection hashcode:"+connection.hashCode());
            }

        });
        session1.save(s);
        transaction.commit();

        Session session2=sessionFactory.openSession();
        transaction=session2.beginTransaction();
        s=new Students(2,"孙中山","男",new Date(),"香港");
        session2.doWork(new Work(){

            @Override
            public void execute(Connection connection) throws SQLException {
                System.out.println("connection hashcode:"+connection.hashCode());
            }

        });
        session2.save(s);
        transaction.commit();
    }
    @Test
    public void testSavaStudentWithGetCurrentSession() {
        Configuration config = new Configuration().configure();
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
                .applySettings(config.getProperties()).buildServiceRegistry();
        SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
        Session session1=sessionFactory.getCurrentSession();
        Transaction transaction=session1.beginTransaction();
        Students s=new Students(1,"张三丰","男",new Date(),"武当山");
        session1.doWork(new Work(){

            @Override
            public void execute(Connection connection) throws SQLException {
                System.out.println("connection hashcode:"+connection.hashCode());
            }

        });
        session1.save(s);
        transaction.commit();

        Session session2=sessionFactory.getCurrentSession();
        transaction=session2.beginTransaction();
        s=new Students(2,"孙中山","男",new Date(),"香港");
        session2.doWork(new Work(){

            @Override
            public void execute(Connection connection) throws SQLException {
                System.out.println("connection hashcode:"+connection.hashCode());
            }

        });
        session2.save(s);
        transaction.commit();
    }
}

5.类配置文件hbm.xml常用配置:此地址

http://www.imooc.com/video/7718

时间: 2024-10-01 07:29:39

Hibernate学习笔记(二)的相关文章

Hibernate学习笔记(二) — 探索 hibernate 中对象的状态

一.hibernate中对象的状态有三种: 临时.游离和持久化,三种状态转化的方法都是通过session来调用的 什么是持久化? 通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存) 二.三种状态的相互转换 session方法 session.save():该方法可以把一个对象从临时装填转换成持久化状态 session.get():从数据库中根据主键提取出一个对象,该对象就是一个持久化状态的对象 session.update():把一

《Hibernate学习笔记十二》学生、课程、分数关系的设计与实现

<Hibernate学习笔记十二>学生.课程.分数关系的设计与实现 这个马士兵老师的Hibernate视频学习的一个题目,这里面要用到多对多.多对一的关联关系以及联合主键,因此觉得挺好的,自己写篇博文来记录下. 先考虑数据库表 1.学生表:为简单起见,只考虑了学生id和学生姓名,其中id为主键 2.课程表:为简单起见,只考虑了课程id和课程名称,其中id为主键 3.分数表 分数表有两种解决方案 3.1 第一种为:使用联合主键:student_id 和 course_id 3.2 第二种:不使用

hibernate学习笔记之二(初识hibernate)

(hibernate学习笔记系列来自于 "疯狂Java" 视频学习) Hibernate概述 免费开源Java包,可以使程序和数据库的交互变得容易,并更加符合面向对象的设计. 持久化:将数据保存到数据库中 hibernate持久化类步骤 环境搭建 导入jar包,在hibernate包里的\lib\required文件夹里 导入mysql的JDBC驱动 将上述包添加到路径里面 编写持久化类 要求: 在持久化类中一般需要一个id,通常用Integer类型,这样之后操作会使用null,而不是

Spring Batch学习笔记二

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自定义的工作单元,它是Job的主要构件块:每一个Step由三部分组成:ItemReader.ItemProcessor.ItemWriter:这三个部分将执行在每一条被处理的记录上,ItemReader读取每一条记录,然后传递给ItemProcessor处理,最后交给ItemWriter做持久化:It

Cookie学习笔记二:Cookie实例

今天说说刚刚学到的两个Cookie的最经典应用:自动登录和购物车设置 一:自动登录 需要两个页面:login.jsp与index.jsp,login.jsp用来输出登录信息,index.jsp处理登录信息:如果有Cookie,则自动登录,否则创建输入信息的对象的Cookie,下次登录可以直接登录,但是我们在这里给Cookie设置一个最大保存时间30s,即登录30s后会自动退回到登陆页面,具体代码如下: login.jsp: <%@ page language="java" con

Hibernate学习笔记(3)

两年前曾经学习过Hibernate,也通过博客将Hibernate的学习过程记录下来了,地址如下: Hibernate学习笔记(1) Hibernate学习笔记(2) 最近在复习Hibernate,在重新学习的过程中,有了一些新的体会和收获,现在将其总结成博客,供以后作为参考资料使用. 一.导入相应的jar包 目前Hibernate更新到了4.x版本,在官网下载后,找到lib文件加中的required文件夹,此外还需要额外导入log4j和数据库驱动包. 二.创建Hibernate配置文件 在sr

Hibernate学习笔记(1)Hibernate配置

一 准备工作 首先我们将创建一个简单的基于控制台的(console-based)Hibernate应用程序. 我们所做的第一件事就是创建我们的开发目录,并且把所有需要用到的Java库文件放进去.解压缩从Hibernate网站下载的Hibernate发布包,并把所有需要的库文件拷到我们项目中去. 学习建User-library-hibernate,并加入相应的jar包 (a)项目右键-buildpath-configure build path-add library (b)选择User-libr

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

《Hibernate学习笔记十一》:树状结构设计

<Hibernate学习笔记十一>:树状结构设计 这是马士兵老师讲解Hibernate的一个作业题,树状结构设计,这是一个比较典型的例子,因此有必要写篇博文记录下. 树状结构的设计,它是在同一个类中使用了多对一(ManyToOne)和一对多(OneToMany). 在完成这个题目我们应该按照如下的步骤进行: 1.先思考数据库的模型应该是什么样的?? 数据库中的模型应该如下:即存在id p_id 2.思考面向对象的模型,及如何来进行映射??? 根据数据库中表的特点,对象应该有id name;由于