1、Hibernate个人学习笔记Hibernate使用之后JDBC大部分不用再编写了轻量级框架没有侵入性适合对象关系清晰、不适合聚集性批量操作不适合需要使用数据库特定性功能的情况 课程目标: 理解O/R Mapping原理 掌握Hibernate开发的相关知识 能使用Hibernate进行实际项目开发 Hibernate高手进级:性能优化策略目录 什么是Hibernate 快速体验Hibernate的开发步骤 认识Hibernate基本核心接口 Hibernate的对象关系映射 Hibernate查询语句(HQL) 直接使用JDBC操作数据库的步骤很繁琐 JDBC操作的是关系型数据库 我们用JA
2、VA开发程序,则使用面向对象的思想 Hibernate正是在这两种不同的模型之间建立关联,Hibernate给我们提供了利用面向对象的思想来操作关系型数据的接口Hibernate能做什么? - 理解O/R映射 Hibernate能帮助我们利用面向对象的思想,开发基于关系型数据库的应用程序 第一:将对象数据保存到数据库 第二:将数据库数据读入对象中1、第一个hibernate项目,入门1.1、Hibernate_first创建步骤1、新建java项目2、创建User Library,加入如下jar * HIBERNATE_HOME/hibernate3.jar * HIBERNATE_HOME/
3、lib/*.jar * MySql jdbc驱动 3、创建hibernate配置文件hibernate.cfg.xml,为了便于调试最好加入log4j配置文件 位于:hibernate-3.2etc 目录下4、定义实体类 User.java 5、定义User类的映射文件User.hbm.xml 6、将User.hbml.xml文件加入到hibernate.cfg.xml文件中 7、编写hbm2ddl工具类:ExportDB.java将实体类 生成数据库表 public static void main(String args) /读取hibernate.cfg.xml文件 Configurat
4、ion cfg = new Configuration().configure(); SchemaExport export = new SchemaExport(cfg); export.create(true, true); 8、开发客户端 Client.java 为了方便跟踪sql执行,在hibernate.cfg.xml文件中加入 truepublic static void main(String args) /读取hibernate.cfg.xml文件 Configuration cfg = new Configuration().configure(); /创建SessionFa
5、ctory SessionFactory sf = cfg.buildSessionFactory(); Session session = null; try session = sf.openSession(); /开启事务 session.beginTransaction(); User user = new User(); user.setPassword(jbjb); user.setName(不得了); user.setCreateDate(new Date(); user.setExpireDate(new Date(); /保存数据 session.save(user); /提
6、交事务 session.getTransaction().commit(); catch(Exception e) e.printStackTrace(); /回滚事务 session.getTransaction().rollback(); finally if(session != null) if(session.isOpen() /close session session.close(); 1.2、步骤总结 实体类(持久化类)的设计 实体类与关系数据库的映射 应用的开发1.3、Hibernate核心接口1.3.1 Configuration 概述:Configuration 类负责管
7、理Hibernate 的配置信息。它包括如下内容: Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等。 Hibernate映射文件(*.hbm.xml)。 Hibernate配置的两种方法: 属性文件(hibernate.properties)。调用代码:Configuration cfg = new Configuration(); xml文件(hibernate.cfg.xml)。调用代码:Configuration cfg = new Configuration().configure(); com.mysql.jdbc
8、.Driver jdbc:mysql:/localhost/hibernate_first Root Root Org.hibernate.dialect.MySQLDialect true 1.3.2 SessionFactory 概述:应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享。通常情况下,是线程安全的,整个应用只有唯一的一个会话工厂例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。 会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。
9、 他的创建很耗时的,通常放在一个静态方法里面只创建一次 static try Configuration cfg = new Configuration().configure(); factory = cfg.buildSessionFactory(); catch(Exception e) e.printStackTrace(); 调用代码:SessionFactory sessionFactory = cfg.buildSessionFactory(); 说明:SessionFactory由Configuration对象创建,所以每个Hibernate配置文件,实际上是对SessionF
10、actory的配置1.3.3 Session(会话) 概述: Session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间。 Session也称为持久化管理器,因为它是与持久化有关的操作接口。 Session通过SessionFactory打开,在所有的工作完成后,需要关闭。 它与Web层的HttpSession没有任何关系。 调用代码Session session = sessionFactory.openSession();2测试实体对象的生命周期2.1 junit简介: * 编写测试类xxxTest,需要继承TestCase *
11、 编写单元测试方法,测试方法必须以test开头,测试方法不能含有参数和返回值,如: public void testHello1() * 最好单元测试的代码单独建立一个目录 2.2了解Hibernate中CRUD操作public class SessionTest extends TestCase public void testSave1() Session session = null; Transaction tx = null; User user = null; try session = HibernateUtils.getSession(); tx = session.begin
12、Transaction(); /Transient状态 user = new User(); user.setName(李四); user.setPassword(123); user.setCreateTime(new Date(); user.setExpireTime(new Date(); /persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步 session.save(user); user.setName(王五); /session.update(user); mit(); catch(Exception e) e.printStackTrace()
13、; tx.rollback(); finally HibernateUtils.closeSession(session); /detached状态 user.setName(张三); try session = HibernateUtils.getSession(); session.beginTransaction(); /persistent状态 session.update(user); session.getTransaction().commit(); public void testReadByGetMethod1() Session session = null; try se
14、ssion = HibernateUtils.getSession(); session.beginTransaction(); /马上发出查询sql,加载User对象 User user = (User)session.get(User.class, 402880d01b9bf210011b9bf2a2ff0001); System.out.println(user.name= + user.getName(); /persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步 user.setName(龙哥); session.getTransaction().com
15、mit(); public void testReadByGetMethod2() Session session = null; try session = HibernateUtils.getSession(); session.beginTransaction(); /采用get加载数据,如果数据库中不存在相应的数据,返回null User user = (User)session.get(User.class, asdfsafsdfdsf); session.getTransaction().commit(); public void testReadByLoadMethod1() S
16、ession session = null; try session = HibernateUtils.getSession(); session.beginTransaction(); /不会发出查询sql,因为load方法实现了lazy(懒加载或延迟加载) /延迟加载:只有真正使用这个对象的时候,才加载(发出sql语句) /hibernate延迟加载实现原理是代理方式 User user = (User)session.load(User.class, 402880d01b9bf210011b9bf2a2ff0001); System.out.println(user.name= + us
17、er.getName(); /persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步 user.setName(发哥); session.getTransaction().commit(); public void testReadByLoadMethod2() Session session = null; try session = HibernateUtils.getSession(); session.beginTransaction(); /采用load加载数据,如果数据库中没有相应的数据 /那么抛出ObjectNotFoundException Use
18、r user = (User)session.load(User.class, 55555555); System.out.println(user.getName(); session.getTransaction().commit(); public void testUpdate1() Session session = null; try session = HibernateUtils.getSession(); session.beginTransaction(); /手动构造的detached状态的对象 User user = new User(); user.setId(402
19、880d01b9be8dc011b9be9b23d0001); user.setName(德华); session.update(user); session.getTransaction().commit(); public void testDelete1() Session session = null; try session = HibernateUtils.getSession(); session.beginTransaction(); / /手动构造的detached状态的对象/ User user = new User();/ user.setId(402880d01b9be
20、8dc011b9be9b23d0001);/ user.setName(德华);/ session.delete(user); User user = (User)session.load(User.class, 402880d01b9be8dc011b9be9b23d0001); session.delete(user); session.getTransaction().commit();2.3了解get和load的区别? * get不支持lazy,load支持lazy * 采用get加载数据,如果没有匹配的数据,返回null,而load则抛出异常2.4 Transient、persist
21、en 、detached的状态特征transient状态的特征? * 在数据库中没有与之匹配的数据 * 没有纳入session的管理 persistent状态的特征? * persistent状态,当属性发生改变的时候,Hibernate会自动和数据库同步库数据库中有与之匹配的数据 * 纳入了session的管理 * 在清理缓存(脏数据检查)的时候,会和数据库同步 detached状态的特征? * 在数据库中有与之匹配的数据 * 没有纳入session的管理 2.5 QueryTestpublic void testQuery() Session session = null; try ses
22、sion = HibernateUtils.getSession(); Transaction tx = session.beginTransaction(); Query query = session.createQuery(from User); query.setFirstResult(0); query.setMaxResults(2); List userList = query.list();for(Iterator iterator=userList.iterator();iterator.hasNext();) User user = (User)iterator.next(
23、); System.out.println(user.getId(); System.out.println(user.getName(); mit();3、Hibernate基本映射3.1 映射关系实体类-表实体类中的普通属性-表字段采用标签映射成数据库表,通过、标签将普通属性映射成表字段所谓普通属性指不包括自定义类、集合和数组等注意:如果实体类和实体类中的属性和sql中的关键字重复,必须采用table或column重新命名3.2 实体类的设计原则 * 实现一个默认的(即无参数的)构造方法(constructor) * 提供一个标识属性(identifier property)(可选) *
24、使用非final的类 (可选),final之后就不能继承了 * 为持久化字段声明访问器(accessors) get、set方法3.3 主键生成策略: uuid、native和assigneduuid 用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。native 根据底层数据库的能力选择identity, sequence 或者hilo中的一个。assigned 让应用程序在save()之前为对象分配一个标示符。这是 元素没有指定时的默认生成策略。 主键这个时候必须手动分配4. hiberna
25、te多对一关联映射4.1 多对一关联映射的本质: * 将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用,多个用户(user)属于一个组(group)会在多的一端加入一个外键,指向一的一端,这个外键是由中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致public class User private int id; private String name; private Group group;标签的定义示例: * many-to-one的映射最常用,也是最容易理解和编写的 生成的DDL语句如下create table T_Group (id varchar(255) not null, name varchar(255), primary key (id)create table User (id varchar(255) not null, name varchar(255), password varchar(255), createTime datetime, expireTime datetime, groupid varchar(255
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1