Hibernate-1

相当于ORM的鼻祖

比较早,学校里学过的都是挺老的吧。SS2H

  • 优缺点:

    • 全自动化

      相比mybatis是半自动化的,可以根据自己的需求定制。

      //但是洗衣机还是要选全自动的。马桶也是。

    • 简化了JDBC繁琐的代码

    • 可移植性好

      mysql,oracle什么的都可以用

    • 对面向对象特性支持良好

    • 缺点:

      • 不适合需要使用数据库的特定优化机制的情况
      • 不适合大规模的批量数据处理
    • 与mybatis比较:

      • 相对于MyBatis的”SQL-Mapping”的ORM实现,Hibernate的ORM实现更加完善,提供了对象状态管理、级联操作等功能
      • 完全面向对象,语句与数据库无关,开发者无需关注SQL的生成,开发简单,便于修改,数据库移植性好
      • 由于直接使用SQL,MyBatis使用自由度较高

第一个hibernate项目

  • 搭建Hibernate环境的步骤
    1. 引入所需的jar文件
    2. 配置hibernate.cfg.xml
    3. 创建持久化类并配置相关hbm.xml映射文件
    4. 在hibernate.cfg.xml中引入hbm.xml映射文件
  1. hibernate配置文件

resource下新建hibernate.cfg.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?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>
        <!--    数据库的url    -->
        <property name="connection.url">
            jdbc:mysql://127.0.0.1:3306/test2
        </property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!--   数据库平台:hibernate根据告知的平台来生成对应的sql     -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!--   设置session的有效范围,thread,在线程内有效     -->
        <property name="current_session_context_class">thread</property>
        <!--    设置显示自动生成的sql    -->
        <property name="show_sql">true</property>
        <!--    设置SQL语句格式化;显示对sql格式化后的内容    -->
        <property name="format_sql">true</property>
        <!--    告知hibernate映射文件的位置及具体文件    -->
        <mapping resource="cn/qf/hibernate/pojo/Dept.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>
  1. 创建实体类

    随便建一个Dept.java,封装get/set方法;

  2. 在实体类同路径下创建Dept.hbm.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?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>
        <!--    name:实体类的名字
                table:数据库中对应的表名
                dynamic-update:自动更新
        -->
        <class name="cn.qf.hibernate.pojo.Dept" table="dept" dynamic-update="true">
            <!--   主键使用id标签进行关联映射,其余属性property     -->
            <!--    实体类的属性名和字段名不需要一致    -->
            <!--   name:实体类的属性名  column:数据库中对应的字段名  type:属性的java类型     -->
            <id name="deptno" column="deptno" type="java.lang.String">
                <!--    主键的生成策略    assigned 用户自己赋值插入 使用setXXX赋值    -->
                <generator class="assigned"/>
            </id>
            <property name="dname" type="java.lang.String">
                <!--  这么写也行 -->
                <column name="dname"/>
            </property>
            <property name="loc" column="loc" type="java.lang.String"/>
        </class>
    </hibernate-mapping>
  3. 在dao下创建HibernateUtil.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    package cn.qf.hibernate.dao;
    
    

    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.classic.Session;

    public class HibernateUtil {
    // 声明hibernate的配置对象类
    private static Configuration configuration;
    //声明一个sessionFactory 创建session
    private final static SessionFactory SESSION_FACTORY;

    static {
    // 1.读取配置文件hibernate.cfg.xml并创建配置对象
    configuration = new Configuration().configure();
    //2.通过配置对象 构建工厂对象
    SESSION_FACTORY = configuration.buildSessionFactory();
    }

    // 获取session的方法
    public static Session getSession() {
    //3.通过工厂对象获取session
    return SESSION_FACTORY.getCurrentSession();
    }
    }

  4. dao下创建一个BaseDao.java(这个可有可无)

1
2
3
4
5
6
7
8
9
package cn.qf.hibernate.dao;

import org.hibernate.Session;

public class BaseDao {
public Session getSession() {
return HibernateUtil.getSession();
}
}

  1. dao下创建DeptDao.java

1
2
3
4
5
6
7
8
9
10
11
package cn.qf.hibernate.dao;

import cn.qf.hibernate.pojo.Dept;

public class DeptDao extends BaseDao {
// 添加部门方法
public void addDept(Dept dept) {
// 获取session,调用session的save方法
super.getSession().save(dept);
}
}

  1. service下创建DeptService.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    package cn.qf.hibernate.service;
    
    

    import cn.qf.hibernate.dao.DeptDao;
    import cn.qf.hibernate.pojo.Dept;
    import org.hibernate.Transaction;

    public class DeptService {
    private DeptDao dd = new DeptDao();

    //添加方法
    public boolean addDept(Dept dept) {
    //声明事务对象
    Transaction tr = null;
    //获取事务对象
    try {
    tr = dd.getSession().beginTransaction();
    dd.addDept(dept);
    //提交事务
    tr.commit();
    dd.getSession().close();
    return true;
    } catch (Exception ex) {
    tr.rollback();
    return false;
    }
    }
    }

  2. 建一个测试类试试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    package cn.qf.hibernate.test;
    
    

    import cn.qf.hibernate.pojo.Dept;
    import cn.qf.hibernate.service.DeptService;

    public class Test {
    static DeptService ds = new DeptService();

    public static void main(String[] args) {
    addDept();
    }

    public static void addDept() {
    Dept dept = new Dept();
    dept.setDeptno("123asd");
    dept.setDname("王五");
    dept.setLoc("大连市高新园区");
    boolean result = ds.addDept(dept);
    if (result) {
    System.out.println("success");
    } else {
    System.out.println("failed");
    }
    }
    }

    运行结果:

    1572503704550

  • 获取单个对象的方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //查询获取单个对象1
     public Dept loadDept(Serializable id) {
         Dept dept = (Dept) super.getSession().load(Dept.class, id);
         return dept;
     }
      
    

    //查询获取单个对象2
    public Dept getDept(Serializable id) {
    Dept dept = (Dept) super.getSession().get(Dept.class, id);
    return dept;
    }

  • get和load区别:
    get:若数据不存在,返回null;
    load:若数据不存在,使用时抛出ObjectNotFoundException异常

三种状态

1572508878109