一 Hibernate入门
Hibernate环境搭建
Hibernate的API
Hibernate的CRUD
EE三层结构:
- web层
- 业务逻辑层
- 持久层 jdbc,DBUTils,Hibernate
Hibernate简介:
一个开源的对象关系映射框架,对JDBC进行了轻量级封装,将pojo与数据库表建立映射关系,是一个全自动的ORM(Object Relation Mapping,对象关系映射,通过操作对象操作表)框架,可以自动生成sql语句,自动执行。
可以根据映射自动建表
HIbernate配置
Hibernate Configuration:Customer.hbm.xml
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
必须配置:
- 连接数据库的基本参数:
- 驱动类
- 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的核心API:
Configuration类:
Hibernate的配置对象,以及对它进行启动。定位映射文档,读取配置,创建SessionFactory对象。
作用:加载核心配置文件,加载映射文件
SessionFactory接口:
负责初始化Hibernate,创建Session对象,用到了工厂模式。
作用:内部维护了Hibernate连接池和Hibernate的二级缓存(不讲,一般用Redis替换)。线程安全的,一个项目创建一个对象就可以。
配置成c3p0连接池(了解):
抽取工具类:
工具类测试:
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入门的更多相关文章
- 三大框架之hibernate入门
hibernate入门 1.orm hibernate是一个经典的开源的orm[数据访问中间件]框架 ORM( Object Relation Mapping)对象关 ...
- Hibernate入门案例及增删改查
一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...
- Hibernate入门案例 增删改
一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...
- Hibernate入门6.Hibernate检索方式
Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...
- Hibernate入门5持久化对象关系和批量处理技术
Hibernate入门5持久化对象关系和批量处理技术 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hiberna ...
- Hibernate入门4.核心技能
Hibernate入门4.核心技能 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hibernate3的基本知识, ...
- Hibernate入门3.配置映射文件深入
Hibernate入门3.配置映射文件深入 2013.11.27 前言: 之前的两节是在Java项目中如何使用hibernate,并且通过一个简单地项目实践,期间有很多的错误,一般都是因为配置包的问题 ...
- 简单的Hibernate入门简介
其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了很多非Hibernate的东西, ...
- Hibernate入门(1)-第一个Hibernate程序
Hibernate入门(1)-第一个Hibernate程序 Hibernate是最著名的ORM工具之一,本系列文章主要学习Hibernate的用法,不涉及Hibernate的原理.本文介绍第一个Hib ...
- hibernate入门之person表
下面的hibernate入门person表指的是:根据mysql数据库中的test表和其中的元素-->建立映射表==>进而创建持久化类的顺序来操作了,下面为步骤 1.配置MySQL驱动程序 ...
随机推荐
- C++ STL之集合set的使⽤
写在最前面,本文摘录于柳生笔记: set是集合,一个set里面个元素各不相同的,而且set会按照元素从小到大的进行排序,一下是set的常用方法:
- RTT学习之SPI设备
SPI分为主.从.设备:具体又分标准SPI/DUAL SPI/QUAD SPI(用80字节的RAMrt_err_t rt_spi_take_bus(struct rt_spi_device *devi ...
- ThinkPHP6源码:从Http类的实例化看依赖注入是如何实现的
ThinkPHP 6 从原先的 App 类中分离出 Http 类,负责应用的初始化和调度等功能,而 App 类则专注于容器的管理,符合单一职责原则. 以下源码分析,我们可以从 App,Http 类的实 ...
- mac 终端连接服务器报错
今天在连接虚拟机服务器时突然报了一个 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!的错误.  会出现这个错误的原因是在第一次进行SSH连接时,会生 ...
- 七 Spring的分模块开发的配置,保存客户案例
Spring的分模块开发的配置 加载配置文件的时候,加载多个 在一个配置文件中引入多个配置文件(常用) 保存客户案例 applicationContext.xml: <?xml version= ...
- 二十一 Struts的数据校验两种方式:手动编码和xml校验
数据的校验: 一.前台校验:JS校验 JS的校验不是必须的,JS可以被绕行,可以提升用户体验 二.后台校验:编码校验 必须的校验 三.校验的方式: 手动编码(不建议使用) 配置文件(支持) 手动编码的 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 网格系统实例:偏移列
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- C# Stream篇(—) -- Stream基类-----转载
C# Stream篇(—) -- Stream基类 写在前头: Stream系列文章共收录7篇,本着备忘和归纳的目的本着备忘和归纳的目的,全部收录于本分类中. 下面是有原文连接,望各位看官还是到原作者 ...
- Windows远程“要求的函数不受支持”解决办法
解决方法: 开启组策略中远程桌面链接安全层.1.开始-运行-gpedit.msc,进入组策略编辑器:2.找到左侧边栏计算机配置-管理模板-Windows组件-远程桌面服务-远程桌面会话主机-安全项:3 ...
- 【转】ERP系统测试方法
问题: 1.如何进行ERP系统测试用例设计? 2.ERP系统测试用例设计过程? 3.ERP系统测试用例设计的方法? ERP系统本身是一种业务流程很复杂,单据报表众多,逻辑性很强的系统,质量保证方 ...