• 1. Hibernate王健
  • 2. 为什么用Hibernate?为什么要有Hibernate 在原始操作数据库的过程中,我们都是将JavaBean传递到Dao中,然后再从Dao中解析成SQL语句。 而Hibernate可以直接处理JavaBean,保存一个Bean就是执行一个SQL. 然后就是: 处理分页,一般应用程序都会有分页功能. 数据移植,可能你的项目要运行在多个不同的数据库上。
  • 3. 目录1:认识Hibernate 1、完全借助MyEclipse工具开发Hibernate应用。 2、分析MyEclipse生成的配置文件和工具类。 3、修改工具类,并进行简单的查询。 4、使用hibernate进行CRUD操作。-必须打开事务。 5、更好的认识Hibernate-体系结构。 6、Session,与SessionFactory介绍。 7、- 主键生成策略。 8、关键类介绍。-Query,Criteir
  • 4. (本页无文本内容)
  • 5. Hibernate的体系结构:
  • 6. 认识Hibernate:在今日的企业环境中,把面向对象的软件和关系型数据库一起使用可能是相当麻烦和浪费时间 的。Hibernate 是一个面向 Java 环境的对象/关系型数据库映射工具。对象/关系型数据库映射 (object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射 到基于 SQL 的关系模型数据结构中去,即将数据表影射为JavaBean. Hibernate 不仅管理 Java 类到数据库表的映射(包括 Java 数据类型到 SQL 数据类型的映射), 还提供数据查询和获取数据的方法,可以大幅度减少开发时对人工使用 SQL 和 JDBC 处理数据的 时间。HQL Hibernate 的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的 95%。对于以数 据为中心的程序来说,它们往往只在数据库中使用存储过程来实现商业逻辑,Hibernate 可能不 是最好的解决方案;对于那些在基于 Java 的中间层应用中,它们实现面向对象的业务模型和商 业逻辑的应用,Hibernate 是最有用的。不管怎样,Hibernate 一定可以帮助你消除或者包装那 些针对特定厂商的 SQL 代码,而且帮助你结果集从表格式的表示形式转换到一系列的对象中去。
  • 7. Hibernate核心接口Session,一个Session就是一个Connection,也是一个一级缓存. 持久化对象状态 – 是在缓存中已经被托管还是已经从缓存中删除. Configuration – 配置对像,此类用于读取hibernate.cfg.xml文件. ServiceRegistry为SessionFactory提供注册服务。 SessionFactory – 通过Configuration生成一个Session工厂,用于管理所有的Session,即连接. Transaction -事务. Criteria[标准]/Query[HQL]/SQLQuery[SQL] – 查询对像.
  • 8. 用UML时序图表示上面的创建过程:
  • 9. 2、完全借助MyEclipse开发第一个Hibernate应用第一步:使用DB Browser建立与MySql数据库的连接。 第二步:建立一个Java项目。 第三步:通过MyEclipse的Add功能,加入它对Hibernate的支持。 第四步:修改生成的类文件。 第五步:进行简单的查询。
  • 10. 第一步:建立数据表:,第二步:建立一个Java项目:
  • 11. 第三步:加入对Hibernate的支持:
  • 12. 第五步:进行简单的查询操作-首先在要生成JavaBean:
  • 13. 3、配置和修改Hibernate的配置文件:1、修改获取SessionFacotry/Session的类:
  • 14. 2、修改配置文件:
  • 15. 3、认识*.hbm.xml影射文件:
  • 16. 内建的映射类型:-基本映射类型Java类型标准的SQL类型 integer int/java.lang.IntegerINTEGER long long/java.lang.LongBIGINT short short/java.lang.ShortSMALLINT float float/java.lang.FloatFLOAT double double/java.lang.DoubleDOUBLE big_decimal java.math.BigDecimalNUMERIC character java.lang.StringCHAR(1) string java.lang.StringVARCHAR byte byte/java.lang.ByteTINYINT boolean boolean/java.lang.BooleanBIT yes_no boolean/java.lang.BooleanCHAR(1) (‘Y’ or ‘N’) true_false boolean/java.lang.BooleanCHAR(1)(‘T’ or ‘F’)
  • 17. 内建的映射类型:-时间映射类型Java类型标准的SQL类型date java.util.Date/java.sql.DateDATE time java.util.Date/java.sql.DateTIME timestamp java.util.Date/java.sql.TimestampTIMESTAMP calendar java.util.CalendarTIMESTAMP calendar_date java.util.CalendarDATE
  • 18. 内建的映射类型:-二进制映射类型Java类型标准的SQL类型 binary byte[]VARBINARY text java.lang.StringCLOB clob java.sql.ClobCLOB blob java.sql.BlobBLOB serializable 实现了Serializable的java类VARBINARY
  • 19. 4、完成CRUD-使用hibernate进行CRUD操作。-必须打开事务:
  • 20. Session,与SessionFactory介绍:Session是运行在Java程序与Hibernate之间最主要的类。它为 应用程序提供持久化的服务。它包含一些重要的方法: save,persist 对应 insert语句。 Delete 对应 delete语句。 Update,merge对应update语句
  • 21. 操作Session进行数据执行的模板代码如下:
  • 22. SessionFactory介绍:每一个项目,只拥有一个此类的对像。SessionFactory是線程安全的。 此类,负责获取或是创建Sessions. 它同样包含一些重要的方法,如从二级缓存中清除某个对像。 考虑以下代码:
  • 23. Hibernate初始化过程分析:第一步:hibernate会先实例化org.hibernate.cfg.Configuration类.此类在实例化的过程中,会同时实例化SettingsFactory类,SettingsFactory类的作用是保存用户的配置信息.默认读取hibernate.properties资源文件。 第二步:调用configuration.configure方法,此方法于接收用户的配置文件即:hibernate.cfg.xml文件.此方法默认在classpath下查找hibernate.cfg.xml文件. 第三步:调用configuration.buildSessionFactory方法.此方法用于读取所有在hibernate.cfg.xml中的配置,从而构造出一个SessionFactoryImpl类. 在SessionFactoryImpl(即SessionFactory)中,保存着二级缓存用的计数器,所有影射类都保存在map中,查询缓存,拦截器.此类的构造方法应该是最为复杂的一个. 第四步:在SessionFactory中,通过openSession可以获取一个连接,一个Session,其实它的实现类为SessionImpl,即为一个Connection,但此Connection是经过动态代理以后的.[见BorrowedConnectionProxy的源代码,此类负责动态代理Connection],而真正的连接则是由DriverManagerConnectionProvider来负责,通过查看它的源代码可知,它的连接方式仍然是使用DriverManager注册的JDBC连接. 第五步:将创建的N个Session,放到ThreadLocale以便于线程局部共享.
  • 24. (本页无文本内容)
  • 25. 主键生成策略1:经常使用的几个主键生成策略为: 1:assigned ----表示在新增数据时由应用程序(用户自己)指定主键的值。主要针对主键是采用自然主键的形式。这种方式,适用于主键列不是自动增长列。 其缺点为在执行新增操作时,需查询数据库判断生成的主键是否已经存在。 2:increment ----表示新增数据操作时由hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加上1.适用于采用代理主键形式的主键列。同样不能用于主键列是自动增长的表。但是,该主键生成策略也有些缺点。 (1)新增数据前先查询一遍,影响了性能。 (2)主键的类型只能为数值型的int或者long (3)并发操作时的冲突问题-多线程,多CPU。
  • 26. 主键生成策略2:3:identity ----不如说是为sqlerver数据库量身定做的。主要适用于sqlserver数据库的自动增长列的表。 4:native –本地 ----表示根据不同的数据库采用不同的主键生成策略。比如,当前数据库为sqlserver,则会采用identity,如为oracle,则采用 oracle中的sequence等。区分数据库的不同是以hibernate主配置文件中sessionFactory中配置的数据库方言。mysql 就用不了了, 这个oracle中必须创建一个名字为 hibernate_sequence的序列。 5:UUID-这个就不用说了吧。适合于各种不同的数据库,生成32位的唯一字符串。但字段必须是varchar类型。-建议使用此种形式。
  • 27. Hibernate的查询:对于保存、修改、删除可以直接使用session,但如果需要更为复杂的查询,则可以使用以下几个类: Query -用于执行HQL – session.createQuery(HQL); SQLQuery - 用于执行原生的SQL. – session.createSQLQuery(SQL); Criteria – 查询JavaBean. – session.createCriteria(JavaBean.class); 条件查询- Restrictions- Restrictions.eq(propertyName,”value”);
  • 28. 首先介绍Criteria:-1:简单查询,2:条件查询,3:使用map
  • 29. Criteria:-iLike
  • 30. Criteria:-in:
  • 31. 在任意情况下都可以使用分页:以下使用的是排序 c.addOrder(Order.desc("name"));
  • 32. findByExample – 根据给定的示例查询:Session ss = HibernateSessionFactory.getSession(); ss.beginTransaction(); Stud s = new Stud(); s.setName(“EE”);//根据给定的字段查询,但不包含主键 List list = ss.createCriteria(Stud.class) .add(Example.create(s)) .list(); System.err.println(list); ss.getTransaction().commit();
  • 33. Query类:-用于执行HQL语句:Query类,提供使用HQL语言的查询方式:如 from Stud;注意Stud是类名,不是表名,所以第一个单词必须大写。
  • 34. Query条件查询: - 占位符查询和命名的查询
  • 35. Query-通过指定map/JavaBean的方式使用参数:
  • 36. uniqueResult返回一个唯一的值:
  • 37. Query的executeUpdate功能可以执行更新操作:Execute the update or delete statement.
  • 38. merge(合并)与saveOrUpdate的区别merge(合并)和saveOrUpdate都可以用于保存数据。它们的区别关键在于所处理的类是否存在id. 在id(主键-自动生成的主键)为null的情况下,都是保存。 如果存在Id(主键)的情况下-merge的处理方式: 如果id对应的记录数据存在,则为修改。 如果id对应的记录数据不存在 ,则为保存。 如果存在Id(主键)的情况下-saveOrupdate的处理方式: 如果id对应的记录数据存在则为修改。 如果id对应的记录不存在则抛出异常。
  • 39. 关于Query的其他说明:Query的方法有很多,请大家参考API文档并结合代码练习。 其他方法如: setParameterList… setFirstResult.. setMaxResults… 更多方法不一一列举,请同学们自己查看API。
  • 40. 再次分析hibernate.cfg.xml文件:
  • 41. JDBC连接:就像你刚才看到的,如果希望让Hibernate帮助你建立数据连接必须要在配置文件中配置数据连接所需要的属性,它们是: (前面的hibernate可以省略)如果仅使用以上配置,即会使用Hibernate自带的数据连接池,但 Hibernate建议你使用c3p0连接池做为实现。 如果要使用c3p0的连接,请将c3p0.jar添加到classpath,并添加以下配置
  • 42. 通过connection.provider_class指定使用c3p0:需要将c3p0.jar包放到lib中.及c3p0的相关支持包. 通过以下代码可以测试是否使用的是c3p0连接池:
  • 43. 其他可选配置:hibernate.dialect - 方言。 hibernate.show_sql - true|false hibernate.format_sql - true|false hibernate.connection.isolation –1,2,4,8 --默认为4,可重复读 hibernate.connection.autocommit - true|false – 不建议修改此值 其他再多属性,请见hibernate的API文档。
  • 44. Hibenate方言:MySQL------org.hibernate.dialect.MySQLDialect Oracle(any version)--org.hibernate.dialect.OracleDialect Oracle 9i----org.hibernate.dialect.Oracle9iDialect Oracle 10g----org.hibernate.dialect.Oracle10gDialect Microsoft SQL Server----org.hibernate.dialect.SQLServerDialect hibernate方言是可选属性,如果你没有配置方言,hibernate可以根据连接属性自己获取方言。