
打开依赖的jar 包,选择 jpa 和 required 中的jar 文件
操作数据库,需要对应的数据库的驱动jar 包
下面这些都是必须要导入的jar 包

创建一个跟 User.java 的名字一样的 javabean名.hbm.xml 的映射文件{ 规范要求:映射文件的名字前面与javabean 名字一样,在同一包下。}配置文件需要导入 dtd 约束。 约束文件 
、 (小知识: 一般dtd 文件中头注释部分,都会把约束写出来)在 映射文件中 导入 hibernate-mapping-3.0.dtd 的约束User.hbm.xml <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><!--配置映射--><hibernate-mapping><class name="cn.edu.aynu.rjxy.domain.User" table="s_user"><!--主键--><id name="id"><!--native意思:原生--><generator class="native"></generator></id><!--普通字段--><PRoperty name="username"></property><property name="passWord"></property></class></hibernate-mapping>
配置核心约束文件位置:类路径(classpath、src)-->WEB-INF/classes
名称:hibernate.cfg.xml
导入hibernate-configuration-3.0.dtd 的约束头
hibernate.cfg.xml 
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!--连接数据库的基本四项--><property name="hibernate.connection.driver_class">com.MySQL.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/day29hibernate_test01</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">111</property><!--添加映射文件--><mapping resource="cn/edu/aynu/rjxy/domain/User.hbm.xml"/></session-factory></hibernate-configuration>
复制User.hbm.xml 的全路径,需要删掉 src 前面的内容。
【4】编写test.java 文件,测试项目。
package cn.edu.aynu.rjxy.test;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.hibernate.classic.Session;import cn.edu.aynu.rjxy.domain.User;publicclassTest01{publicstaticvoid main(String args[]){ test();}publicstaticvoid test(){// [1]加载配置文件获得核心配置对象Configuration configuration =newConfiguration().configure();// [2]获得工厂 SessionFactory,相当于连接池( build 构造)SessionFactory buildSessionFactory = configuration.buildSessionFactory();// [3]获得会话session,相当于链接ConnectionSession openSession = buildSessionFactory.openSession();// 【4】 保存一个user 信息User user =newUser(); user.setPassword("111"); user.setUsername("耿帅佳");// [5] 操作 openSession.save(user);// [6] 关闭资源 openSession.close(); buildSessionFactory.close();}}图片:
控制台打印 sql 语句 。
运行结果 :
二,分析常见的Api 字段。
【1】Hibernate 的执行过程。

【2】对Configuraction 详解。
package cn.edu.aynu.rjxy.api;import org.hibernate.cfg.Configuration;import cn.edu.aynu.rjxy.domain.User;publicclassConfiguration_test{// 详解 Configuraction 对象publicvoid fun1(){// 1.1 调用configure() 方法=> 加载src下名为hibernate.cfg.xml// (调用configuraction() 方法 => 加载src下的 hibernate.properties)Configuration configuration =newConfiguration().configure();// <三种加载核心配置文件的方式:>// 1.2 如果配置文件不符合默认加载规则.我们可以调用// new Configuration().configure(file); 通过file加载// new Configuration().configure(path); 通过指定的路径加载// <加载映射文件的两种方式:>// 1.3 可以通过Configuration对象加载 映射文件(不推荐)(映射文件就是:User.hbm.xml)// 手动配置(不推荐)// configuration.addClass(User.class);// configuration.addResource("cn/edu/aynu/rjxy/domain/User.hbm.xml");// 推荐hibernate.cfg.xml 使用 mapping 属性引入配置文件 configuration.addClass(User.class); configuration.addResource("cn/edu/aynu/rjxy/domain/User.hbm.xml");// <ORM(User.hmb.xml) 映射文件编写规范>// 规范: 1>orm映射文件名称与实体的简单类名一致 (User.hbm.xml User.java )// 2>orm映射文件 需要与实体的类在同一包下}}图解:
【3】 对 SessionFactory 的详解。
package cn.edu.aynu.rjxy.api;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;// 对sessionFactory 的详解publicclassSessionFactory_test{//publicvoid fun1(){// 1加载配置Configuration conf =newConfiguration().configure();// 2 根据Configuration 配置信息创建 SessionFactory// sessionFactory 可以理解为一个连接池,连接池中包含很多连接,而session 就相当于连接池中的 connection 对象SessionFactory sf = conf.buildSessionFactory();// 3 获得session// 3.1 openSession => 获得一个全新的Session对象 sf.openSession();// 3.2 getCurrentSession => 获得与当前线程绑定的session对象// 调用getCurrentSession 需要加上一个配置: <property// name="hibernate.current_session_context_class">thread</property> sf.getCurrentSession();}}图解:
【4】详解 Session 对象
测试我们常见的数据库操作,增(insert),删(delete),改(update),查(查一条,查所有,按条件查询)(select)(1)在数据库中添加一条数据。
调用了 session 的 save() 方法(主键自增) User user =newUser(); user.setUsername("test"); user.setPassword("111");// 调用session 对象的 save 方法,来保存对象到数据库中 session.save(user);添加数据 insert 
(2)修改一条数据,需要先查找到该对象,然后才能修改对象中的属性
使用 update 方法// 先执行查的方法,找到需要修改的对象User user =(User) session.get(User.class,1); user.setUsername("耿帅佳--修改"); session.update(user);
(3)删除一条数据,调用 delete 方法。 需要先找出该对象, 才能执行删除。
// 先找出该对象User user =(User) session.get(User.class,2);// 再删除 session.delete(user);
(5) 查询一条记录,查询 id 为 2 的记录。
(5.1)get 方法两个参数 (Class class Serializable id) , 第二个参数就是标识的主键 // 查询 id 为 2的这一条记录。User user =(User) session.get(User.class,2); transaction.commit();
(5.1)使用 load 方法来查数据库, 它不会立即查询数据库,当我们使用到这个对象的时候,就会查询数据库。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 的类。
package cn.edu.aynu.rjxy.utils;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;publicclassHibernateUtils{privatestaticSessionFactory sessionFactory;static{// 1加载配置Configuration configuration =newConfiguration().configure();// 2获取seesionFactory sessionFactory = configuration.buildSessionFactory();Runtime.getRuntime().addShutdownHook(newThread(newRunnable(){@Overridepublicvoid run(){System.out.println("虚拟机关闭!释放资源"); sessionFactory.close();}}));}/** * @return */publicstaticSession openSession(){return sessionFactory.openSession();}/** * @return */publicstaticSession getCurrentSession(){return sessionFactory.getCurrentSession();}}三,核心配置文件详解(hibernate.cfg.xml) (多读)
代码:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!--连接数据库的基本四项--><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/day29hibernate_test01</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">111</property><!-- show_sql:操作数据库时,会向控制台打印sql语句--><property name="show_sql">true</property><!-- format_sql:打印sql语句前,会将sql语句先格式化--><property name="format_sql">true</property><!-- hbm2ddl.auto:生成表结构的策略配置 update(最常用的取值):如果当前数据库中不存在表结构,那么自动创建表结构.如果存在表结构,并且表结构与实体一致,那么不做修改如果存在表结构,并且表结构与实体不一致,那么会修改表结构.会保留原有列. create(很少):无论是否存在表结构.每次启动Hibernate都会重新创建表结构.(数据会丢失) create-drop(极少):无论是否存在表结构.每次启动Hibernate都会重新创建表结构.每次Hibernate运行结束时,删除表结构. validate(很少):不会自动创建表结构.也不会自动维护表结构.Hibernate只校验表结构.如果表结构不一致将会抛出异常.--><property name="hbm2ddl.auto">update</property><!--数据库方言配置 org.hibernate.dialect.MySQLDialect(选择最短的)--><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- hibernate.connection.autocommit:事务自动提交--><property name="hibernate.connection.autocommit">true</property><!--将Session与线程绑定=>只有配置了该配置,才能使用getCurrentSession --><property name="hibernate.current_session_context_class">thread</property><!--引入ORM 映射文件填写src之后的路径--><!--添加映射文件--><mapping resource="cn/edu/aynu/rjxy/domain/User.hbm.xml"/></session-factory></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可能有所差异)
byte、java.lang.Byte
byte
TINYINT
short、java.lang.Short
short
SMALLINT
int、java.lang.Integer
integer
INGEGER
long、java.lang.Long
long
BIGINT
float、java.lang.Float
float
FLOAT
double、java.lang.Double
double
DOUBLE
java.math.BigDecimal
big_decimal
NUMERIC
char、java.lang.Character
character
CHAR(1)
boolean、java.lang.Boolean
boolean
BIT
java.lang.String
string
VARCHAR
boolean、java.lang.Boolean
yes_no
CHAR(1)('Y'或'N')
boolean、java.lang.Boolean
true_false
CHAR(1)('Y'或'N')
java.util.Date、java.sql.Date
date
DATE
java.util.Date、java.sql.Time
time
TIME
java.util.Date、java.sql.Timestamp
timestamp
TIMESTAMP
java.util.Calendar
calendar
TIMESTAMP
java.util.Calendar
calendar_date
DATE
byte[]
binary
VARBINARY、BLOB
java.lang.String
text
CLOB
java.io.Serializable
serializable
VARBINARY、BLOB
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】映射文件配置详解(记住)
代码:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><!-- ORM元数据表对象关系映射文件package:配置该配置文件中类所在的包.--><hibernate-mapping package="com.itheima.a_hello"><!--class:配置实体与表的关系 name :填写实体的完整类名 table:与实体对应表的名称 dynamic-insert:动态插入默认值是falsetrue=>如果字段值为null,不参与insert语句 dynamic-update:动态更新默认值"false"true=>没改动过的属性,将不会生成到update语句中--><class name="User" table="t_user"><!-- id:配置实体与表中 id对应 name: user对象中标识主键的属性名称 column:主键在表中的列名 length:列的数据长度 unsaved-value(不常用):指定主键为什么值时,当做null来处理. access(强烈推荐不要用):field 那么在操作属性时,会直接操作对应的字段而不是get/set方法--><id name="id" column="id" length="255"><!-- generator:主键生成策略1.increment数据库自己生成主键.先从数据库中查询最大的ID值,将ID值加1作为新的主键2.identity依赖于数据的主键自增功能3.sequence序列,依赖于数据中的序列功能(Oracle).4.hilo(纯了解,永远用不到):Hibernate自己实现序列的算法,自己生成主键.(hilo算法)5.native自动根据数据库判断,三选一. identity|sequence|hilo6.uuid生成32位的不重复随机字符串当做主键7.assigned自己指定主键值.表的主键是自然主键时使用.--><generator class="uuid"></generator></id><!-- property :实体中属性与表中列的对应 name :实体中属性名称 column :表中列的名称 length :数据长度 precision:小数点后的精度 scale:有效位数 insert(一般不用):该属性是否加入insert语句. update(一般不用):该属性是否加入update语句. not-null:指定属性的约束是否使用非空 unique :指定属性的约束是否使用唯一--><!-- type:表达该属性的类型可以用三种方式指定属性 java类型数据库类型指定Hibernate类型指定 java.lang.String varchar string--><property name="name" column="name" update="true" type="string"></property><property name="password" column="password"></property><property name="sal" column="sal" precision="2" scale="3"></property></class></hibernate-mapping>
新闻热点
疑难解答