Hibernate——入门

一、基础

参考:https://mp.weixin.qq.com/s/OYSczfpZQf1xbhApcbYEKg

1.1 ORM概述

ORM:是一种思想。关注是对象与数据库中的列的关系
O代表的是Objcet。
R代表的是Relative。
M代表的是Mapping。
在这里插入图片描述

1.2 Hibernate框架

含义:Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping。
目的:在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象!
——关于Java对象和关系数据库之间的联系<==>MVC中的数据持久层->在编写程序中的DAO层。

常用实现DAO层:
——在DAO层操作XML,将数据封装到XML文件上,读写XML文件数据实现CRUD
——在DAO层使用原生JDBC连接数据库,实现CRUD
——嫌弃JDBC的Connection\Statement\ResultSet等对象太繁琐,使用对原生JDBC的封装组件–>DbUtils组件
使用DbUtils组件实现DAO层。

public class CategoryDAOImpl implements CategoryDao {
    @Override
    public void addCategory(Category category) {
        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
        String sql = "INSERT INTO category (id, name, description) VALUES(?,?,?)";
        try {
            queryRunner.update(sql, new Object[]{category.getId(), category.getName(), category.getDescription()});
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    @Override
    public Category findCategory(String id) {
        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
        String sql = "SELECT * FROM category WHERE id=?";
        try {
            Category category = (Category) queryRunner.query(sql, id, new BeanHandler(Category.class));
            return category;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    @Override
    public List<Category> getAllCategory() {
        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
        String sql = "SELECT * FROM category";
        try {
            List<Category> categories = (List<Category>) queryRunner.query(sql, new BeanListHandler(Category.class));
            return categories;
        } catch (SQLException e) {
            throw  new RuntimeException(e);
        }
    }
}

使用DbUtils编写DAO层代码的规律;
1、当插入数据时,将JavaBean对象拆分,拼装成SQL语句。
2、当查询数据时,用SQL把数据库表中的列组合,拼装成JavaBean对象。
3、即javaBean对象和数据表中的列存在映射关系!
Hibernate实现了程序能够自动生成SQL语句,简化开发。

1.3 学习一个框架的三个步骤

1、引入jar开发包。
2、配置相关的XML文件
3、熟悉API

二、Hibernate快速入门

2.1 搭建环境

2.1.1 引入相关jar包

jar包含义
hibernate3.jarHibernate3核心包
antlr-2.7.6.jarrequired 必须引入的(6个)
commons-collections-3.1.jarrequired 必须引入的(6个)
dom4j-1.6.1.jarrequired 必须引入的(6个)
slf4j-api-1.6.1.jarrequired 必须引入的(6个)
javassist-3.12.0.GA.jarrequired 必须引入的(6个)
jta.jarrequired 必须引入的(6个)
hibernate-jpa-2.0-1.0.0.Final.jarjpa
mysql-connector-java-5.1.7-bin.jar数据库驱动包

2.1.2 Hibernate主配置文件

路径:放在src目录下的。
hibernate.cfg.xml

<hibernate-configuration>
    <!-- 通常,一个session-factory节点代表一个数据库 -->
    <session-factory>
        <!-- 1. 数据库连接配置 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///zhongfucheng</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <!--
            数据库方法配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql
         -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!-- 2. 其他相关配置 -->
        <!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 2.2 格式化sql -->
        <property name="hibernate.format_sql">true</property>
        <!-- 2.3 自动建表  -->
        <property name="hibernate.hbm2ddl.auto">create</property>
        
        <!--3. 加载所有映射-->
        <mapping resource="zhongfucheng/domain/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

2.2 编写对象和对象映射

对象
User.java

public class User {
    private int id;
    private String username;
    private String password;
    private String cellphone;
    //各种setter和getter
}

对象映射。
路径:一般它和JavaBean对象放在同一目录下。
创建User.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.my.entity">
    <!--类名为User,表名为user-->
    <class name="User"  table="user">
        <!--主键映射,属性名为id,列名为id-->
        <id name="id" column="id">
            <!--根据底层数据库主键自动增长-->
            <generator class="native"/>
        </id>
        <!--非主键映射,属性和列名一一对应-->
        <property name="username" column="username"/>
        <property name="cellphone" column="cellphone"/>
        <property name="password" column="password"/>
    </class>
</hibernate-mapping>

注册User.hbm.xml。
hibernate.cfg.xml

<mapping resource="zhongfucheng/domain/User.hbm.xml"/>

2.3 测试

User.java

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
public class App {
    public static void main(String[] args) {
     	// 获取加载配置管理类
        Configuration configuration = new Configuration();
        //不给参数就默认加载hibernate.cfg.xml文件,
        configuration.configure();
        //创建Session工厂对象
        SessionFactory factory = configuration.buildSessionFactory();
        //得到Session对象
        Session session = factory.openSession();
        //使用Hibernate操作数据库,都要开启事务,得到事务对象
        Transaction transaction = session.getTransaction();
        //开启事务
        transaction.begin();
        
        //===========创建对象==========
        User user = new User();
        user.setPassword("123");
        user.setCellphone("122222");
        user.setUsername("nihao");       
        //把对象添加到数据库中
        session.save(user);
        
        // 提交事务
        transaction.commit();
        // 关闭Session
        session.close();
    }
}

三、常用类及方法

3.1 Configuration类

配置管理类:主要管理配置文件的一个类。
它拥有一个子类AnnotationConfiguration,即可以使用注解来代替XML配置文件来配置相对应的信息。

3.1.1 configure方法

作用:configure()方法用于加载配置文件。
加载主配置文件的方法
——若指定参数,则加载参数的路径配置文件
——若未指定参数,默认加载src/目录下的hibernate.cfg.xml。

3.1.2 buildSessionFactory方法

作用:buildSessionFactory()用于创建Session工厂。

3.2 SessionFactory类

作用:Session的工厂,也可以说代表了hibernate.cfg.xml这个文件。

3.2.1 openSession方法

作用:创建一个Session对象。

3.2.2 getCurrentSession方法

作用:创建Session对象或取出Session对象。

3.3 Session类

作用:Session是Hibernate最重要的对象,Session维护了一个连接(Connection),只要使用Hibernate操作数据库,都需要用到Session对象。

3.3.1 更新操作

作用:对数据库的更新。
session.save(obj); 保存一个对象。
session.update(obj); 更新一个对象。
session.saveOrUpdate(obj); 保存或者更新的方法。
——没有设置主键,执行保存
——有设置主键,执行更新操作
——如果设置主键不存在报错

3.3.2 主键查询

作用:通过主键来查询数据库的记录,从而返回一个JavaBean对象。
session.get(javaBean.class, int id); 传入对应的class和id就可以查询。
session.load(javaBean.class, int id); 支持懒加载。

3.3.3 HQL查询

HQL:hibernate query language。hibernate提供的面向对象的查询语言。
——查询的是对象以及对象的属性。
——因此区分大小写!
SQL:Struct query language 。结构化查询语言。
——查询的是表以及列。
——因此不区分大小写!
1、HQL是面向对象的查询语言,可以用来查询全部的数据!

String hql = "FROM User";
Query query = session.createQuery(hql);
List<User> list = query.list();
transaction.commit();
session.close();

2、HQL是面向对象的查询语言,可以传递参数进去查询!

String hql = "FROM User WHERE id = ?";
Query query = session.createQuery(hql);
// 注意:此处?从0开始,jdbc中从1开始。
query.setParameter(0,user.getId());
List<User> list = query.list();
transaction.commit();
session.close();

3.3.4 QBC查询

QBC查询: query by criteria 。 完全面向对象的查询。
HQL查询是需要SQL的基础的,因为还是要写少部分的SQL代码。QBC查询就是完全的面向对象查询,但比较少使用。

// 创建Criteria对象
Criteria criteria = session.createCriteria(User.class);
// 添加条件。
criteria.add(Restrictions.eq("id",1));
// 查询全部数据
List<User> list = criteria.list();

3.3.5 本地SQL查询

若SQL是非常复杂的,不能靠HQL查询来实现功能的话,就需要使用原生的SQL了!
原生的SQL缺陷:不能跨平台。因此,在主配置文件中配置了数据库的“方言“。

SQLQuery sqlQuery = session.createSQLQuery(SELECT * FROM user).addEntity(User.class);
List<User> list = sqlQuery.list();

3.3.6 beginTransaction方法

作用:开启事务,返回的是一个事务对象。
Hibernate规定所有的数据库操作都必须在事务环境下进行,否则报错!

四、主配置文件

主配置文件主要配置:
——数据库的信息
——其他参数
——加载映射文件
常用的配置信息都可以在hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties目录下可以找到。

4.1 数据库信息

常用的配置信息都可以在hibernate.properties文件中找到。

<!-- 1. 数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hib_demo</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- 
数据库方法配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql【大致可以理解成:不同的版本对应的SQL不同】
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

4.2 其他参数信息

<!-- 2. 其他相关配置 -->
<!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 2.2 格式化sql -->
<property name="hibernate.format_sql">true</property>
<!-- 2.3 自动建表  -->
<property name="hibernate.hbm2ddl.auto">update</property>

create-drop :每次在创建sessionFactory时候执行创建表。当调用sesisonFactory的close方法的时候,删除表!
create :每次都重新建表; 如果表已经存在就先删除再创建
update :如果表不存在就创建; 表存在就不创建;
validate :(生成环境时候) 执行验证: 当映射文件的内容与数据库表结构不一样的时候就报错!

4.3 加载映射文件

4.3.1 通过主配置文件的方式

<!--3. 加载映射文件-->
<mapping resource="com/my/entity/User.hbm.xml"/>

4.3.2 通过程序的方式

前提:
1、映射配置文件和JavaBean对象是放在同一个包下的。
2、映射文件的命名是有规范的。

//获取加载配置管理类
Configuration configuration = new Configuration();
//加载User的映射文件!
configuration.configure().addClass(User.class);

因此,Hibernate是可以通过提供的JavaBean对象从而找到相对应的映射文件!
一般地,在测试时,使用程序的方式去加载映射文件【方便】。

4.4 映射配置文件

映射文件: 映射一个实体类对象。 描述一个对象最终实现可以直接保存对象数据到数据库中。
通常地,我们都是一个JavaBean对象对应一个映射配置文件,并且配置文件和JavaBean对象是放在同一个目录下的

4.4.1 hibernate-mapping标签

常用的属性
package = “要映射的对象所在的包”。可选,如果不指定,此文件所有的类都要指定全路径。
auto-import = “true”。
——默认为true, 在写hql的时候自动导入包名。常用。
——false时, 再写hql的时候必须要写上类的全名。

4.4.2 class标签

class 映射某一个对象的(一般情况,一个对象写一个映射文件,即一个class节点)
常用的属性
name= “指定要映射的对象的类”。
table = “指定对象对应的表”。若没有指定,默认与对象名称一样。

4.4.3 property标签

property是普通属性的映射,即JavaBean普通的成员变量属性就使用property来描述!
常用的属性
name= " 指定对象的属性名称"。
column = “指定对象属性对应的表的字段名称”。若不写,默认与对象属性一致。
length = " 指定字符的长度"。默认为255。
type = “指定映射表的字段的类型”。若不指定,会匹配属性的类型。
——java类型: 必须写全名【例:java.lang.String】
——hibernate类型: 直接写类型,都是小写
注意:如果列名称为数据库关键字,需要用反引号或改列名。通常情况下,禁止使用关键字作为列名。

4.4.4 id标签

id是主键映射
常用的属性
name= " 指定对象的属性名"。
column = “指定对象属性对应的表的字段名称”。

< id>节点下还有子节点< generator class=“主键的自动生成策略”/>

主键的自动生成策略含义
identity自增长(mysql,db2)
sequence自增长(序列), oracle中自增长是以序列方法实现。
native自增长【会根据底层数据库自增长的方式选择identity或sequence】。
increment自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题。)。
assigned指定主键生成策略为手动指定主键的值
uuid指定主键生成策略为UUID生成的值
foreign外键的方式

4.4.5 composite-id标签

主键一般分为两种:
——单列主键。只有一个主键。
——多列复合主键。有多个主键。
需求:使用username和password作为复合主键。
第一步:将username和password抽取成一个类。
CompositeKey.java

// 必须实现Serializable接口
public class CompositeKey  implements Serializable{
    private String username;
    private String password;
	//各种setter和getter方法 
}

第二步:指定一个变量来维护这个主键对象。
User2.java

public class User2 {
    //在User对象中维护这个主键对象
    private CompositeKey key;
    private String cellphone;
   //各种setter和getter方法 
}

第三步:实体映射文件
User2.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.my.entity">
    <class name="User2"  table="user2">
        <id name="id" column="id">
            <generator class="native"/>
        </id>
        <composite-id>
            <key-property name="username" type="string" column="username"/>
            <key-property name="password" type="string" column="password"/>
        </composite-id> 
        <property name="cellphone" column="cellphone"/>
    </class>
</hibernate-mapping>

第四步:测试

public static void main(String[] args) {
	//获取加载配置管理类
	Configuration configuration = new Configuration();
	//加载User的映射文件!
	configuration.configure().addClass(User2.class);
	//创建Session工厂对象
	SessionFactory factory = configuration.buildSessionFactory();
	//得到Session对象
	Session session = factory.openSession();
	//使用Hibernate操作数据库,都要开启事务,得到事务对象
	Transaction transaction = session.getTransaction();
	//开启事务
	transaction.begin();
	//创建对象
	User2 user2 = new User2();
	CompositeKey compositeKey = new CompositeKey();
	compositeKey.setUsername("123");
	compositeKey.setPassword("123");
	user2.setCellphone("111");
	user2.setKey(compositeKey);
	//添加User2对象到数据库
	session.save(user2);
	//提交事务
	transaction.commit();
	//关闭Session
	session.close();
}

五、Hibernate执行流程图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值