Hibernate第一篇【介紹Hibernate,簡述ORM,快速入門】

前言

前面已經學過了Struts2框架了,緊接着就是學習Hibernate框架了…本博文主要講解介紹Hibernate框架,ORM的概念和Hibernate入門java

什麼是Hibernate框架?

Hibernate是一種ORM框架,全稱爲 Object_Relative DateBase-Mapping,在Java對象與關係數據庫之間創建某種映射,以實現直接存取Java對象mysql

爲何要使用Hibernate?

既然Hibernate是關於Java對象和關係數據庫之間的聯繫的話,也就是咱們MVC中的數據持久層->在編寫程序中的DAO層…sql

首先,咱們來回顧一下咱們在DAO層寫程序的歷程吧:數據庫

  1. 在DAO層操做XML,將數據封裝到XML文件上,讀寫XML文件數據實現CRUD
  2. 在DAO層使用原生JDBC鏈接數據庫,實現CRUD
  3. 嫌棄JDBC的Connection\Statement\ResultSet等對象太繁瑣,使用對原生JDBC的封裝組件–>DbUtils組件

咱們來看看使用DbUtils以後,程序的代碼是怎麼樣的:markdown

public class CategoryDAOImpl implements zhongfucheng.dao.CategoryDao {

    @Override
    public void addCategory(Category category) {

        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());

        String sql = "INSERT INTO category (id, name, description) VALUES(?,?,?)";
        try {
            queryRunner.update(sql, new Object[]{category.getId(), category.getName(), category.getDescription()});

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public Category findCategory(String id) {
        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
        String sql = "SELECT * FROM category WHERE id=?";

        try {
            Category category = (Category) queryRunner.query(sql, id, new BeanHandler(Category.class));

            return category;

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

    }

    @Override
    public List<Category> getAllCategory() {
        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
        String sql = "SELECT * FROM category";

        try {
            List<Category> categories = (List<Category>) queryRunner.query(sql, new BeanListHandler(Category.class));

            return categories;
        } catch (SQLException e) {
            throw  new RuntimeException(e);
        }

    }
}

其實使用DbUtils時,DAO層中的代碼編寫是很有規律的。session

  • 當插入數據的時候,就將JavaBean對象拆分,拼裝成SQL語句
  • 當查詢數據的時候,用SQL把數據庫表中的列組合,拼裝成JavaBean對象

也就是說:javaBean對象和數據表中的列存在映射關係!若是程序可以自動生成SQL語句就行了….那麼Hibernate就實現了這個功能!app

簡單來講:咱們使用Hibernate框架就不用咱們寫不少繁瑣的SQL語句,從而簡化咱們的開發!框架


ORM概述

在介紹Hibernate的時候,說了Hibernate是一種ORM的框架。那什麼是ORM呢?ORM是一種思想dom

  • O表明的是Objcet
  • R表明的是Relative
  • M表明的是Mapping

ORM->對象關係映射….ORM關注是對象與數據庫中的列的關係ide

這裏寫圖片描述


Hibernate快速入門

學習一個框架無非就是三個步驟:

  • 引入jar開發包
  • 配置相關的XML文件
  • 熟悉API

引入相關jar包

咱們使用的是Hibernate3.6的版本

hibernate3.jar核心 + required 必須引入的(6個) + jpa 目錄 + 數據庫驅動包

這裏寫圖片描述

編寫對象和對象映射

編寫一個User對象->User.java

public class User {

    private int id;
    private String username;
    private String password;
    private String cellphone;

    //各類setter和getter
}

編寫對象映射->User.hbm.xml。通常它和JavaBean對象放在同一目錄下

咱們是不知道該XML是怎麼寫的,能夠搜索一下Hibernate文件夾中後綴爲.hbm.xml。看看它們是怎麼寫的。而後複製一份過來

這裏寫圖片描述

<?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">

<!-- This mapping demonstrates content-based discrimination for the table-per-hierarchy mapping strategy, using a formula discriminator. -->

<hibernate-mapping package="org.hibernate.test.array">

    <class name="A" lazy="true" table="aaa">

        <id name="id">
            <generator class="native"/>
        </id>

        <array name="bs" cascade="all" fetch="join">
            <key column="a_id"/>
            <list-index column="idx"/>
            <one-to-many class="B"/>
        </array>

    </class>

    <class name="B" lazy="true" table="bbb">
        <id name="id">
            <generator class="native"/>
        </id>
    </class>


</hibernate-mapping>
  • 在上面的模板上修改~下面會具體講解這個配置文件!
<!--在domain包下-->
<hibernate-mapping package="zhongfucheng.domain">

    <!--類名爲User,表名也爲User-->
    <class name="User" table="user">

        <!--主鍵映射,屬性名爲id,列名也爲id-->
        <id name="id" column="id">
            <!--根據底層數據庫主鍵自動增加-->
            <generator class="native"/>

        </id>

        <!--非主鍵映射,屬性和列名一一對應-->
        <property name="username" column="username"/>
        <property name="cellphone" column="cellphone"/>
        <property name="password" column="password"/>
    </class>
</hibernate-mapping>

主配置文件

hibernate.cfg.xml

若是使用Intellij Idea生成的Hibernate能夠指定生成出主配置文件hibernate.cfg.xml,它是要放在src目錄下的

若是不是自動生成的,咱們能夠在Hibernate的hibernate-distribution-3.6.0.Final\project\etc這個目錄下能夠找到

它長得這個樣子:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.url."/>
        <property name="connection.driver_class"/>
        <property name="connection.username"/>
        <property name="connection.password"/>
        <!-- DB schema will be updated if needed -->
        <!-- <property name="hbm2ddl.auto">update</property> -->
    </session-factory>
</hibernate-configuration>

經過上面的模板進行修改,後面會有對該配置文件進行講解!

<hibernate-configuration>
    <!-- 一般,一個session-factory節點表明一個數據庫 -->
    <session-factory>

        <!-- 1. 數據庫鏈接配置 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///zhongfucheng</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <!-- 數據庫方法配置, hibernate在運行的時候,會根據不一樣的方言生成符合當前數據庫語法的sql -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>


        <!-- 2. 其餘相關配置 -->
        <!-- 2.1 顯示hibernate在運行時候執行的sql語句 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 2.2 格式化sql -->
        <property name="hibernate.format_sql">true</property>
        <!-- 2.3 自動建表 -->
        <property name="hibernate.hbm2ddl.auto">create</property>

        <!--3. 加載全部映射-->
        <mapping resource="zhongfucheng/domain/User.hbm.xml"/>

    </session-factory>
</hibernate-configuration>

測試

package zhongfucheng.domain;

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

/** * Created by ozc on 2017/5/6. */
public class App {
    public static void main(String[] args) {

        //建立對象
        User user = new User();
        user.setPassword("123");
        user.setCellphone("122222");
        user.setUsername("nihao");

        //獲取加載配置管理類
        Configuration configuration = new Configuration();

        //不給參數就默認加載hibernate.cfg.xml文件,
        configuration.configure();

        //建立Session工廠對象
        SessionFactory factory = configuration.buildSessionFactory();

        //獲得Session對象
        Session session = factory.openSession();

        //使用Hibernate操做數據庫,都要開啓事務,獲得事務對象
        Transaction transaction = session.getTransaction();

        //開啓事務
        transaction.begin();

        //把對象添加到數據庫中
        session.save(user);

        //提交事務
        transaction.commit();

        //關閉Session
        session.close();
    }
}

值得注意的是:JavaBean的主鍵類型只能是int類型,由於在映射關係中配置是自動增加的,String類型是不能自動增加的。若是是你設置了String類型,又使用了自動增加,那麼就會報出下面的錯誤!

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'zhongfucheng.user' does

執行完程序後,Hibernate就爲咱們建立對應的表,並把數據存進了數據庫了

這裏寫圖片描述

相關文章
相關標籤/搜索