一 Hibernate入门

时间:2022-09-01 14:57:51
  • Hibernate环境搭建

  • Hibernate的API

  • Hibernate的CRUD

EE三层结构:

  • web层
  • 业务逻辑层
  • 持久层         jdbc,DBUTils,Hibernate

Hibernate简介:

一个开源的对象关系映射框架,对JDBC进行了轻量级封装,将pojo与数据库表建立映射关系,是一个全自动的ORM(Object Relation  Mapping,对象关系映射,通过操作对象操作表)框架,可以自动生成sql语句,自动执行。

可以根据映射自动建表

HIbernate配置

Hibernate Configuration:Customer.hbm.xml

一  Hibernate入门

一  Hibernate入门

class标签:建立类与表的映射关系

属性:

  • name: 类的全路径
  • table:表名(类名和表名一致,table可省略)
  • catalog:数据库名,可不填

id标签:建立类中的属性和表中主键对应关系

  • name:类中属性
  • column:表中字段(类中属性和表中字段一致,可省略该项)
  • length:长度
  • type:类型

property标签:普通属性和表中字段对应关系

  • name:类中属性
  • column:表中字段
  • length:长度
  • type:类型
  • not-null:设置非空
  • unique:设置唯一,默认false

Hibernate核心配置:

  • 属性文件的方式  hibernate.properties(手动编写代码加载映射文件)
  • xml文件的方式    hibernate.cfg.xml

一  Hibernate入门

必须配置:

  • 连接数据库的基本参数:
    • 驱动类
    • url
    • 用户名
    • 密码
  • 方言

可选配置:

  • 显示sql:<property name="hibernate.show_sql">true</property>
  • 格式化sql:<property name="hibernate.format_sql">true</property>
  • 自动建表:<property name="hibernate.hbm2ddl.auto">update</property>
      • none:不使用Hibernate的自动建表 
      • create:如果数据库已经有表,会删除原有表重新闯进啊
      • create-drop:删除原有表创建新表,使用完后删除表。
      • update:使用原来的表,在原来的表的上更新数据。如果没有表,创建新表(更新表结构)。  
      • validate: 如果没有表,不会创建表。只会用数据库中原有表(校验数据库表结构,自带校验功能)
  • 映射文件的引入:<mapping resource="com/Hidemo1/Customer.hbm.xml"/>

编写测试类:

一  Hibernate入门

Hibernate的核心API:

Configuration类:

Hibernate的配置对象,以及对它进行启动。定位映射文档,读取配置,创建SessionFactory对象。

作用:加载核心配置文件,加载映射文件

SessionFactory接口:

负责初始化Hibernate,创建Session对象,用到了工厂模式。

作用:内部维护了Hibernate连接池和Hibernate的二级缓存(不讲,一般用Redis替换)。线程安全的,一个项目创建一个对象就可以。

配置成c3p0连接池(了解):

抽取工具类:

一  Hibernate入门

工具类测试:

一  Hibernate入门

Hibernate的核心对象:Session

类似连接对象Connection,负责执行被持久化对象的CRUD操作,是与数据库交互的桥梁。

由于是非线程安全对象,所以不能定义成全局的,需要定义在方法内部,否则有线程安全问题。

Session中的API:

保存:Serializable save(obj)

查询:T get(Class c ,Serializable id)  ,  T load(Class c ,Serializable id)

      • get采用的是立即加载,执行到这一行代码的时候就马上发送sql语句查询。
      • get查询后返回的是对象本身。
      • get查询找不到对象返回空
      • load采用的是延迟加载(懒加载),执行到这行代码的时候,不会发送sql语句,当使用到这个对象的时候才会发送sql语句.
      • load返回的是代理对象(非java动态代理,而是javasist技术产生的代理对象)
      • load查询找不到对象返回ObjectNotFoundException

修改: void update(obj)

//直接创建对象进行修改,没有被set的属性会被置为null,不推荐

//先查询再修改(推荐方式)

删除:void delete(obj)

//直接创建对象进行删除

//先查询再删除(推荐方式,Hibernate下面有个级联删除,前提 是先查询再删除)

保存或更新:void saveOrUpdate(obj)

查询所有:

//接收HQL,Hibernate Query Language 面向对象的查询语言
Query query = session.createQuery("from Customer");

//接收sql
SQLQuery query2 = session.createSQLQuery("select * from cst_customer");

代码:

package com.Hidemo1;

import java.util.Arrays;
import java.util.List; import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; import com.HiUtils.HibernateUtils;
/**
* Hibernate入门
*
*/
public class HibernateDemo1 { @Test
//保存客户的需求
public void demo1(){
//1 加载核心配置文件
Configuration configuration = new Configuration().configure();
//2 创建一个SessionFactory对象,相当于JDBC连接池
SessionFactory sessionFactory = configuration.buildSessionFactory();
//3 通过SessionFactory获取到Session对象:类似于JDBC重Connection
Session session = sessionFactory.openSession();
//4 手动开启事务
Transaction transaction = session.beginTransaction();
//5 编写代码
Customer customer = new Customer();
customer.setCust_name("王可可");
session.save(customer);
//6 事务提交
transaction.commit();
//7资源释放
session.close();
} @Test
/*
*Hibernate工具类测试
*/
public void demo2(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_name("工具类测试");
session.save(customer);
tx.commit();
session.close();
} @Test
/*
* 查询操作
*/
public void demo3(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//使用get方法
// Customer customer = session.get(Customer.class, 1l);
//使用load方法查询
Customer customer = session.load(Customer.class, 1l);
System.out.println(customer); transaction.commit();
session.close();
}
@Test
/*
* 修改操作
*/
public void demo4(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//直接创建对象进行修改,没有被set的属性会被置为null,不推荐
/*Customer customer = new Customer();
customer.setCust_id(1l);
customer.setCust_name("wangkeke");
session.update(customer);*/
//先查询再修改(推荐方式)
Customer customer = session.get(Customer.class, 1l);
customer.setCust_name("王改改");
session.update(customer);
transaction.commit();
session.close();
}
@Test
/*
* 删除操作
*/
public void demo5(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//直接创建对象进行删除,不推荐
/* Customer customer = new Customer();
customer.setCust_id(1l);
session.delete(customer);*/
//先查询再删除(推荐方式)
Customer customer = session.get(Customer.class, 2l);
session.delete(customer);
transaction.commit();
session.close();
}
@Test
/*
* 保存或者更新
*/
public void demo6(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction(); Customer customer = new Customer();
customer.setCust_id(3l);
customer.setCust_name("王改改");
session.saveOrUpdate(customer);
transaction.commit();
session.close();
}
@Test
/*
* 查询所有
*/
public void demo7(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//接收HQL,Hibernate Query Language 面向对象的查询语言
Query query = session.createQuery("from Customer");
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
//接收sql
SQLQuery query2 = session.createSQLQuery("select * from cst_customer");
List<Object[]> list2 = query2.list();
for (Object[] objects : list2) {
System.out.println(Arrays.toString(objects));
}
transaction.commit();
session.close();
}
}

Transaction对象:

Hibernate中管理事务的对象。

commit()

rollback()

一 Hibernate入门的更多相关文章

  1. 三大框架之hibernate入门

    hibernate入门   1.orm      hibernate是一个经典的开源的orm[数据访问中间件]框架           ORM( Object Relation Mapping)对象关 ...

  2. Hibernate入门案例及增删改查

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...

  3. Hibernate入门案例 增删改

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...

  4. Hibernate入门6&period;Hibernate检索方式

    Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...

  5. Hibernate入门5持久化对象关系和批量处理技术

    Hibernate入门5持久化对象关系和批量处理技术 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hiberna ...

  6. Hibernate入门4&period;核心技能

    Hibernate入门4.核心技能 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hibernate3的基本知识, ...

  7. Hibernate入门3&period;配置映射文件深入

    Hibernate入门3.配置映射文件深入 2013.11.27 前言: 之前的两节是在Java项目中如何使用hibernate,并且通过一个简单地项目实践,期间有很多的错误,一般都是因为配置包的问题 ...

  8. 简单的Hibernate入门简介

    其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了很多非Hibernate的东西, ...

  9. Hibernate入门(1)-第一个Hibernate程序

    Hibernate入门(1)-第一个Hibernate程序 Hibernate是最著名的ORM工具之一,本系列文章主要学习Hibernate的用法,不涉及Hibernate的原理.本文介绍第一个Hib ...

  10. hibernate入门之person表

    下面的hibernate入门person表指的是:根据mysql数据库中的test表和其中的元素-->建立映射表==>进而创建持久化类的顺序来操作了,下面为步骤 1.配置MySQL驱动程序 ...

随机推荐

  1. Android studio 项目的layout的文件打开,preview 视图无法显示,提示&OpenCurlyDoubleQuote;no sdk found&period;&period;&period;”可能原因?

    1.安装android studio后启动,引导新的下载的sdk文件夹,不要默认在c:\users\你的用户名\appdata...下的sdk文件夹. 2.如果已经默认的,重新在settings/pr ...

  2. SQL查询数据库是否存在

    在实际工作中会遇到通过SQL查询数据库是否存在的情况,下面一些语句可以提供一些帮助,本文的语句是在SQL08R2中测试的 1,查询当前数据库服务器所有数据库 select *  From master ...

  3. android知乎小圆圈刷新效果

    前几天看到包括知乎在内的很多应用都使用到了一种小圆圈划动刷新的效果,仔细查了一下,原来是android v7包里面最新的刷新效果.使用起来也是十分简单的. 首先先建立一个activity,在布局文件里 ...

  4. Java 正则提取数字串

    例如:有一个字符串:"数量最低2000份",将其中的2000数字提取出来. String arg0 = "数量最低2000份"; Pattern p = Pat ...

  5. Qt学习经验之quit&lpar;&rpar;、exit&lpar;&rpar;、close&lpar;&rpar;《转载》

       使用QT编辑界面,其中带来很大方便的一点就是Qt中自带丰富的.种类齐全的类及其功能函数,程序员可以在编辑程序的过程中简单地直接调用.关于窗口关闭的操作,在这里指出常用的三个槽,即quit(),e ...

  6. 微信跳转之WAP跳转微信公众号关注页面链接weixin&colon;&sol;&sol;dl&sol;business&sol;&quest;ticket&equals;

    本文整理了部分微信 URL Schemes,经过本人测试,所有url在微信 6.3.22 版本下都可正常工作.大家可以在 Safari 中打开链接进行尝试.(部分链接仅允许在微信内部浏览器中打开,已用 ...

  7. c&sol;c&plus;&plus; 多线程 unique&lowbar;lock的使用

    多线程 unique_lock的使用 unique_lock的特点: 1,灵活.可以在创建unique_lock的实例时,不锁,然后手动调用lock_a.lock()函数,或者std::lock(lo ...

  8. int 和 Integer

    现状1+1=?,不加思索2.有一个数字要存储在程序里,不加思索int.那为什么java要弄一个Integer类型出来?有什么用?怎么用?差别在哪儿?度娘说java提供了两种数据类型,一种是值类型,一种 ...

  9. Golang -- Signal处理

    我们在生产环境下运行的系统要求优雅退出,即程序接收退出通知后,会有机会先执行一段清理代码,将收尾工作做完后再真正退出.我们采用系统Signal来 通知系统退出,即kill pragram-pid.我们 ...

  10. Django之认证系统

    Django之认证系统 cookie和session 1.cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞 ...