hibernate和jdbc两种操作数据库的方式相比,hibernate有两个显著优点:
1.不再需要编写sql语句,而是允许采用OO(面向对象)方式来访问数据库。
2.在jdbc访问过程中大量的checked异常被包装成Hibernate的Runtime异常,从而不再要求程序必须处理所有异常。
一、创建数据库和表
1.1 创建数据库
create database hibernate_first
1.2 创建表
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
二、创建web项目
new->dynamic web project三、导入jar包
3.1 驱动包
我们操作数据库,首先要导入驱动包。本例用mysql-connector-java-5.1.7-bin.jar3.2 Hibernate包
hibernate-release-5.0.7.Final\lib\required必须的包包的简单介绍
hibernate-core-5.0.7.Final.jar核心包
hibernate-commons-annotations-5.0.1.Final.jar注解
javassist-3.18.1-GA.jar底层生成动态代理的代码
dom4j-1.6.1.jar解析xml。Hibernate底层用dom4j写了一些xml文档
2.3 日志包
slf4j-api-1.6.1.jar 日志接口包,没实现。log4j-1.2.16.jar 具体的日志的实现
slf4j-log4j12-1.7.2.jar 日志接口和日志实现桥梁
导包完成,如下图:
四、创建实体类
package com.hib.domain;
public class User {
// hibernate的实体类使用包装类,因为,默认值是null。
// 如果,使用基本数据类型,前端没传数据,默认值就是0.
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
五、创建hibernate映射配置文件(类和表结构的映射)
在JavaBean所在的包下创建映射的配置文件User.hbm.xml默认的命名规则为:实体类名.hbm.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="com.hib.domain.User" table="t_user">
<!-- 配置id和property。name属性,JavaBean的属性; column属性,表结构的属性 -->
<id name="id" column="id">
<!-- 主键生成策略 -->
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<property name="age" column="age"></property>
</class>
</hibernate-mapping>
这个配置文件里面的约束可以到如下地方导入
六、编写hibernate核心的配置文件
6.1 在src目录下,创建名称为hibernate.cfg.xml的配置文件
6.2 在XML中引入DTD约束
6.3 配置参数
hibernate-release-5.0.7.Final/project/etc/hibernate.properties,可以查看具体的配置信息* 必须配置的4大参数
#hibernate.connection.driver_class com.mysql.jdbc.Driver
#hibernate.connection.url jdbc:mysql:///test
#hibernate.connection.username gavin
#hibernate.connection.password
* 数据库的方言(必须配置的)
#hibernate.dialect org.hibernate.dialect.MySQLDialect
* 可选的配置
#hibernate.show_sql true
#hibernate.format_sql true
#hibernate.hbm2ddl.auto update
* 引入映射配置文件(一定要注意,要引入映射文件,框架需要加载映射文件)
<mapping resource="com/hib/domain/User.hbm.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">
<hibernate-configuration>
<!-- 先配置session-factory标签,一个数据库对应一个SessionFactory -->
<session-factory>
<!-- 必须配置的4大参数 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_first</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- 数据库的方言(必须配置的) -->
<!-- 方言的作用:底层用了什么数据库,告诉hibernate,hibernate会生成对应的sql语句 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 可选的配置 -->
<!-- 显示sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 生成数据库的表结构。hbm2ddl-hbm to ddl,意思是把映射文件去生成数据库定义的语言 -->
<!-- 1.create,每次都创建一张新的表。开发中不会用的。 -->
<!-- 2.create-drop,先创建,再删除。根本没什么用嘛! -->
<!-- 3.create-drop,先创建,再删除。根本没什么用嘛! -->
<!-- 4.update,如果没有表就创建。有新的字段,会添加到表中。但是javabean中少了属性,不会去删除表中的字段。对于字段,只能加,不能删 -->
<!-- 5.validate,校验javabean属性和数据库表的字段是不是一致的。 -->
<!-- 开发一般用update -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 引入映射配置文件(一定要注意,要引入映射文件,框架需要加载映射文件) -->
<mapping resource="com/hib/domain/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
七、编写Hibernate入门代码
package com.hib.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import com.hib.domain.User;
public class Demo {
@Test
public void testSave() {
/**
* 1.先加载配置文件
* 2.创建SessionFactory对象,生成Session对象。session会话去连接数据库。
* 3.创建Session对象
* 4.开启事务
* 5.编写保存的代码
* 6.提交事务
* 7.释放资源
*/
// 1.先加载配置文件
Configuration config = new Configuration();
// 默认加载src目录下hibernate.cfg.xml的配置文件
config.configure();
// 2.创建SessionFactory对象
SessionFactory factory = config.buildSessionFactory();
// 3.创建Session对象
Session session = factory.openSession();
// 4.开启事务
Transaction tx = session.beginTransaction();
// 5.编写保存的代码
User user = new User();
user.setName("tom");
user.setAge(23);
session.save(user);
// 6.提交事务
tx.commit();
// 7.释放资源
session.close();
factory.close();
}
}
执行单元测试,ok
效果如下