Hibernate 初相识(一)Hibernate API 详解,配置文件,映射文件详解。

来源:互联网 发布:右上角th mac 编辑:程序博客网 时间:2024/05/23 19:05

导航{

Hibernate 在三层框架中的位置。
一,第一个Hibernate 项目。
【1】导入jar包
【2】创建我们的数据库,和表  (数据库名:day29hibernate_test01  表名: s_user)
[3] 编写 javaBean 文件和 配置文件 
【4】编写test.java 文件,测试项目。
二,分析常见的Api 字段。
【1】Hibernate  的执行过程。
【2】对Configuraction  详解。
 【3】 对 SessionFactory 的详解。
【4】详解 Session 对象
(1)在数据库中添加一条数据。
(2)修改一条数据,需要先查找到该对象,然后才能修改对象中的属性
(3)删除一条数据,调用 delete 方法。 需要先找出该对象, 才能执行删除。
(5) 查询一条记录,查询 id 为 2 的记录。
(6)查询所有,三种方式。
【5】 详解 Trancastion 对象。
【6】 详解Query 对象
【7】详解 Criteria  对象
(1) 查询所有
(2)查询username 属性值为 jack 的记录。(比较是否相等)
(3)查询username 属性中有  a 这个字母的(Like)
总结:其它类似作用的方法调用
【8】生成一个 HibernateUtils  的类。
三,核心配置文件详解(hibernate.cfg.xml)  (多读)
四,映射配置文件(PO.hbm.xml)
【1】对PO (持久化类)的要求 :
1.1    持久化对象的唯一标识 OID
1.2    区分自然主键和代理主键
1.3    基本数据与包装类型
 【2】映射文件配置详解(记住)

}

Hibernate 在三层框架中的位置。


一,第一个Hibernate 项目。 

地址:https://github.com/gengzi/Hibernate

【1】导入jar包

解压 Hibernate  的源码包
将加压文件中的 hibernate3.jar 导入项目,是核心jar 包

打开依赖的jar 包,选择 jpa 和 required 中的jar 文件

操作数据库,需要对应的数据库的驱动jar 包

下面这些都是必须要导入的jar 包
    
 

【2】创建我们的数据库,和表  (数据库名:day29hibernate_test01  表名: s_user)


[3] 编写 javaBean 文件和 配置文件 

{
 两个配置文件:(1) 映射文件(对应javabean 对象)
                          (2) 核心配置文件
}

编写属性和 数据库创建一样的javaBean 对象。

创建一个跟 User.java  的名字一样的  javabean名.hbm.xml  的映射文件
{ 规范要求:映射文件的名字前面与javabean 名字一样,在同一包下。
}
配置文件需要导入  dtd 约束。 约束文件 


 
、  (小知识: 一般dtd 文件中头注释部分,都会把约束写出来)
在 映射文件中 导入 hibernate-mapping-3.0.dtd 的约束
User.hbm.xml  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <!--配置映射-->
  6. <hibernate-mapping>
  7. <class name="cn.edu.aynu.rjxy.domain.User" table="s_user">
  8. <!--主键-->
  9. <id name="id">
  10. <!--native意思:原生-->
  11. <generator class="native"></generator>
  12. </id>
  13. <!--普通字段-->
  14. <property name="username"></property>
  15. <property name="password"></property>
  16. </class>
  17. </hibernate-mapping>

配置核心约束文件

位置:类路径(classpathsrc-->WEB-INF/classes

名称:hibernate.cfg.xml

导入hibernate-configuration-3.0.dtd   的约束头

hibernate.cfg.xml   

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6. <session-factory>
  7. <!--连接数据库的基本四项-->
  8. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  9. <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/day29hibernate_test01</property>
  10. <property name="hibernate.connection.username">root</property>
  11. <property name="hibernate.connection.password">111</property>
  12. <!--添加映射文件-->
  13. <mapping resource="cn/edu/aynu/rjxy/domain/User.hbm.xml"/>
  14. </session-factory>
  15. </hibernate-configuration>

 复制User.hbm.xml  的全路径,需要删掉 src 前面的内容。

【4】编写test.java 文件,测试项目。

  1. package cn.edu.aynu.rjxy.test;
  2. import org.hibernate.SessionFactory;
  3. import org.hibernate.cfg.Configuration;
  4. import org.hibernate.classic.Session;
  5. import cn.edu.aynu.rjxy.domain.User;
  6. publicclassTest01{
  7. publicstaticvoid main(String args[]){
  8. test();
  9. }
  10. publicstaticvoid test(){
  11. // [1]加载配置文件获得核心配置对象
  12. Configuration configuration =newConfiguration().configure();
  13. // [2]获得工厂 SessionFactory,相当于连接池( build 构造)
  14. SessionFactory buildSessionFactory = configuration
  15. .buildSessionFactory();
  16. // [3]获得会话session,相当于链接Connection
  17. Session openSession = buildSessionFactory.openSession();
  18. // 【4】 保存一个user 信息
  19. User user =newUser();
  20. user.setPassword("111");
  21. user.setUsername("耿帅佳");
  22. // [5] 操作
  23. openSession.save(user);
  24. // [6] 关闭资源
  25. openSession.close();
  26. buildSessionFactory.close();
  27. }
  28. }
图片:

控制台打印 sql 语句 。

运行结果 :

二,分析常见的Api 字段。

【1】Hibernate  的执行过程。



【2】对Configuraction  详解。

  1. package cn.edu.aynu.rjxy.api;
  2. import org.hibernate.cfg.Configuration;
  3. import cn.edu.aynu.rjxy.domain.User;
  4. publicclassConfiguration_test{
  5. // 详解 Configuraction 对象
  6. publicvoid fun1(){
  7. // 1.1 调用configure() 方法=> 加载src下名为hibernate.cfg.xml
  8. // (调用configuraction() 方法 => 加载src下的 hibernate.properties)
  9. Configuration configuration =newConfiguration().configure();
  10. // <三种加载核心配置文件的方式:>
  11. // 1.2 如果配置文件不符合默认加载规则.我们可以调用
  12. // new Configuration().configure(file); 通过file加载
  13. // new Configuration().configure(path); 通过指定的路径加载
  14. // <加载映射文件的两种方式:>
  15. // 1.3 可以通过Configuration对象加载 映射文件(不推荐)(映射文件就是:User.hbm.xml)
  16. // 手动配置(不推荐)
  17. // configuration.addClass(User.class);
  18. // configuration.addResource("cn/edu/aynu/rjxy/domain/User.hbm.xml");
  19. // 推荐hibernate.cfg.xml 使用 mapping 属性引入配置文件
  20. configuration.addClass(User.class);
  21. configuration.addResource("cn/edu/aynu/rjxy/domain/User.hbm.xml");
  22. // <ORM(User.hmb.xml) 映射文件编写规范>
  23. // 规范: 1>orm映射文件名称与实体的简单类名一致 (User.hbm.xml User.java )
  24. // 2>orm映射文件 需要与实体的类在同一包下
  25. }
  26. }
图解:

 【3】 对 SessionFactory 的详解。


  1. package cn.edu.aynu.rjxy.api;
  2. import org.hibernate.SessionFactory;
  3. import org.hibernate.cfg.Configuration;
  4. // 对sessionFactory 的详解
  5. publicclassSessionFactory_test{
  6. //
  7. publicvoid fun1(){
  8. // 1加载配置
  9. Configuration conf =newConfiguration().configure();
  10. // 2 根据Configuration 配置信息创建 SessionFactory
  11. // sessionFactory 可以理解为一个连接池,连接池中包含很多连接,而session 就相当于连接池中的 connection 对象
  12. SessionFactory sf = conf.buildSessionFactory();
  13. // 3 获得session
  14. // 3.1 openSession => 获得一个全新的Session对象
  15. sf.openSession();
  16. // 3.2 getCurrentSession => 获得与当前线程绑定的session对象
  17. // 调用getCurrentSession 需要加上一个配置: <property
  18. // name="hibernate.current_session_context_class">thread</property>
  19. sf.getCurrentSession();
  20. }
  21. }
图解:

【4】详解 Session 对象

测试我们常见的数据库操作,增(insert),删(delete),改(update),查(查一条,查所有,按条件查询)(select)

(1)在数据库中添加一条数据。

调用了 session 的 save() 方法(主键自增)
  1.    User user =newUser();
  2. user.setUsername("test");
  3. user.setPassword("111");
  4. // 调用session 对象的 save 方法,来保存对象到数据库中
  5. session.save(user);
添加数据 insert 

(2)修改一条数据,需要先查找到该对象,然后才能修改对象中的属性

使用 update 方法
  1. // 先执行查的方法,找到需要修改的对象
  2. User user =(User) session.get(User.class,1);
  3. user.setUsername("耿帅佳--修改");
  4. session.update(user);



(3)删除一条数据,调用 delete 方法。 需要先找出该对象, 才能执行删除。

  1. // 先找出该对象
  2. User user =(User) session.get(User.class,2);
  3. // 再删除
  4. session.delete(user);


(5) 查询一条记录,查询 id 为 2 的记录。

(5.1)get 方法两个参数  (Class class Serializable  id)  , 第二个参数就是标识的主键  
  1. // 查询 id 为 2的这一条记录。
  2. User user =(User) session.get(User.class,2);
  3. transaction.commit();
 

(5.1)使用 load 方法来查数据库, 它不会立即查询数据库,当我们使用到这个对象的时候,就会查询数据库。
  1. User user =(User) session.load(User.class,2);


在debug 的模式下,我们执行到提交以后,再去点击 user 对象,则会执行如下图的查找。

比较:get()方法  和 load() 方法
 get: get方法被调用时立刻  发送sql语句查询
load : 调用时并没有查询数据库,当我们需要使用该对象的时候,才查询数据

(6)查询所有,三种方式。

(6.1)使用HQL 语言进行查询

 (6.2)使用原生的sql 语句查询

(6.3) 使用Hibernate 独创的对象方式查询 => 无语句

对应控制台的输出:

其中的问题:
1 load方法.返回一个代理对象,获得其内容时,会查询数据库,是每次访问属性都会查询数据库吗?
答:不是每次都查.代理对象中有一个标识是否被初始化的boolean型变量. 记录是否被初始化过.
2 代理都是要基于接口的,用load方法返回的代理,就没有实现任何接口?
答: java中的动态代理是基于接口.  而 Hibernate 是使用javassist-3.12.0.GA.jar 产生代理对象的.
该代理与被代理对象之间的关系是继承关系.与我们学的动态代理不是一种.所以不需要接口.

【5】 详解 Trancastion 对象。

事务是处理一系列的数据库的操作。

注意: 事务关闭时,就会把当前线程上绑定的session 关闭,并删除

【6】 详解Query 对象

(1)可以使用这个对象,实现分页显示的功能。



(2)查询一条结果。
注意: 返回的结果只能是 一条,否则会报错。

当返回多条数据的时候。

【7】详解 Criteria  对象

criteria 是Hibernate 提供的面向对象查询方式,无语言。

(1) 查询所有

Cretiaria对象 与 Query对象功能很像


(2)查询username 属性值为 jack 的记录。(比较是否相等)

 
username 为javabean 中的一个属性,对应数据库的 username


(3)查询username 属性中有  a 这个字母的(Like)



总结:其它类似作用的方法调用

   criteria.add(Restrictions.eq("username""tom"));

         Restrictions.gt(propertyName, value) 大于

         Restrictions.ge(propertyName, value) 大于等于

         Restrictions.lt(propertyName, value) 小于

         Restrictions.le(propertyName, value) 小于等于

           Restrictions.like(propertyName, value) 模糊查询,注意:模糊查询值需要使用 % _


这些方法的命名,很像在学习数据库的时候,中间使用的查询条件。


【8】生成一个 HibernateUtils  的类。

  1. package cn.edu.aynu.rjxy.utils;
  2. import org.hibernate.Session;
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.cfg.Configuration;
  5. publicclassHibernateUtils{
  6. privatestaticSessionFactory sessionFactory;
  7. static{
  8. // 1加载配置
  9. Configuration configuration =newConfiguration().configure();
  10. // 2获取seesionFactory
  11. sessionFactory = configuration.buildSessionFactory();
  12. Runtime.getRuntime().addShutdownHook(newThread(newRunnable(){
  13. @Override
  14. publicvoid run(){
  15. System.out.println("虚拟机关闭!释放资源");
  16. sessionFactory.close();
  17. }
  18. }));
  19. }
  20. /**
  21. * @return
  22. */
  23. publicstaticSession openSession(){
  24. return sessionFactory.openSession();
  25. }
  26. /**
  27. * @return
  28. */
  29. publicstaticSession getCurrentSession(){
  30. return sessionFactory.getCurrentSession();
  31. }
  32. }


三,核心配置文件详解(hibernate.cfg.xml)  (多读)


 代码:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6. <session-factory>
  7. <!--连接数据库的基本四项-->
  8. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  9. <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/day29hibernate_test01</property>
  10. <property name="hibernate.connection.username">root</property>
  11. <property name="hibernate.connection.password">111</property>
  12. <!-- show_sql:操作数据库时,会向控制台打印sql语句-->
  13. <property name="show_sql">true</property>
  14. <!-- format_sql:打印sql语句前,会将sql语句先格式化-->
  15. <property name="format_sql">true</property>
  16. <!-- hbm2ddl.auto:生成表结构的策略配置 update(最常用的取值):如果当前数据库中不存在表结构,那么自动创建表结构.
  17. 如果存在表结构,并且表结构与实体一致,那么不做修改如果存在表结构,并且表结构与实体不一致,那么会修改表结构.会保留原有列. create(很少):无论是否存在表结构.每次启动Hibernate都会重新创建表结构.(数据会丢失)
  18. create-drop(极少):无论是否存在表结构.每次启动Hibernate都会重新创建表结构.每次Hibernate运行结束时,删除表结构.
  19. validate(很少):不会自动创建表结构.也不会自动维护表结构.Hibernate只校验表结构.如果表结构不一致将会抛出异常.-->
  20. <property name="hbm2ddl.auto">update</property>
  21. <!--数据库方言配置 org.hibernate.dialect.MySQLDialect(选择最短的)-->
  22. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  23. <!-- hibernate.connection.autocommit:事务自动提交-->
  24. <property name="hibernate.connection.autocommit">true</property>
  25. <!--Session与线程绑定=>只有配置了该配置,才能使用getCurrentSession -->
  26. <property name="hibernate.current_session_context_class">thread</property>
  27. <!--引入ORM 映射文件填写src之后的路径-->
  28. <!--添加映射文件-->
  29. <mapping resource="cn/edu/aynu/rjxy/domain/User.hbm.xml"/>
  30. </session-factory>
  31. </hibernate-configuration>

四,映射配置文件(PO.hbm.xml)

【1】对PO (持久化类)的要求 :

             (1)提供一个无参的 public 的构造方法
             (2)提供一个标识属性,既在数据库中当作主键
             (3)提供public 的get  和 set 方法
             (4)使用包装类型来标识属性
             (5)不要对实体使用 final ,否则无法生成代理对象

1.1    持久化对象的唯一标识 OID

lJava按地址区分同一个类的不同对象.

l关系数据库用主键区分同一条记录

lHibernate使用OID来建立内存中的对象和数据库中记录的对应关系

结论对象的OID和数据库的表的主键对应。为保证OID的唯一性,应该让Hibernate来为OID付值

1.2    区分自然主键和代理主键

l  主键需要具备不为空/不能重复/不能改变

           自然主键: 在业务中,某个属性符合主键的三个要求.那么该属性可以作为主键列.

           代理主键在业务中,不存符合以上3个条件的属性,那么就增加一个没有意义的列.作为主键.


1.3    基本数据与包装类型

l基本数据类型和包装类型对应hibernate的映射类型相同

l基本类型无法表达null、数字类型的默认值为0

l包装类默认值是null。当对于默认值有业务意义的时候需要使用包装类。


 我们在设置参数的数据类型参照这个表,设置。

Java数据类型

Hibernate数据类型

标准SQL数据类型
(PS:对于不同的DB可能有所差异)

bytejava.lang.Byte

byte

TINYINT

shortjava.lang.Short

short

SMALLINT

intjava.lang.Integer

integer

INGEGER

longjava.lang.Long

long

BIGINT

floatjava.lang.Float

float

FLOAT

doublejava.lang.Double

double

DOUBLE

java.math.BigDecimal

big_decimal

NUMERIC

charjava.lang.Character

character

CHAR(1)

booleanjava.lang.Boolean

boolean

BIT

java.lang.String

string

VARCHAR

booleanjava.lang.Boolean

yes_no

CHAR(1)('Y''N')

booleanjava.lang.Boolean

true_false

CHAR(1)('Y''N')

java.util.Datejava.sql.Date

date

DATE

java.util.Datejava.sql.Time

time

TIME

java.util.Datejava.sql.Timestamp

timestamp

TIMESTAMP

java.util.Calendar

calendar

TIMESTAMP

java.util.Calendar

calendar_date

DATE

byte[]

binary

VARBINARYBLOB

java.lang.String

text

CLOB

java.io.Serializable

serializable

VARBINARYBLOB

java.sql.Clob

clob

CLOB

java.sql.Blob

blob

BLOB

java.lang.Class

class

VARCHAR

java.util.Locale

locale

VARCHAR

java.util.TimeZone

timezone

VARCHAR

java.util.Currency

currency

VARCHAR

 【2】映射文件配置详解(记住)


代码:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <!-- ORM元数据表对象关系映射文件
  6. package:配置该配置文件中类所在的包.-->
  7. <hibernate-mapping package="com.itheima.a_hello">
  8. <!--class:配置实体与表的关系
  9. name :填写实体的完整类名
  10. table:与实体对应表的名称
  11. dynamic-insert:动态插入默认值是false
  12. true=>如果字段值为null,不参与insert语句
  13. dynamic-update:动态更新默认值"false"
  14. true=>没改动过的属性,将不会生成到update语句中
  15. -->
  16. <class name="User" table="t_user">
  17. <!-- id:配置实体与表中 id对应
  18. name: user对象中标识主键的属性名称
  19. column:主键在表中的列名
  20. length:列的数据长度
  21. unsaved-value(不常用):指定主键为什么值时,当做null来处理.
  22. access(强烈推荐不要用):field 那么在操作属性时,会直接操作对应的字段而不是get/set方法
  23. -->
  24. <id name="id" column="id" length="255">
  25. <!-- generator:主键生成策略
  26. 1.increment数据库自己生成主键.先从数据库中查询最大的ID值,将ID值加1作为新的主键
  27. 2.identity依赖于数据的主键自增功能
  28. 3.sequence序列,依赖于数据中的序列功能(Oracle).
  29. 4.hilo(纯了解,永远用不到):Hibernate自己实现序列的算法,自己生成主键.(hilo算法)
  30. 5.native自动根据数据库判断,三选一. identity|sequence|hilo
  31. 6.uuid生成32位的不重复随机字符串当做主键
  32. 7.assigned自己指定主键值.表的主键是自然主键时使用.
  33. -->
  34. <generator class="uuid"></generator>
  35. </id>
  36. <!-- property :实体中属性与表中列的对应
  37. name :实体中属性名称
  38. column :表中列的名称
  39. length :数据长度
  40. precision:小数点后的精度
  41. scale:有效位数
  42. insert(一般不用):该属性是否加入insert语句.
  43. update(一般不用):该属性是否加入update语句.
  44. not-null:指定属性的约束是否使用非空
  45. unique :指定属性的约束是否使用唯一
  46. -->
  47. <!--
  48. type:表达该属性的类型
  49. 可以用三种方式指定属性
  50. java类型数据库类型指定Hibernate类型指定
  51. java.lang.Stringvarcharstring
  52. -->
  53. <property name="name" column="name" update="true" type="string"></property>
  54. <property name="password" column="password"></property>
  55. <property name="sal" column="sal" precision="2" scale="3"></property>
  56. </class>
  57. </hibernate-mapping>
1 0
原创粉丝点击