1.为什么使用Hibernate?
- Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
- Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作。
- Hibernate使用java的反射机制,而不是字节码增强程序类实现透明性。
- Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系
2.Hibernate(开放源代码的对象关系映射框架)简介
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
3.Jar包
- Hibernate官网下载Jar包:hibernate-release-5.2.10.Final
- 将jar包解压,把required文件夹以及optional文件夹下的jar包导入项目lib下
4.创建学生实体类(Student.java)
<strong>package org.hrbust.vo;
public class Student {
private int id;
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getage() {
return age;
}
public void setage(int age) {
this.age = age;
}
}</strong>
5.创建数据库
- 使用SQLyog操作mysql数据库
- 创建hibernate_homework数据库
- 创建student表
6.创建映射文件(xx.hbm.xml)
- 创建xml文件,命名为Student.hbm.xml(.hbm.xml后缀不变,前面为对应实体类类名)
- 打开hibernate-core-5.2.10.final.jar,找到org.hibernate包下的hiberante-mapping-3.0.dtd文件并打开
- 找到如下代码并复制到Student.hbm.xml下
- 编写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">
<!-- package对应实体类所在的包名 -->
<hibernate-mapping package="org.hrbust.vo">
<!-- name对应类名不需要加包名 table对应数据库中的表名 -->
<class name="Student" table="student">
<!-- 设置主键 name对应实体类属性名 column对应表中字段名 -->
<id name="id" column="id">
<!-- 设置主键自增 -->
<generator class="increment"/>
</id>
<!-- 设置除主键外其他属性 -->
<property name="name" column="name"/>
<property name="age" column="id"/>
</class>
</hibernate-mapping>
7.配置hibernate核心配置文件(hibernate.cfg.xml)
- 创建xml文件,命名为hiernate.cfg.xml
- 打开hibernate-core-5.2.10.final.jar,找到org.hibernate包下的hiberante-mapping-3.0.dtd文件并打开
- 找到如下代码并复制到hibernate.cfg.xml下
-
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
- 编写核心
-
<?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="driver">com.mysql.jdbc.Driver</property> <!-- 数据库连接 --> <property name="url">jdbc:mysql://localhost:3306/hibernate_homework</property> <!-- 数据库账号 --> <property name="username">root</property> <!-- 数据库密码 --> <property name="passowrd">root</property> <!-- 方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 打印SQL语句 --> <property name="hibernate.show_sql">true</property> <!-- 自动建表 --> <property name="hibernate.hbm2ddl.auto">create</property> </session-factory> </hibernate-configuration>
8.编写测试类(Test.java)
package org.hrbust.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hrbust.vo.Student;
public class Test {
Session session;
Transaction transaction;
private Test(){
session = new Configuration()
.configure() //加载hibernate.cfg.xml文件
.buildSessionFactory()//创建SessionFactory对象
.openSession(); //获得session对象
//配置事务
transaction = session.beginTransaction();
}
public static void main(String[] args) {
Test test = new Test();
Student student = new Student("孙笑川",23);
test.session.save(student);
test.transaction.commit();
//关闭事务
test.session.close();
}
}
存储成功!
9.执行程序时遇到的错误
错误1:hibernate.cfg.xml中数据库配置中property的name属性配置错误
原代码:
<!-- 数据库驱动 -->
<property name="driver">com.mysql.jdbc.Driver</property>
<!-- 数据库连接 -->
<property name="url">jdbc:mysql://localhost:3306/hibernate_homework</property>
<!-- 数据库账号 -->
<property name="username">root</property>
<!-- 数据库密码 -->
<property name="passowrd">root</property>
正确代码:
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库连接 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_homework</property>
<!-- 数据库账号 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库密码 -->
<property name="hibernate.connection.password">root</property>
错误2:一个pojo类的属性同时映射到了一个数据库的两个字段
原代码;
<!-- name对应类名不需要加包名 table对应数据库中的表名 -->
<class name="Student" table="student">
<!-- 设置主键 name对应实体类属性名 column对应表中字段名 -->
<id name="id" column="id">
<!-- 设置主键自增 -->
<generator class="increment"/>
</id>
<!-- 设置除主键外其他属性 -->
<property name="name" column="name"/>
<property name="age" column="id"/>
</class>
正确代码:
<!-- name对应类名不需要加包名 table对应数据库中的表名 -->
<class name="Student" table="student">
<!-- 设置主键 name对应实体类属性名 column对应表中字段名 -->
<id name="id" column="id">
<!-- 设置主键自增 -->
<generator class="increment"/>
</id>
<!-- 设置除主键外其他属性 -->
<property name="name" column="name"/>
<property name="age" column="age"/>
</class>