1、hibernate是什么?
(1)用途:直接处理JavaBean,不再去处理SQL语句
(2)在Javabean上实现一对多,或是多对多的关系。
(3)数据移植
MySql (limit) - Oracle (rownum) - MsSqlServer (top)
什么是ORM:ORM就是利用描述对象(JavaBean)和数据库之间的映射的元数据,自动且透明地把Java应用程序
中的对象持久化到关系数据库中的表。
ORM本质上,是把数据从一种表示法转换为另一种表示法进行工作。但这意味着某些性能的损失。
2、通过MyEclipse创建Hibernate项目。
Hibername拥有自己的配置文件:classpath:hibernate.properties , classpath:/hibernate.cfg.xml
创建了配置文件后,还需要创建一个读取配置文件的类
Hibernate是如何来操作数据库中表的?
1、hibernate必须要将表结构抽象成一个javaBean。
2、用一个JavaBean和一个XML文件来完成从JavaBean到数据库的映射
3、通过Session(Connection)类,它的save(JavaBean)即可以直接保存数据
4、之前的Connection默认是自动提交事务的,但Session对Connection进行了封装,且不是自动提交事务的。
5、hibernate是如何实现写入到表中的?有没有执行sql? - insert.如何才可以年到insert语句?
通过配置,可以让hibernate告诉我们hibernate是如何执行的sql语句
以下配置是否输出执行的Sql语句,默认为不输出
<property name="hibernate.show_show_sql">true</property>
以下设置美化一个sql语句
<property name="hibernate.format_sql"><property>
3、手工创建hibernate项目
1、创建一个Java项目
2、包。 hibernate是用dom4j来读取XML配置文件的
3、创建一个Hibernate.properties或是hibernate.cfg.xml配置文件
4、创建一个类:HibernateUtils, 此类中使用Configuration来读取上面的两个配置文件
5、创建一个JavaBean和一个映射文件即*。hbm.xml文件,与数据库对应 --领域对象
6、声明Stud类,调用session的save方法
4、Hibernate的启动过程分析
Hibernate的启动过程:
Configuration 的构造方法先去读取classpath:hibernate.properties文件
可选的调用:configure方法,读取classpath:hibernate.cfg.xml文件。
通过buildSessionFactory方法返回一个SessionFactory - 成功。
5、Hibernate的配置文件分析
1)为什么Hibernate会读取两个配置文件:
通常情况下,我们只提供一个配置文件,即:hibernate.cfg.xml文件。
提供两个配置文件的情况是:
在hibernate.properties文件中,配置数据连接,二级缓存,连接池等信息.
在hibernate.cfg.xml中配置mapping元素以加载*.hbm.xml文件或是指定加载一个添加了注解的类。
2)几个连接池配置选项的意思:
hibernate.c3p0.timeout = 300
指定超时周期,上例为300秒,在它之后闲置连接将从池中移除。
hibernate.c3p0.max_statements = 50
最多高速缓存50个预编译语句。高速缓存编译语句是利用hibernate获取最好性能的要素。
hibernate.c3p0.max_size选项应该是必须的。
什么是持久化:持久化是在应用程序开发中最基本的概念之一,一般是指利用SQL在关系数据库中存储数据(p3).
数据比任何应用程序存在的都长久。
3)SessionFactory与Session:
SessionFactory是线程安全的,且能被共享。它生活在Hibernate的整个生命周期。
Session不是线程安全的,生命周期非常短暂。
4)一对多时只能使用接口类型:
Hibernate需要用于集合类型属性的接口。因此必须使用java.util.Set或是java.util.List,而不是
HashSet或是ArrayList. - 即 Set set = new HashSet(); 注意类型部分。
5)主键生成策略:
native:根据不同的数据库生成主键 - mysql = auto_increment ,sqlserver= identify ,oracle=sequence
应该设置:increment 由hiberate来设置主键的自动增加。
native对于本地在表上设置了主键生成策略的表生用有,如对于mySql来说,就是auto_increment.
对于SqlServer来说就是identity,对于oracle来说是sequence,此种情况下,不会做select max工作。
当你没有在表级别上设置自动增长策略时,对于主键使用native会抛出异常。
increment
设置主键的自动增长,此时hibernte会自动做一个select max的查询语句,然后再写到表中。
即使你没有在表级别上设置自动增长策略也不会有错。
以上所有生成器都是一个类,如:increment是类:org.hibernate.id.IncrementGenerator
所有生成器,都是IdentifierGenerator的子类。
每一个主键生成策略都是一个类:此类由hibernte生成。
UUID - UUIDGenerator
所有生成主键的策略都是IdentifierGenerator接口的子类。
6)XML中的元数据
任何一个ORM解决方案都应该提供一个人类可读的,易于手工编写的映射格式。
目前最受欢迎的对象/关系元数据格式是XML.
Hibernate的映射XML文件非常易读,并定义的有用的默认值。如果没有属性值,就在被映射类上通过反射来确定
默认值。
7)entry-name与name的区别与联系:
entry-name与name两都必须存在一个,也可以同时存在。
仅存在entry-name则是定义一个Map类型的实体。
仅存在name则是定义一个JavaBean类型的实体。此时entry-name的值为类名。
两者同时存在,entry-name的效力要强于name,意思是为JavaBean取一个实体名称。
今后的关系等操作必须要通过指定实体名的方式引用。
两都同时存在的情况经常用在,一个JavaBean映射多个表,此时必须要通过entry-name区分它们。
8)使用XML数据-通过查询直接转换成XML数据
Session s2 = Session.getSession(EntityMode.DOM4J); //再次查询,将返回Dom4j的Element元素
Element el = (Element)s2.get(Person.class,1);
OutputFormat out = OutputFormat.createPrettyPrint();//格式化数据
XMLWriter writer = new XMLWriter(System.err,out);//定义格式输出
writer.write(el);//输出
解决循环引用:
在不需要引用的字段的hbm.xml文件上添加embed-xml=false可以防止循环引用。
也可以定义成属性:通过在hbm.xml文件中添加node="@id"可以定义成属性。
示例:
<class name="Person" node="MyPerson">//修改了xml文件的元素
<id name="id" node="@id"> //定义成属性
...
<set name="cars" embed-xml="false">//防止引用子元素,循环引用
</class>
9)细粒度的领域模型
Hibernate的一个主要目标是支持细粒度的领域模型,粗略地说,细粒度意味着类比表更多。
6、Hibernate的CRUD及其他操作
1、查询:
以下查询方法:
A:全部查询,使用Creteri(完全限定名-类名)进行查询
B:全部查询,使用Query - 不执行SQL - 语句,执行的是HQL - Hibernate Query Language
C: 全部查询,使用SQLQuery类,此类执行原生的SQL语句
2、条件查询
A:对于Crieria类,必须使用add方法设置条件
B:对于Query类,应该使用?(点位符)或是命名(where id=:myId)和查询
C:普通查询,使用?
3、如果一个查询,它的条件不确定