Hibernate之体验

2019-09-29  本文已影响0人  紫荆秋雪_文

一、OR Mapping

1、对象关系映射(Object Relational Maapping,简称ORM)

对象关系映射是一种为了解决面向对象中属性名与关系数据库中字段存在互不匹配的现象。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中。避免直接使用SQL语句对关系型数据库中的数据进行操作,减少代码编写量。

2、ORM主要解决对象-关系的映射

3、ORM的实现思想

将关系数据库中表的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。

4、ORM采用元数据来描述对象-关系映射细节

元数据通常采用XML格式,并且存放在专门的对象-关系映射文件中。

5、流行的ORM框架

二、Hibernate概述

Hibernate是一款优秀的开源的Java对象持久层轻量级封装框架,即可以在Java应用程序中取代大部分JDBC代码,也可以整合到J2EE系统中作为持久层的解决方案。
Hibernate本身是基于JDBC,对JDBC访问访问数据库做了抽象和封装。

三、Hibernate初体验

1、jar包

2、hibernate.cfg.xml

<!--
  ~ Hibernate, Relational Persistence for Idiomatic Java
  ~
  ~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
  ~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
  -->
<!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="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!--数据库驱动类名-->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        
        <!--数据库连接账户-->
        <property name="hibernate.connection.url">jdbc:mysql:///hibernateDemo?useSSL=true&amp;serverTimezone=UTC</property>

        <!--数据库连接账户-->
        <property name="hibernate.connection.username">root</property>

        <!--数据库连接密码-->
        <property name="hibernate.connection.password">admin</property>

        <!--引用xml-->
        <mapping resource="com/revanwang/_01/crud/domain/User.hbm.xml"/>

    </session-factory>
</hibernate-configuration>
<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.revanwang._01.crud.domain">

    <class name="User" table="t_user">
        <id name="id" column="id">
            <generator class="native"></generator>
        </id>

        <property name="name" column="name"/>
        <property name="date" column="date"/>
    </class>

</hibernate-mapping>

四、CRUD操作

User.java(domain)

package com.revanwang._01.crud.domain;

import lombok.Data;
import java.util.Date;

@Data
public class User {
    private Long id;
    private String name;
    private Date date;
}

IUserDAO.java

package com.revanwang._01.crud.dao;

import com.revanwang._01.crud.domain.User;

import java.util.List;

public interface IUserDAO {

    void save(User user);

    void delete(User user);

    void update(User user);

    User get(Long id);

    List<User> getList();

}

UserDAOImpl.java

package com.revanwang._01.crud.dao.impl;

import com.revanwang._01.crud.dao.IUserDAO;
import com.revanwang._01.crud.domain.User;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import java.util.List;

public class UserDAOImpl implements IUserDAO {
    @Override
    public void save(User user) {
        //1、创建配置对象
        Configuration cfg = new Configuration();
        //2、读取配置文件
        cfg.configure("/hibernate.cfg.xml");
        //3、创建SessionFactory
        SessionFactory sessionFactory = cfg.buildSessionFactory();
        //4、获取Session
        Session session = sessionFactory.openSession();
        //5、设置事务的开启状态
        session.beginTransaction();
        //6、具体操作
        session.save(user);
        //7、提交事务
        session.getTransaction().commit();
        //8、关闭Session
        session.close();
        //9、关闭SessionFactory
        sessionFactory.close();
    }

    @Override
    public void delete(User user) {
        //1、创建配置对象
        Configuration cfg = new Configuration();
        //2、读取配置文件
        cfg.configure("/hibernate.cfg.xml");
        //3、创建SessionFactory
        SessionFactory sessionFactory = cfg.buildSessionFactory();
        //4、获取Session
        Session session = sessionFactory.openSession();
        //5、设置事务的开启状态
        session.beginTransaction();
        //6、具体操作
        session.delete(user);
        //7、提交事务
        session.getTransaction().commit();
        //8、关闭Session
        session.close();
        //9、关闭SessionFactory
        sessionFactory.close();
    }

    @Override
    public void update(User user) {
        //1、创建配置对象
        Configuration cfg = new Configuration();
        //2、读取配置文件
        cfg.configure("/hibernate.cfg.xml");
        //3、创建SessionFactory
        SessionFactory sessionFactory = cfg.buildSessionFactory();
        //4、获取Session
        Session session = sessionFactory.openSession();
        //5、设置事务的开启状态
        session.beginTransaction();
        //6、具体操作
        session.update(user);
        //7、提交事务
        session.getTransaction().commit();
        //8、关闭Session
        session.close();
        //9、关闭SessionFactory
        sessionFactory.close();
    }

    @Override
    public User get(Long id) {
        //1、创建配置对象
        Configuration cfg = new Configuration();
        //2、读取配置文件
        cfg.configure("/hibernate.cfg.xml");
        //3、创建SessionFactory
        SessionFactory sessionFactory = cfg.buildSessionFactory();
        //4、获取Session
        Session session = sessionFactory.openSession();
        //5、具体的查询操作
        User user = session.get(User.class, id);
        System.out.println(sessionFactory + "\n" + session);
        //6、关闭Session
        session.close();
        //7、关闭SessionFactory
        sessionFactory.close();
        return user;
    }

    @Override
    public List<User> getList() {
        //1、创建配置对象
        Configuration cfg = new Configuration();
        //2、读取配置文件
        cfg.configure("/hibernate.cfg.xml");
        //3、创建SessionFactory
        SessionFactory sessionFactory = cfg.buildSessionFactory();
        //4、获取Session
        Session session = sessionFactory.openSession();
        //5、具体的查询操作
        String hql = "SELECT u FROM User u";
        Query query = session.createQuery(hql);
        List<User> userList = query.list();
        //6、关闭Session
        session.close();
        //7、关闭SessionFactory
        sessionFactory.close();
        return userList;
    }
}

执行流程 Hibernate执行流程.png

1、save方法的执行流程

session.save(user)
SQL:
INSERT INTO t_user (name, date) VALUES(?, ?, ?)

步骤:

INSERT INTO t_user (name, date) VALUES(?, ?)
设置占位符
user.getName, user.getDate

2、get方法的执行流程

session.get(User.class, 1L)
SQL:
SELECT * FROM t_user WHERE id = ?

步骤:

SELECT * FROM t_user WHERE id = ?
User user = new User();
迭代user对象中的属性,并调用属性的write方法(set方法)
Method setter = pd.getWriteMethod();
setter.invoke(user, rs.getObject(当前属性名对应的列名));
上一篇 下一篇

猜你喜欢

热点阅读