Hibernate基础
一、Hibernate简单介绍
- hibernate框架应用在javaee三层结构中 dao层框架
- 在dao层里面做对数据库crud操作,使用hibernate实现crud操作,hibernate底层代码就是jdbc,hibernate对jdbc进行封装,使用hibernate好处,不需要写复杂jdbc代码了,
不需要写sql语句实现 - hibernate开源的轻量级的框架
- hibernate使用orm思想对数据库进行crud操作
- oem思想
(1)让实体类和数据库表进行一一对应关系
让实体类首先和数据库表对应
让实体类属性 和 表里面字段对应
(2)不需要直接操作数据库表,而操作表对应实体类对象
二、Hibernate入门
idea创建纯hibernate项目
导入mysql的jdbc驱动包
给项目建立如下表结构
配置hibernate核心配置类
(1)核心配置文件格式xml,但是核心配置文件名称和位置固定的
- 位置:必须src下面
- 名称:必须hibernate.cfg.xml
(2)引入dtd约束
(3)hibernate操作过程中,只会加载核心配置文件,其他配置文件不会加载
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--第一部分:配置数据库表信息 必须的-->
<!--idea创建hibernate项目时,需要再单独加入mysql的JDBC驱动包-->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///study_hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">123456789</property>
<!--第二部分:配置hibernate信息 可选的-->
<!--输出底层sql语句-->
<property name="hibernate.show_sql">true</property>
<!--输出底层sql语句格式-->
<property name="hibernate.format_sql">true</property>
<!--
hibernate帮创建表,需要配置之后
update:如果已经有表,更新,如果没有,创建
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--
配置数据库方言
在mysql里面实现分页 关键字limit,只能在mysql里面
在oracle数据库,实现分页rownum
让hibernate框架识别不同数据库的自己特有的语句
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!--第三部分:把映射文件放在核心配置文件中-->
<mapping resource="pojo/User.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
创建实体类
package pojo;
/**
*
*/
public class User {
private int id;
private String username;
private String password;
private Integer age;
private String address;
public User() {
}
public User(int id, String username, String password, Integer age, String address) {
this.id = id;
this.username = username;
this.password = password;
this.age = age;
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
配置文件实现映射关系
使用配置文件实现映射关系
(1)创建xml格式的配置文件
- 映射配置文件名称和位置没有固定要求
- 建议:在实体类所在包里面创建,实体类名称.hbm.xml
(2)配置是是xml格式,在配置文件中首先引入xml约束
- 学过约束dtd、schema,在hibernate里面引入的约束dtd约束
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!--
1.配置类和表对应
class标签
name:实体类全路径
table:数据库表名称
-->
<class name="pojo.User" table="t_user">
<!--
2.配置实体类id和表id对应
hibernate要求实体类有一个属性唯一值
hibernate要求有字段作为唯一值
-->
<!--
id标签
name属性:实体类id属性名称
column属性:生成的表字段名称
-->
<id name="id" column="id">
<!--
generator:设置数据库表id增长策略
native:生成表id值就是主键自动增长
-->
<generator class="native"></generator>
</id>
<!--
3.配置其他属性和表字段对应
name属性:实体类属性名称
column属性:生成的表字段名称
-->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="age" column="age"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>
编写一个简单测试类
@Test
public void TestHibernate_Insert(){
//第一步 加载hibernate核心配置文件
//在src下面找到名称是hibernate.cfg.xml
//在hibernate里面配置对象(配置类的对象)
Configuration configuration = new Configuration();
configuration.configure();
//第二步 创建SessionFactory对象
//读取hibernate核心配置文件内容,创建SessionFactory
//在这个过程中,根据映射关系,在配置数据库里面把表创建出来
SessionFactory sessionFactory = configuration.buildSessionFactory();
//第三步 使用SessionFactory创建Seesion对象
//类似于jdbc中的链接
Session session = sessionFactory.openSession();
//第四步 开启事务
Transaction transaction = session.beginTransaction();
//第五步 写具体逻辑crud操作
//添加功能
User user = new User();
user.setUsername("小明");
user.setPassword("123456");
user.setAge(17);
user.setAddress("江西南昌");
//调用session方法实现添加
session.save(user);
//第六步 提交事务
transaction.commit();
//第七步 关闭资源
session.close();
sessionFactory.close();
}
三、Hibernate配置文件详解
Hibernate映射配置文件(重点)
1 映射配置文件名称和位置没有固定要求
2 映射配置文件中,标签name属性值写实体类相关内容
(1)class标签name属性值实体类全路径
(2)id标签和property标签name属性值 实体类属性名称
3 id标签和property标签,column属性可以省略的
(1)不写值和name属性值一样的
4 property标签type属性,设置生成表字段的类型,自动对应类型
Hibernate核心配置文件
1 配置有位置要求
2 配置三部分要求
(1)数据库部分必须的
(2)hibernate部分可选的
(3)映射文件必须的
3 核心配置文件名称和位置固定的
(1)位置:src下面
(2)名称:hibernate.cfg.xml
四、Hibernate核心api
Configuration
找到src下面找到名称hibernate.cfg.xml配置文件,创建对象,把配置文件放到对象里面(加载核心配置文件)
SessionFactory(重点)
1 使用configuration对象创建sessionFactory对象
根据核心配置文件中,有数据库配置,有映射文件部分,到数据库里面根据映射关系把表创建
2 创建sessionFactory过程中,这个过程特别耗资源的
在hibernate操作中,建议一个项目一般创建一个sessionFactory对象
Session(重点)
1 session类似于jdbc中connection
2 调用session里面不同的方法实现crud操作
(1)添加 save方法
(2)修改 update方法
(3)删除 delete方法
(4)根据id查询 get方法
3 session对象单线程对象
(1)session对象不能共用,只能自己使用
Transaction
1 事务对象
2 事务提交和回滚方法
3 事务概念
(1)事务四个特性
原子性、一致性、隔离性、持久性
五、实体类编写规则
1 实体类里面属性私有的
2 私有属性使用公开的set和get方法操作
3 要求实体类有属性作为唯一值(一般使用id值)
4 实体类属性建议不使用基本数据类型,使用基本数据类型对应的包装类
(1)八个基本数据类型对应的包装类
- int – Integer
- char—Character、
- 其他的都是首字母大写 比如 double – Double
(2)比如 表示学生的分数,假如 int score;
- 比如学生得了0分 ,int score = 0;
- 如果表示学生没有参加考试,int score = 0;不能准确表示学生是否参加考试
解决:使用包装类可以了, Integer score = 0,表示学生得了0分,
表示学生没有参加考试,Integer score = null;
六、Hibernate主键生成策略
1 hibernate要求实体类里面有一个属性作为唯一值,对应表主键,主键可以不同生成策略
2 hibernate主键生成策略有很多的值
3 在class属性里面有很多值
(1)native: 根据使用的数据库帮选择哪个值
(2)uuid:之前web阶段写代码生成uuid值,hibernate帮我们生成uuid值
4 演示生成策略值 uuid
(1)使用uuid生成策略,实体类id属性类型 必须 字符串类型
(2)配置部分写出uuid值
七、CRUD操作
增加操作
@Test
public void TestHibernate_Insert(){
//第一步 加载hibernate核心配置文件
//在src下面找到名称是hibernate.cfg.xml
//在hibernate里面配置对象(配置类的对象)
Configuration configuration = new Configuration();
configuration.configure();
//第二步 创建SessionFactory对象
//读取hibernate核心配置文件内容,创建SessionFactory
//在这个过程中,根据映射关系,在配置数据库里面把表创建出来
SessionFactory sessionFactory = configuration.buildSessionFactory();
//第三步 使用SessionFactory创建Seesion对象
//类似于jdbc中的链接
Session session = sessionFactory.openSession();
//第四步 开启事务
Transaction transaction = session.beginTransaction();
//第五步 写具体逻辑crud操作
//添加功能
User user = new User();
user.setUsername("小明");
user.setPassword("123456");
user.setAge(17);
user.setAddress("江西南昌");
//调用session方法实现添加
session.save(user);
//第六步 提交事务
transaction.commit();
//第七步 关闭资源
session.close();
sessionFactory.close();
}
根据id查询操作
@Test
public void TestHibernate_Get(){
//第一步 加载hibernate核心配置文件
//在src下面找到名称是hibernate.cfg.xml
//在hibernate里面配置对象(配置类的对象)
Configuration configuration = new Configuration();
configuration.configure();
//第二步 创建SessionFactory对象
//读取hibernate核心配置文件内容,创建SessionFactory
//在这个过程中,根据映射关系,在配置数据库里面把表创建出来
SessionFactory sessionFactory = configuration.buildSessionFactory();
//第三步 使用SessionFactory创建Seesion对象
//类似于jdbc中的链接
Session session = sessionFactory.openSession();
//第四步 开启事务
Transaction transaction = session.beginTransaction();
//第五步 写具体逻辑crud操作
//根据id查询
//调用session里面的get方法
//第一个参数:实体类的class
//第二个参数:id值
User user = session.get(User.class, 2);
System.out.println(user);
//第六步 提交事务
transaction.commit();
//第七步 关闭资源
session.close();
sessionFactory.close();
}
修改操作
@Test
public void TestHibernate_Update(){
//第一步 加载hibernate核心配置文件
//在src下面找到名称是hibernate.cfg.xml
//在hibernate里面配置对象(配置类的对象)
Configuration configuration = new Configuration();
configuration.configure();
//第二步 创建SessionFactory对象
//读取hibernate核心配置文件内容,创建SessionFactory
//在这个过程中,根据映射关系,在配置数据库里面把表创建出来
SessionFactory sessionFactory = configuration.buildSessionFactory();
//第三步 使用SessionFactory创建Seesion对象
//类似于jdbc中的链接
Session session = sessionFactory.openSession();
//第四步 开启事务
Transaction transaction = session.beginTransaction();
//第五步 写具体逻辑crud操作
//修改操作:修改id=3的username
//5.1根据id查询
User user = session.get(User.class, 3);
//5.2向返回的user对象里面设置修改之后的值
user.setUsername("cwpzct");
//5.3调用session的方法update修改
//执行过程:到user对象里面找到id值,根据id进行修改
session.update(user);
//有弊端的第二种方法
/*
User user = new User();
user.setId(5);
user.setUsername("tom");
session.update(user);
*/
//第六步 提交事务
transaction.commit();
//第七步 关闭资源
session.close();
sessionFactory.close();
}
删除操作
@Test
public void TestHibernate_Delete(){
//第一步 加载hibernate核心配置文件
//在src下面找到名称是hibernate.cfg.xml
//在hibernate里面配置对象(配置类的对象)
Configuration configuration = new Configuration();
configuration.configure();
//第二步 创建SessionFactory对象
//读取hibernate核心配置文件内容,创建SessionFactory
//在这个过程中,根据映射关系,在配置数据库里面把表创建出来
SessionFactory sessionFactory = configuration.buildSessionFactory();
//第三步 使用SessionFactory创建Seesion对象
//类似于jdbc中的链接
Session session = sessionFactory.openSession();
//第四步 开启事务
Transaction transaction = session.beginTransaction();
//第五步 写具体逻辑crud操作
//删除操作:删除id=3的值
//第一种根据id查询对象
User user = session.get(User.class, 3);
session.delete(user);
//第二种
/*
User user = new User();
user.setId(3);
session.delete(user);
*/
//第六步 提交事务
transaction.commit();
//第七步 关闭资源
session.close();
sessionFactory.close();
}
saveOrUpdate方法的使用
@Test
public void TestHibernate_SaveOrUpdate(){
//第一步 加载hibernate核心配置文件
//在src下面找到名称是hibernate.cfg.xml
//在hibernate里面配置对象(配置类的对象)
Configuration configuration = new Configuration();
configuration.configure();
//第二步 创建SessionFactory对象
//读取hibernate核心配置文件内容,创建SessionFactory
//在这个过程中,根据映射关系,在配置数据库里面把表创建出来
SessionFactory sessionFactory = configuration.buildSessionFactory();
//第三步 使用SessionFactory创建Seesion对象
//类似于jdbc中的链接
Session session = sessionFactory.openSession();
//第四步 开启事务
Transaction transaction = session.beginTransaction();
/*
//第五步 写具体逻辑crud操作
//添加功能
User user = new User();
user.setUsername("小明");
user.setPassword("123456");
user.setAge(17);
user.setAddress("江西南昌");
//调用session方法实现添加
//实体类对象是瞬时态,做添加
session.saveOrUpdate(user);
*/
/*
//第五步 写具体逻辑crud操作
//添加功能
User user = new User();
user.setId(5);
user.setUsername("小红");
user.setPassword("123456");
user.setAge(18);
user.setAddress("江西");
//调用session方法实现添加
//实体类对象是托管态,做修改
session.saveOrUpdate(user);
*/
//第五步 写具体逻辑crud操作
//添加功能
User user = session.get(User.class, 6);
user.setUsername("zy");
//调用session方法实现添加
//实体类对象是持久态,做修改
session.saveOrUpdate(user);
//第六步 提交事务
transaction.commit();
//第七步 关闭资源
session.close();
sessionFactory.close();
}
实体类三种对象状态
(1)瞬时态:对象里面没有id值,对象与session没有关联
(2)持久态:对象里面有id值,对象与session关联
(3)托管态:对象有id值,对象与session没有关联