本文主要介绍 hibernate 的入门,主要包括以下内容:hibernate 介绍、hibernate 环境搭建、hibernate 简单测试、测试涉及的 api 详解。
JDBC 是 Java 操作数据库的工具,我们可以使用 jdbc 来书写并执行 sql 语句来操作数据库,对于普通的业务,jdbc 工具是完全可以胜任的,但但当任务复杂,特别是数据库中表格很多的时候,jdbc 就会显得力不从心,代码复用率低且 sql 语句容易出错。
Hibernate 框架从 jdbc 面向过程操作数据库的过程转变为面向对象来操作数据库。其原理是 ORM 编程,即 Object Relational Mapping(对象关系映射)。每一个数据库表对应一个实体类,这个实体类通过映射关系来操作这个数据库表,映射可以理解为平常我们所说的函数,如 y=f(x);y 是数据库中的表,x 是实体类,f(x) 即映射关系,我们通过操作 x 可以改变 y 值,同样的操作实体类便可以达到操作数据库的目的,这就是通过面向对象方式来操作数据库。
hibernate 的环境搭建包括以下部分:1、导入运行环境需要的 jar 包;2、创建数据库表和对应的实体类;3、编写表和实体之间的映射关系(也叫 orm 元数据);4、编写主配置文件 hibernate.cfg.xml
搜索下载压缩包:hibernate-release-5.0.7.Final.zip 就可以找到相应的 jar 包:
注:不要忘了导入数据库驱动包(这里我使用的是 mysql 数据库),所以还需导入:
这里假设我们创建了 user 表:
- CREATE TABLE `user` (
- `uid` bigint(32) NOT NULL AUTO_INCREMENT,
- `uname` varchar(32) NOT NULL,
- PRIMARY KEY (`uid`)
- )
实体类:User
- package domain;
- public class User {
- private Long uid;
- private String uname;
- public Long getUid() {
- return uid;
- }
- public void setUid(Long uid) {
- this.uid = uid;
- }
- public String getUname() {
- return uname;
- }
- public void setUname(String uname) {
- this.uname = uname;
- }
- @Override
- public String toString() {
- return "User [uid=" + uid + ", uname=" + uname + "]";
- }
- }
1)导入 dtd 约束
hibernate 框架使用的是 xml 文件作为配置文件,所以在编写 xml 文件之前需要先导入 dtd 约束(该约束文件也在上面使用到的压缩包里)
导入方式:eclipse-->Preferences-->xml-->XML Catalog-->add
两个文件都添加完成后你的 eclipse 中有了这个 dtd 约束了,如果你的 eclipse 已经有了该 dtd 约束上面的步骤就可以忽略。
2)配置映射关系: User.hbm.xml
一般该文件的命名格式为(当然你可以随意命名):类名. hbm.xml。且放在和该实体类同一个目录下。
xml 简写版:
- xml version="1.0" encoding="UTF-8"?>
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- package="domain" >
- name="User" table="user" >
- name="uid" >
- class="native">
- name="uname" column="uname" >
xml 注释版:
- xml version="1.0" encoding="UTF-8"?> "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> package="domain" > 2.1 class元素: 配置实体与表的对应关系的 name: 完整类名 table:数据库表名 --> name="User" table="user" > name: 填写主键对应属性名 column(可选): 填写表中的主键列名.默认值:列名会默认使用属性名 type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型. 每个类型有三种填法: java类型|hibernate类型|数据库类型 not-null(可选):配置该属性(列)是否不能为空. 默认值:false length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度 --> name="uid" > class="native"> name: 填写属性名 column(可选): 填写列名 type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型. 每个类型有三种填法: java类型|hibernate类型|数据库类型 not-null(可选):配置该属性(列)是否不能为空. 默认值:false length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度 --> name="uname" column="uname" >
主配置文件一般是整体环境的配置一些数据库操作设置。主要分为:1、必要配置:数据库驱动等配置;2、可选配置;3、引入 orm 元数据:指定要操作的关系映射。
一般主配置文件都以 hibernate.xfg.xml 来命名(这样我们在使用时可以直接使用无参方法调用,比较方便)。且需要将文件放到 src 目录下。
hebernate.cfg.xml 简写版:
- xml version="1.0" encoding="UTF-8"?>
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
- #hibernate.dialect org.hibernate.dialect.MySQLDialect
- #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
- #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
- #hibernate.connection.driver_class com.mysql.jdbc.Driver
- #hibernate.connection.url jdbc:mysql:///test
- #hibernate.connection.username gavin
- #hibernate.connection.password
- com.mysql.jdbc.Driver
- jdbc:mysql:///hibernate
- root
- password
- org.hibernate.dialect.MySQLDialect
- true
- true
- update
hebernate.cfg.xml 注释版:
- xml version="1.0" encoding="UTF-8"?> "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> #hibernate.dialect org.hibernate.dialect.MySQLDialect #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect #hibernate.connection.driver_class com.mysql.jdbc.Driver #hibernate.connection.url jdbc:mysql:///test #hibernate.connection.username gavin #hibernate.connection.password com.mysql.jdbc.Driver jdbc:mysql:///hibernate root password org.hibernate.dialect.MySQLDialect true true update
到这里我们的 hibernate 环境就搭建完成了,刚开始感觉很多,用多了其实就很可以很快 copy 这些文件然后改改就 o 了。
1)Demo 测试类:
- package test;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.cfg.Configuration;
- import org.junit.Test;
- import domain.User;
- public class Demo {
- @Test
- //使用hibernate框架,通过操作User对象往user表中插入一条数据。
- public void addUser() {
- //操作涉及的核心类
- Configuration config = new Configuration().configure();
- SessionFactory factory = config.buildSessionFactory();
- Session session = factory.openSession();
- Transaction tx = session.beginTransaction();
- //操作User
- //-----------------------
- User user = new User();
- user.setUid(1l);
- user.setUname("张三");
- session.save(user); //执行
- //-----------------------
- //关闭资源
- tx.commit();
- session.close();
- factory.close();
- }
2)执行结果:
- //1 创建,调用空参构造
- Configuration conf = new Configuration().configure();
- //2 根据配置信息,创建 SessionFactory对象
- SessionFactory sf = conf.buildSessionFactory();
- //3 获得session
- Session session = sf.openSession();
- //4 session获得操作事务的Transaction对象
- //获得操作事务的tx对象
- Transaction tx = session.getTransaction();
- tx.begin();
- //开启事务并获得操作事务的tx对象(建议使用)
- Transaction tx2 = session.beginTransaction();
- //----------------------------------------------
- //1 获得要修改的对象
- User u = session.get(User.class, 1l);
- //2 调用delete删除对象
- session.delete(u);
- //----------------------------------------------
- tx2.commit(); //提交事务
- session.close(); //释放资源
- sf.close(); //释放资源
除了虚线 //----------------- 之间的操作部分,上下两部分一般都是固定不变的。所以我们可以使用工具类进行抽取,以提高代码复用率:
HibernateUtils:
- package utils;
- import org.hibernate.HibernateException;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- public class HibernateUtils {
- // 会话工厂,以单例方式管理
- private static SessionFactory sessionFactory;
- // ThreadLocal存储session
- private static ThreadLocal < Session > session = new ThreadLocal < Session > ();
- // 以单例方式管理sessionFactory
- static {
- try {
- sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
- } catch(HibernateException e) {
- e.printStackTrace();
- throw new HibernateException("初始化会话工厂失败!");
- }
- }
- //得到一个单例的会话工厂
- public static SessionFactory getSessionFactory() {
- return sessionFactory;
- }
- //获取一个新session
- public static Session openSession() {
- return sessionFactory.openSession();
- }
- public static Session getCurrentSession() throws HibernateException {
- return sessionFactory.getCurrentSession();
- }
- public static void closeSession() throws HibernateException {
- sessionFactory.getCurrentSession().close();
- }
- }
来源: http://www.cnblogs.com/fzz9/p/8035007.html