最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Hibernate框架基础

来源:动视网 责编:小采 时间:2020-11-09 16:30:25
文档

Hibernate框架基础

Hibernate框架基础:ORM概念 O, Object 对象R, Realtion 关系 (关系型数据库: MySQL, Oracle…)M,Mapping 映射ORM, 对象关系映射!ORM, 解决什么问题? 存储: 能否把对象的数据直接保存到数据库? 获取: 能否直接从数据库拿到一个对象?想做到上面2点,必须要有映射!总结:
推荐度:
导读Hibernate框架基础:ORM概念 O, Object 对象R, Realtion 关系 (关系型数据库: MySQL, Oracle…)M,Mapping 映射ORM, 对象关系映射!ORM, 解决什么问题? 存储: 能否把对象的数据直接保存到数据库? 获取: 能否直接从数据库拿到一个对象?想做到上面2点,必须要有映射!总结:


ORM概念 O, Object 对象R, Realtion 关系 (关系型数据库: MySQL, Oracle…)M,Mapping 映射ORM, 对象关系映射!ORM, 解决什么问题? 存储: 能否把对象的数据直接保存到数据库? 获取: 能否直接从数据库拿到一个对象?想做到上面2点,必须要有映射!总结:

ORM概念

O, Object 对象
R, Realtion 关系 (关系型数据库: MySQL, Oracle…)
M,Mapping 映射

ORM, 对象关系映射!

ORM, 解决什么问题?
 存储: 能否把对象的数据直接保存到数据库? 
获取: 能否直接从数据库拿到一个对象?
想做到上面2点,必须要有映射!


总结:
 Hibernate与ORM的关系?
 Hibernate是ORM的实现!

Hibernate 案例

搭建一个Hibernate环境,开发步骤:
1. 下载源码
 版本:hibernate-distribution-3.6.0.Final
2. 引入jar文件
 hibernate3.jar核心 + required 必须引入的(6个) + jpa 目录 + 数据库驱动包
3. 写对象以及对象的映射
 Employee.java 对象
 Employee.hbm.xml 对象的映射 (映射文件)
4. src/hibernate.cfg.xml 主配置文件
 数据库连接配置
 加载所用的映射(*.hbm.xml)
5. App.java 测试

对象 Employee.java

//一、 对象
public class Employee {

 private int empId;
 private String empName;
 private Date workDate;

}

对象的映射 Employee.hbm.xml






 

 
 
 
 

 
 
 

 


主配置文件 hibernate.cfg.xml




 
 
 com.mysql.jdbc.Driver
 jdbc:mysql:///hib_demo
 root
 root
 org.hibernate.dialect.MySQL5Dialect

 true

 
 
 

测试类 App.java


public class App {

 @Test
 public void testHello() throws Exception {
 // 对象
 Employee emp = new Employee();
 emp.setEmpName("班长");
 emp.setWorkDate(new Date());

 // 获取加载配置文件的管理类对象
 Configuration config = new Configuration();
 config.configure(); // 默认加载src/hibenrate.cfg.xml文件
 // 创建session的工厂对象
 SessionFactory sf = config.buildSessionFactory();
 // 创建session (代表一个会话,与数据库连接的会话)
 Session session = sf.openSession();
 // 开启事务
 Transaction tx = session.beginTransaction();
 //保存-数据库
 session.save(emp);
 // 提交事务
 tx.commit();
 // 关闭
 session.close();
 sf.close();
 }
}

Hibernate Api

|-- Configuration 配置管理类对象
 config.configure(); 加载主配置文件的方法(hibernate.cfg.xml)
 默认加载src/hibernate.cfg.xml
 config.configure(“cn/config/hibernate.cfg.xml”); 
 加载指定路径下指定名称的主配置文件
 config.buildSessionFactory(); 创建session的工厂对象

|-- SessionFactory session的工厂(或者说代表了这个hibernate.cfg.xml配置文件)
 sf.openSession(); 创建一个sesison对象
 sf.getCurrentSession(); 创建session或取出session对象

|--Session session对象维护了一个连接(Connection), 代表了与数据库连接的会话。
 Hibernate最重要的对象: 只用使用hibernate与数据库操作,都用到这个对象
 session.beginTransaction(); 开启一个事务; hibernate要求所有的与数据库的操作必须有事务的环境,否则报错!

 更新:
 session.save(obj); 保存一个对象
 session.update(emp); 更新一个对象
 session.saveOrUpdate(emp); 保存或者更新的方法:
 没有设置主键,执行保存;
 有设置主键,执行更新操作; 
 如果设置主键不存在报错!

 主键查询:
 session.get(Employee.class, 1); 主键查询
 session.load(Employee.class, 1); 主键查询 (支持懒加载)

 HQL查询:
 HQL查询与SQL查询区别:
 SQL: (结构化查询语句)查询的是表以及字段; 不区分大小写。
 HQL: hibernate query language 即hibernate提供的面向对象的查询语言
 查询的是对象以及对象的属性。
 区分大小写。

 Criteria查询:
 完全面向对象的查询。

 本地SQL查询:
 复杂的查询,就要使用原生态的sql查询,也可以,就是本地sql查询的支持!
 (缺点: 不能跨数据库平台!)

|-- Transaction hibernate事务对象


共性问题1:
ClassNotFoundException…., 缺少jar文件!
共性问题2:
 如果程序执行程序,hibernate也有生成sql语句,但数据没有结果影响。
 问题一般是事务忘记提交…….
遇到问题,一定看错误提示!

Hibernate crud


public class EmployeeDaoImpl implements IEmployeeDao{

 @Override
 public Employee findById(Serializable id) {
 Session session = null;
 Transaction tx = null;
 try {
 // 获取Session
 session = HibernateUtils.getSession();
 // 开启事务
 tx = session.beginTransaction();
 // 主键查询
 return (Employee) session.get(Employee.class, id);
 } catch (Exception e) {
 throw new RuntimeException(e);
 } finally {
 tx.commit();
 session.close();
 }
 }

 @Override
 public List getAll() {
 Session session = null;
 Transaction tx = null;
 try {
 session = HibernateUtils.getSession();
 tx = session.beginTransaction();
 // HQL查询
 Query q = session.createQuery("from Employee");
 return q.list();
 } catch (Exception e) {
 throw new RuntimeException(e);
 } finally {
 tx.commit();
 session.close();
 }
 }

 @Override
 public List getAll(String employeeName) {
 Session session = null;
 Transaction tx = null;
 try {
 session = HibernateUtils.getSession();
 tx = session.beginTransaction();
 Query q =session.createQuery("from Employee where empName=?");
 // 注意:参数索引从0开始
 q.setParameter(0, employeeName);
 // 执行查询
 return q.list();
 } catch (Exception e) {
 throw new RuntimeException(e);
 } finally {
 tx.commit();
 session.close();
 }
 }

 @Override
 public List getAll(int index, int count) {
 Session session = null;
 Transaction tx = null;
 try {
 session = HibernateUtils.getSession();
 tx = session.beginTransaction();
 Query q = session.createQuery("from Employee");
 // 设置分页参数
 q.setFirstResult(index); // 查询的其实行 
 q.setMaxResults(count); // 查询返回的行数

 List list = q.list();
 return list;
 } catch (Exception e) {
 throw new RuntimeException(e);
 } finally {
 tx.commit();
 session.close();
 }
 }

 @Override
 public void save(Employee emp) {
 Session session = null;
 Transaction tx = null;
 try {
 session = HibernateUtils.getSession();
 tx = session.beginTransaction();
 // 执行保存操作
 session.save(emp);
 } catch (Exception e) {
 throw new RuntimeException(e);
 } finally {
 tx.commit();
 session.close();
 }

 }

 @Override
 public void update(Employee emp) {
 Session session = null;
 Transaction tx = null;
 try {
 session = HibernateUtils.getSession();
 tx = session.beginTransaction();
 session.update(emp);

 } catch (Exception e) {
 throw new RuntimeException(e);
 } finally {
 tx.commit();
 session.close();
 }

 }

 @Override
 public void delete(Serializable id) {
 Session session = null;
 Transaction tx = null;
 try {
 session = HibernateUtils.getSession();
 tx = session.beginTransaction();
 // 先根据id查询对象,再判断删除
 Object obj = session.get(Employee.class, id);
 if (obj != null) {
 session.delete(obj);
 }
 } catch (Exception e) {
 throw new RuntimeException(e);
 } finally {
 tx.commit();
 session.close();
 }
 }
}

Hibernate.cfg.xml 主配置

Hibernate.cfg.xml
 主配置文件中主要配置:数据库连接信息、其他参数、映射信息!

常用配置查看源码:
 hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties

数据库连接参数配置

例如:
## MySQL

#hibernate.dialect org.hibernate.dialect.MySQLDialect
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
#hibernate.connection.driver_class com.mysql.jdbc.Driver
#hibernate.connection.url jdbc:mysql:///test
#hibernate.connection.username gavin
#hibernate.connection.password

自动建表

Hibernate.properties

#hibernate.hbm2ddl.auto create-drop 每次在创建sessionFactory时候执行创建表;
 当调用sesisonFactory的close方法的时候,删除表!
#hibernate.hbm2ddl.auto create 每次都重新建表; 如果表已经存在就先删除再创建
#hibernate.hbm2ddl.auto update 如果表不存在就创建; 表存在就不创建;
#hibernate.hbm2ddl.auto validate (生成环境时候) 执行验证: 当映射文件的内容与数据库表结构不一样的时候就报错!

代码自动建表


public class App_ddl {

 // 自动建表
 @Test
 public void testCreate() throws Exception {
 // 创建配置管理类对象
 Configuration config = new Configuration();
 // 加载主配置文件
 config.configure();

 // 创建工具类对象
 SchemaExport export = new SchemaExport(config);
 // 建表
 // 第一个参数: 是否在控制台打印建表语句
 // 第二个参数: 是否执行脚本
 export.create(true, true);
 }
}

映射配置

1. 普通字段类型
2. 主键映射
 单列主键映射
 多列作为主键映射

主键生成策略,查看api: 5.1.2.2.1. Various additional generators


数据库:
 一个表能否有多个主键? 不能。
 为什么要设置主键? 数据库存储的数据都是有效的,必须保持唯一。

 (为什么把id作为主键?)
 因为表中通常找不到合适的列作为唯一列即主键,所以为了方法用id列,因为id是数据库系统维护可以保证唯一,所以就把这列作为主键!

 联合/复合主键
 如果找不到合适的列作为主键,出来用id列以外,我们一般用联合主键,即多列的值作为一个主键,从而确保记录的唯一性。

映射配置









 
 

 
 
 
 
 

 
 
 
 
 

 




复合主键映射

对象与主键

// 复合主键类
public class CompositeKeys implements Serializable{
 private String userName;
 private String address;
 // .. get/set
}
public class User {
 // 名字跟地址,不会重复
 private CompositeKeys keys;
 private int age;
}

User.hbm.xml






 

 
 
 

 
 

  

 

APP.java

public class App2 {

 private static SessionFactory sf;
 static { 
 // 创建sf对象
 sf = new Configuration()
 .configure()
 .addClass(User.class) //(测试) 会自动加载映射文件:Employee.hbm.xml
 .buildSessionFactory();
 }

 //1. 保存对象
 @Test
 public void testSave() throws Exception {
 Session session = sf.openSession();
 Transaction tx = session.beginTransaction();

 // 对象
 CompositeKeys keys = new CompositeKeys();
 keys.setAddress("广州棠东");
 keys.setUserName("Jack");
 User user = new User();
 user.setAge(20);
 user.setKeys(keys);

 // 保存
 session.save(user);


 tx.commit();
 session.close();
 }

 @Test
 public void testGet() throws Exception {
 Session session = sf.openSession();
 Transaction tx = session.beginTransaction();

 //构建主键再查询
 CompositeKeys keys = new CompositeKeys();
 keys.setAddress("广州棠东");
 keys.setUserName("Jack");

 // 主键查询
 User user = (User) session.get(User.class, keys);
 // 测试
输出 if (user != null){ System.out.println(user.getKeys().getUserName()); System.out.println(user.getKeys().getAddress()); System.out.println(user.getAge()); } tx.commit(); session.close(); } }

文档

Hibernate框架基础

Hibernate框架基础:ORM概念 O, Object 对象R, Realtion 关系 (关系型数据库: MySQL, Oracle…)M,Mapping 映射ORM, 对象关系映射!ORM, 解决什么问题? 存储: 能否把对象的数据直接保存到数据库? 获取: 能否直接从数据库拿到一个对象?想做到上面2点,必须要有映射!总结:
推荐度:
标签: 基本 基础 概念
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top