hibernate 是一个全自动 ORM 框架,也是我们常说的 SSH 中的 H,这个框架帮我们封装了很多数据库的基本方法,我们基本上是不用写任何 SQL 语句,即可完成一些简单的查询工作,但是遇到一些复杂的查询,可能还是要写 SQL 语句才可以哦

一、快速入门 hibernate 框架

1.1 原生方法操作 hibernate

  1. 使用 Maven 快速构建一个 Java 项目,并添加 mysql 驱动和 hibernate 核心依赖

    1. <dependencies>
    2. <!--添加hibernate的核心依赖-->
    3. <dependency>
    4. <groupId>org.hibernate</groupId>
    5. <artifactId>hibernate-core</artifactId>
    6. <version>5.0.12.Final</version>
    7. </dependency>
    8. <dependency>
    9. <groupId>mysql</groupId>
    10. <artifactId>mysql-connector-java</artifactId>
    11. <version>5.1.10</version>
    12. </dependency>
    13. </dependencies>
  2. 在 resources 目录创建 hibernate.cfg.xml 的文件,作为 hibernate 框架的配置文件,并添加如下内容 ```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">
    
<session-factory>
    <!-- Database connection settings -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
      <!-- 数据库信息修改成你的 -->
    <property name="connection.url"><![CDATA[jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=utf-8]]></property>
    <property name="connection.username">root</property>
    <property name="connection.password">root</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>

    <!-- SQL dialect ,定义数据库方言-->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>

</session-factory>


3. 我们随便创建一个数据库,并加一个测试表 account

![image.png](https://cdn.nlark.com/yuque/0/2020/png/473179/1590326533921-eb5f798d-6de7-4bb1-b122-567a8e930659.png#align=left&display=inline&height=143&margin=%5Bobject%20Object%5D&name=image.png&originHeight=143&originWidth=888&size=97942&status=done&style=none&width=888)

4. 使用 hibernate 逆向工程生成 entity 和 对应的配置文件(这个自行百度,有方法教程的)

实体类<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/473179/1590325984582-72f1c11b-6444-47f9-b9cb-4e67119b64a1.png#align=left&display=inline&height=120&margin=%5Bobject%20Object%5D&name=image.png&originHeight=120&originWidth=277&size=28938&status=done&style=none&width=277)<br />AccountEntity.hbm.xml 配置文件也要放到 resources 目录下
```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.gorit.entity.AccountEntity" table="account" schema="test">
        <id name="id">
            <column name="id" sql-type="int(11)" length="11"/>
            <generator class="native"/>
        </id>
        <property name="name">
            <column name="name" sql-type="varchar(40)" length="40"/>
        </property>
        <property name="money">
            <column name="money"/>
        </property>
    </class>

</hibernate-mapping>
  1. 编写第一个测试程序 ```java package cn.gorit.test;

import cn.gorit.entity.AccountEntity; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration;

// hibernate 原始方式加载 public class Test { public static void main(String[] args) { // hibernate 配置对象 Configuration cf = new Configuration().configure(); // 通过配置对象建立 session 的工厂 SessionFactory sf = cf.buildSessionFactory(); // 通过 session 的工厂得到 session Session session = sf.openSession(); AccountEntity account = new AccountEntity(12,”张三”,1232.4); // hibernate 的事物不是隐式事物,需要手动提交 // 开启事物 Transaction t = session.beginTransaction(); // 保存 session.save(account); // 提交事物 t.commit(); // 关闭资源 session.close(); } }

当你看到如下字样,就说明添加数据成功了。<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/473179/1590326676052-1f436c7b-712c-48ee-bfff-cf6f656a8576.png#align=left&display=inline&height=324&margin=%5Bobject%20Object%5D&name=image.png&originHeight=324&originWidth=1022&size=220005&status=done&style=none&width=1022)
<a name="cn17m"></a>
### 1.2 借用工具类操作 hibernate

1. 我们编写一个操作 hibernate 的工具类,并命名为 HibernateUtils
```java
package cn.gorit.util;

import org.hibernate.Session;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
    private static org.hibernate.SessionFactory sessionFactory;

    private static Configuration configuration = new Configuration();
    private static StandardServiceRegistry serviceRegistry;

    static {
        try {
            configuration.configure("hibernate.cfg.xml");
            serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        } catch (Exception e) {
            System.err.println("%%%% Error Creating SessionFactory %%%%");
            e.printStackTrace();
        }
    }

    /**
     * 获取session,所有的hibernate操作均基于session进行
     * @return
     */
    public static Session getSession(){
        return sessionFactory.openSession();
    }
}
  1. 编写方法测试 ```java package cn.gorit.test1;

import cn.gorit.entity.AccountEntity; import cn.gorit.entity.DbUserEntity; import cn.gorit.util.HibernateUtils; import netscape.security.UserTarget; import org.hibernate.Session; import org.hibernate.Transaction;

public class test { public static void main(String[] args) { Session session = HibernateUtils.getSession(); // Transaction t = session.beginTransaction(); // 查询不需要事物 AccountEntity accountEntity = new AccountEntity(); // 根据 ID 主键获取信息 accountEntity = session.get(AccountEntity.class, 1); // t.commit(); System.out.println(accountEntity); session.close(); } } ``` image.png

二、hibernate 之增删改查操作

2.1 增加之 session.save(xxx) 方法

2.2 更新之 session.update(xxx) 方法

2.3 删除之 session.delete(xxx) 方法

2.4 查询之 session.get(xx) 方法