近期工作中遇到一个项目的功能优化,由于其持久层框架使用的是Hibernate,而我熟悉的框架是Mybatis,所以趁着周末,学习了一下Hibernate,并用其实现了基本的CRUD。
个人感觉Mybatis和Hibernate最大的区别是Hibernate不用建立Mappers映射文件(其中存放自己写的sql语句,如UserMapper.xml),而且也不用自己去定义接口(与Mappers中的文件形成映射,如UserMapper.java)。使用Hibernate只需创建session即可实现各项操作,但是前期的准备工作就响应的多一点,比如要在xxx.hbm.xml文件中配置java对象的属性与数据库表中字段的映射关系,但是不用自己写sql语句就没有那么灵活了,可谓各有利弊吧。
下面简单介绍Hibernate的两大配置文件:
1.核心配置文件——hibernate.cfg.xml(主要描述Hibernate的相关配置)
<?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的配置文件,位置:src目录下-->
<hibernate-configuration>
<!-- sessionFactory类似于DataSource -->
<session-factory>
<!-- 1 连接数据库参数 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">
<!-- 此字符串不能写为jdbc:mysql://localhost:3306/daycode?useUnicode=true&characterEncoding=utf8,
不然会出现编译错误 -->
<![CDATA[jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8]]>
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 可以将向数据库发送的SQL语句显示出来 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 2 hibernatse的环境配置 -->
<!-- hibernate的方言,指定hibernate生成的SQL语句的数据库版本 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 3 ORM映射信息 -->
<mapping resource="com/demo/entity/Person.hbm.xml" />
</session-factory>
</hibernate-configuration>
2.映射配置文件——xxx.hbm.xml(建立表与类之间的映射关系)
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<!-- DO NOT EDIT: This is a generated file that is synchronized -->
<!-- by MyEclipse Hibernate tool integration. -->
<!--位置:实体类所在包下 -->
<hibernate-mapping package="com.demo.entity">
<!-- name:即实体类的全名 table:映射到数据库里面的那个表的名称 catalog:数据库的名称 -->
<class name="Person" table="person" catalog="test">
<!-- class下必须要有一个id的子元素 -->
<!-- id是用于描述主键的 -->
<id name="id" column="id" type="integer">
<!-- 主键生成策略 -->
<generator class="native" />
</id>
<!-- 使用property来描述属性与字段的对应关系 如果length忽略不写,且你的表是自动创建这种方案,那么length的默认长度是255 -->
<property name="name" column="name" type="string" />
<property name="age" column="age" type="integer" />
</class>
</hibernate-mapping>
开发步骤:
1.导包:去官网下载压缩文件(点此下载),我下载的是这个版本:hibernate-release-5.2.10.Final
解压后将hibernate-release-5.2.10.Final\lib\required包下所有jar包拷贝到项目的lib文件夹下,还不够!
还要添加:mysql-connector-java-5.1.37.jar(必须的!)、activation-1.1.jar、jaxb-api-2.1.jar、jaxb-impl-2.1.2.jar
2.创建实体类Person
3.数据库中创建表t_person
4.测试:
package com.demo.test;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import com.demo.entity.Person;
public class HibernateTest{
// 保存一个Person
@Test
public void savePersonTest() {
// 创建一个Person
Person c = new Person();
c.setId(1);
c.setName("叶子");
c.setAge(20);
// 使用Hibernate的API来完成将Person信息保存到mysql数据库中的操作
Configuration config = new Configuration().configure(); // Hibernate框架加载hibernate.cfg.xml文件
SessionFactory sessionFactory = config.buildSessionFactory();
//Session session = sessionFactory.getCurrentSession();
Session session = sessionFactory.openSession(); // 相当于得到一个Connection
// 开启事务
session.beginTransaction();
// 操作
session.save(c);
// 事务提交
session.getTransaction().commit();
session.close();
sessionFactory.close();
}
// 根据id查询一个Person对象
@Test
public void findPersonByIdTest() {
Configuration config = new Configuration().configure(); // Hibernate框架加载hibernate.cfg.xml文件
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession(); // 相当于得到一个Connection
// 开启事务
session.beginTransaction();
// 根据业务来编写代码
// Person c = session.get(Person.class, 1);
Person c = session.load(Person.class, 3);
System.out.println(c);
// 事务提交
session.getTransaction().commit();
session.close();
sessionFactory.close();
}
// 修改操作
@Test
public void updatePersonTest() {
Configuration config = new Configuration().configure(); // Hibernate框架加载hibernate.cfg.xml文件
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession(); // 相当于得到一个Connection
// 开启事务
session.beginTransaction();
// 根据业务来编写代码
Person c = session.get(Person.class, 4);
c.setName("郑敏");
session.update(c); // 修改操作
// 事务提交
session.getTransaction().commit();
session.close();
sessionFactory.close();
}
// 删除操作---根据id进行删除
@Test
public void deletePersonTest() {
Configuration config = new Configuration().configure(); // Hibernate框架加载hibernate.cfg.xml文件
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession(); // 相当于得到一个Connection
// 开启事务
session.beginTransaction();
// 根据业务来编写代码
Person c = session.get(Person.class,6);
session.delete(c); // 删除操作
// 事务提交
session.getTransaction().commit();
session.close();
sessionFactory.close();
}
// 查询所有Person
@Test
public void findAllPersonTest() {
Configuration config = new Configuration().configure(); // Hibernate框架加载hibernate.cfg.xml文件
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession(); // 相当于得到一个Connection
// 开启事务
session.beginTransaction();
// 根据业务来编写代码
Query query = session.createQuery("from Person"); // HQL语句,它类似于SQL语句
List<Person> list = query.list();
System.out.println(list);
// 事务提交
session.getTransaction().commit();
session.close();
sessionFactory.close();
}
}
参考文章:hibernate快速入门