1. 程式人生 > >Hibernate之CRUD實踐

Hibernate之CRUD實踐

Hibernate作為一個高度封裝的持久層框架,曾經是非常牛逼的,現在雖然應用不是特別廣,比如我前公司主要是做OA的,應用的框架就是Spring+SpringMVC+Hibernate。

Hibernate與MyBatis相比,雖然應用面不是特別廣,但是並不代表就沒有用武之地。

今天講講Hibernate的CRUD,本文主要告訴讀者Hibernate是什麼,為什麼要使用HibernateHibernate的優缺點,Hibernate的基礎例項應用。

一、Hibernate是什麼

Hibernate是一個開放原始碼的物件關係對映框架,它對JDBC進行了非常輕量級的物件封裝,它將POJO與資料庫表建立對映關係,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執行,使得Java程式設計師可以隨心所欲的使用物件程式設計思維來操縱資料庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程式使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的JaveEE架構中取代CMP,完成資料持久化的重任(這裡引用百度的描述)

二、為什麼要使用Hibernate

為什麼要使用Hibernate,先不回答為什麼要使用它,因為一項技術入世,一定有其應用的場景。

那麼Hibernate的優點有哪些呢?

(1)標準的orm框架,程式設計師不需要編寫SQL語句

(2)具有良好的資料庫無關性,即資料庫發生變化的話,程式碼無需再次編寫;

任何事情有利也有弊

那麼Hibernate的缺點有哪些呢?

(1)學習門檻高,需要對資料關係模型有良好的基礎,而且在設定OR對映的時候,需要考慮好效能和物件模型的權衡;

(2)程式設計師不能自主的去進行SQL效能優化;

那麼Hibernate的應用場景有哪些呢?

例如需求明確、業務固定的專案,比如OA專案、ERP、CRM等專案

三、Hibernate的基礎例項

記得很久之前在初學Hibernate時,雖然網上有不少例子,但是我覺得都不是我想要的,因為很殘缺不是特別系統,但是如果太系統化的話,必然會連載,但是我覺得對於初學者而言,有些時候看連載確實有點昏昏欲睡,沒意思。這次例項是以maven工程作為示例,maven是當前最流行的專案管理工具之一。

接下來示例演示與說明:

1.匯入maven依賴

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation
="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.example</groupId> <artifactId>hibernate-crud</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <!--hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.11.Final</version> </dependency> <!--MySQL資料庫 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> <!--junit單元測試 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> <build> <plugins> <!-- 指定jdk版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>

2.編寫hibernate的主要配置檔案

hibernate.cfg.xml

<!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.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/blog_test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">1234</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="current_session_context_class">thread</property>  
        <mapping resource="mapping/User.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>

資料庫四要素:載入驅動、建立連線、使用者名稱、密碼。這些我就不多說了。

hibernate.dialect:資料庫方言 hibernate的良好的可移植性就在這裡體現,面對不同的資料庫只需改方言即可適用

hibernate.show_sql:是否列印SQL語句 開發環境建議 生產環境不建議

hibernate.hbm2ddl.auto: 一般建議使用update 而不是使用create

current_session_context_class:這裡主要針對session物件,後面我會有針對性地講解

3.編寫實體

User.java

package cn.blog.entity;


import java.io.Serializable;
import java.util.Date;


public class User implements Serializable{

    private static final long serialVersionUID = 1L;

    /**
     * 使用者主鍵
     */
    private Integer userId;
    /**
     * 使用者編碼(登入賬戶) 手機號 郵箱號
     */
    private String loginCode;
    /**
     * 使用者名稱
     */
    private String userName;
    /**
     * 密碼
     */
    private String password;
    /**
     * 性別
     */
    private Integer sex;
    /**
     * 身份證
     */
    private String identityCard;
    /**
     * 建立時間
     */
    private String createTime;
    /**
     * 建立人
     */
    private String createBy;
    /**
     * 更新時間
     */
    private String updateTime;
    /**
     * 更新人
     */
    private String updateBy;
    /**
     * 狀態:0註冊新使用者 1郵件認證使用者 2管理員 3黑名單
     */
    private Integer status;


    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getLoginCode() {
        return loginCode;
    }

    public void setLoginCode(String loginCode) {
        this.loginCode = loginCode;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public String getIdentityCard() {
        return identityCard;
    }

    public void setIdentityCard(String identityCard) {
        this.identityCard = identityCard;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }

    public String getCreateBy() {
        return createBy;
    }

    public void setCreateBy(String createBy) {
        this.createBy = createBy;
    }

    public String getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(String updateTime) {
        this.updateTime = updateTime;
    }

    public String getUpdateBy() {
        return updateBy;
    }

    public void setUpdateBy(String updateBy) {
        this.updateBy = updateBy;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

 
    @Override
    public String toString() {
        return "User{" +
        "userId=" + userId +
        ", loginCode=" + loginCode +
        ", userName=" + userName +
        ", password=" + password +
        ", sex=" + sex +
        ", identityCard=" + identityCard +
        ", createTime=" + createTime +
        ", createBy=" + createBy +
        ", updateTime=" + updateTime +
        ", updateBy=" + updateBy +
        ", status=" + status +
        "}";
    }
}

4.編寫實體對應的對映檔案

User.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">

<hibernate-mapping>
    <class name="cn.blog.entity.User" table="user">
        <id name="userId" type="java.lang.Integer">
            <column name="user_id"/>
            <generator class="identity" />
        </id>
        <!-- 對映CrUser類中的code屬性 -->
        <property name="loginCode" type="string">
            <column name="login_code" length="10" not-null="true" unique="true" />
        </property>
        <property name="userName" type="string">
            <column name="user_name" length="20" not-null="true" unique="true" />
        </property>
         <property name="password" type="string">
            <column name="password" length="20" not-null="true" unique="true" />
        </property>

        
        <property name="sex" type="java.lang.Integer">
            <column name="sex" length="20" not-null="true" unique="true" />
        </property>
        
            
        <property name="identityCard" type="string">
            <column name="identity_card" length="20" not-null="true" unique="true" />
        </property>
        
            
        <property name="createTime" type="string">
            <column name="create_time" length="20" not-null="true" unique="true" />
        </property>
        
            
        <property name="createBy" type="string">
            <column name="create_by" length="20" not-null="true" unique="true" />
        </property>
        
            
        <property name="updateTime" type="string">
            <column name="update_time" length="20" not-null="true" unique="true" />
        </property>
        
        <property name="updateBy" type="string">
            <column name="update_by" length="20" not-null="true" unique="true" />
        </property>
        
        <property name="status" type="java.lang.Integer">
            <column name="status" length="20" not-null="true" unique="true" />
        </property>
        
    </class>
</hibernate-mapping>

column中的name屬性作用:主要是使物件實體與表對映

type:實體屬性

length:長度

not-null:是否為空 預設為false 不為空

unique 獨特的唯一的

5.封裝工具類

HibernateUtils.java

package cn.blog.utils;

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

public class HibernateUtil extends Object{
    private static SessionFactory sessionFactory;
    static
    {
        try{
            Configuration configuration=new Configuration().configure();
            sessionFactory = configuration.buildSessionFactory();
          }catch (Throwable ex){
                throw new ExceptionInInitializerError(ex);
        }
    }
      private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }    
    public static Session getSession() throws HibernateException
    {
        Session session = (Session) threadLocal.get();
        if (session == null){
            session = sessionFactory.openSession();
            threadLocal.set(session);
        }
            return session;
    }
    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        if (session != null)
            session.close();
        threadLocal.set(null);
    }
    
    public static void shutdown(){
        getSessionFactory().close();
    }
    
}

6.編寫測試類

下面就是具體的crud操作 有部分註釋了,只需去除註釋即可測驗效果。

package cn.blog.test;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import cn.blog.entity.User;
import cn.blog.utils.HibernateUtil;

public class BlogTest {

    public static void main(String[] args) {
        //刪除資料
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        User user = new User();
        user.setUserId(2);
        user.setLoginCode("[email protected]");
        user.setUserName("聰哥哥");
        user.setPassword("test123");
        user.setIdentityCard("1234");
        user.setCreateBy("系統");
        user.setCreateTime("2018-10-21 10:00");
        user.setUpdateBy("系統");
        user.setUpdateTime("2018-10-21 10:00");
        user.setSex(1);
        user.setStatus(1);
        session.delete(user);
        tx.commit();
        
        
    /**          根據主鍵查詢單條資料        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        try {
               User user = (User) session.get(User.class, 1);
               System.out.println(user.getUserName());
               
               tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }finally {
            HibernateUtil.closeSession();
        }
     
        */
        
        
    /*            更新資料        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        try {
            User user = new User();
            user.setUserId(2);
            user.setLoginCode("[email protected]");
            user.setUserName("聰哥哥");
            user.setPassword("test123");
            user.setIdentityCard("1234");
            user.setCreateBy("系統");
            user.setCreateTime("2018-10-21 10:00");
            user.setUpdateBy("系統");
            user.setUpdateTime("2018-10-21 10:00");
            user.setSex(1);
            user.setStatus(1);
            
            session.saveOrUpdate(user);
            System.out.println("update succes");
            tx.commit();
                
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
             System.out.println("update fail");
        }finally {
            HibernateUtil.closeSession();
        }
        
        */
        
        
/*             模糊查詢資料        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        
        String userName="Y";
        Criteria c= session.createCriteria(User.class);
        c.add(Restrictions.like("userName", "%"+userName+"%"));
        
        List<User> user = c.list();
          for (User user2 : user) {
            System.out.println(user2.getUserName());
        }
        tx.commit();
    */
        
        
        /*         新增資料        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        try {
            
            User user = new User();
            user.setLoginCode("[email protected]");
            user.setUserName("Y先生");
            user.setPassword("test123");
            user.setIdentityCard("1234");
            user.setCreateBy("系統");
            user.setCreateTime("2018-10-21 10:00");
            user.setUpdateBy("系統");
            user.setUpdateTime("2018-10-21 10:00");
            user.setSex(1);
            user.setStatus(1);
            session.save(user);
            System.out.println("insert data success");
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
            System.out.println("insert data fail");
        }finally {
            
            HibernateUtil.closeSession();
        }*/
    }
}

小結:

本文程式碼放置處為:https://github.com/youcong1996/study_simple_demo.git

分支為hibernate-crud分支

如果在複用我的這篇文章在實際遇到較多的問題而無法解決,可直接clone我的git倉庫本地執行

如圖所示: