hibernate 是一个全自动 ORM 框架,也是我们常说的 SSH 中的 H,这个框架帮我们封装了很多数据库的基本方法,我们基本上是不用写任何 SQL 语句,即可完成一些简单的查询工作,但是遇到一些复杂的查询,可能还是要写 SQL 语句才可以哦
一、快速入门 hibernate 框架
1.1 原生方法操作 hibernate
使用 Maven 快速构建一个 Java 项目,并添加 mysql 驱动和 hibernate 核心依赖
<dependencies>
<!--添加hibernate的核心依赖-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.12.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
</dependency>
</dependencies>
在 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>
- 编写第一个测试程序 ```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();
}
}
- 编写方法测试 ```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(); } } ```