最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Hibernate之CRUD操作實踐

 更新時間:2018年11月02日 14:25:03   作者:挑戰(zhàn)者V  
這篇文章主要介紹了Hibernate之CRUD操作實踐,本文主要告訴讀者Hibernate是什么,為什么要使用HibernateHibernate的優(yōu)缺點,Hibernate的基礎(chǔ)實例應(yīng)用。需要的朋友可以參考下

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

Hibernate與MyBatis相比,雖然應(yīng)用面不是特別廣,但是并不代表就沒有用武之地。

今天講講Hibernate的CRUD,本文主要告訴讀者Hibernate是什么,為什么要使用HibernateHibernate的優(yōu)缺點,Hibernate的基礎(chǔ)實例應(yīng)用。

一、Hibernate是什么

Hibernate是一個開放源代碼的對象關(guān)系映射框架,它對JDBC進(jìn)行了非常輕量級的對象封裝,它將POJO與數(shù)據(jù)庫表建立映射關(guān)系,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執(zhí)行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。 Hibernate可以應(yīng)用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應(yīng)用中使用,最具革命意義的是,Hibernate可以在應(yīng)用EJB的JaveEE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化的重任(這里引用百度的描述)

二、為什么要使用Hibernate

為什么要使用Hibernate,先不回答為什么要使用它,因為一項技術(shù)入世,一定有其應(yīng)用的場景。

那么Hibernate的優(yōu)點有哪些呢?

(1)標(biāo)準(zhǔn)的orm框架,程序員不需要編寫SQL語句

(2)具有良好的數(shù)據(jù)庫無關(guān)性,即數(shù)據(jù)庫發(fā)生變化的話,代碼無需再次編寫;

任何事情有利也有弊

那么Hibernate的缺點有哪些呢?

(1)學(xué)習(xí)門檻高,需要對數(shù)據(jù)關(guān)系模型有良好的基礎(chǔ),而且在設(shè)置OR映射的時候,需要考慮好性能和對象模型的權(quán)衡;

(2)程序員不能自主的去進(jìn)行SQL性能優(yōu)化;

那么Hibernate的應(yīng)用場景有哪些呢?

例如需求明確、業(yè)務(wù)固定的項目,比如OA項目、ERP、CRM等項目

三、Hibernate的基礎(chǔ)實例

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

接下來示例演示與說明:

1.導(dǎo)入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數(shù)據(jù)庫 -->
    <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>

數(shù)據(jù)庫四要素:加載驅(qū)動、建立連接、用戶名、密碼。這些我就不多說了。

hibernate.dialect:數(shù)據(jù)庫方言 hibernate的良好的可移植性就在這里體現(xiàn),面對不同的數(shù)據(jù)庫只需改方言即可適用

hibernate.show_sql:是否打印SQL語句 開發(fā)環(huán)境建議 生產(chǎn)環(huán)境不建議

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;
  /**
   * 用戶編碼(登錄賬戶) 手機(jī)號 郵箱號
   */
  private String loginCode;
  /**
   * 用戶名
   */
  private String userName;
  /**
   * 密碼
   */
  private String password;
  /**
   * 性別
   */
  private Integer sex;
  /**
   * 身份證
   */
  private String identityCard;
  /**
   * 創(chuàng)建時間
   */
  private String createTime;
  /**
   * 創(chuàng)建人
   */
  private String createBy;
  /**
   * 更新時間
   */
  private String updateTime;
  /**
   * 更新人
   */
  private String updateBy;
  /**
   * 狀態(tài):0注冊新用戶 1郵件認(rèn)證用戶 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.編寫實體對應(yīng)的映射文件

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:是否為空 默認(rèn)為false 不為空

unique 獨(dú)特的唯一的

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) {
    //刪除數(shù)據(jù)
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
    User user = new User();
    user.setUserId(2);
    user.setLoginCode("yc@163.com");
    user.setUserName("聰哥哥");
    user.setPassword("test123");
    user.setIdentityCard("1234");
    user.setCreateBy("系統(tǒng)");
    user.setCreateTime("2018-10-21 10:00");
    user.setUpdateBy("系統(tǒng)");
    user.setUpdateTime("2018-10-21 10:00");
    user.setSex(1);
    user.setStatus(1);
    session.delete(user);
    tx.commit();
    
    
  /** 
     根據(jù)主鍵查詢單條數(shù)據(jù)
    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();
    }
   
    */
    
    
  /*  
    更新數(shù)據(jù)
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
    try {
      User user = new User();
      user.setUserId(2);
      user.setLoginCode("yc@163.com");
      user.setUserName("聰哥哥");
      user.setPassword("test123");
      user.setIdentityCard("1234");
      user.setCreateBy("系統(tǒng)");
      user.setCreateTime("2018-10-21 10:00");
      user.setUpdateBy("系統(tǒng)");
      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();
    }
    
    */
    
    
/*   
    模糊查詢數(shù)據(jù)
    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();
  */
    
    
    /*

     新增數(shù)據(jù)
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
    try {
      
      User user = new User();
      user.setLoginCode("yc@163.com");
      user.setUserName("Y先生");
      user.setPassword("test123");
      user.setIdentityCard("1234");
      user.setCreateBy("系統(tǒng)");
      user.setCreateTime("2018-10-21 10:00");
      user.setUpdateBy("系統(tǒng)");
      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();
    }*/
  }
}

小結(jié):

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

分支為hibernate-crud分支

如果在復(fù)用我的這篇文章在實際遇到較多的問題而無法解決,可直接clone我的git倉庫本地運(yùn)行

如圖所示:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • mybatis項目CRUD步驟實例詳解

    mybatis項目CRUD步驟實例詳解

    這篇文章主要介紹了mybatis項目CRUD步驟,包括pom.xml引入相應(yīng)的依賴,在resources目錄下寫配置文件,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Java HttpClient用法的示例詳解

    Java HttpClient用法的示例詳解

    Java開發(fā)語言中實現(xiàn)HTTP請求的方法主要有兩種:一種是JAVA的標(biāo)準(zhǔn)類HttpUrlConnection;另一種是第三方開源框架HTTPClient。本文就將詳細(xì)講講Java中HttpClient的使用,需要的可以參考一下
    2022-07-07
  • Java生成中間logo的二維碼的示例代碼

    Java生成中間logo的二維碼的示例代碼

    這篇文章主要介紹了Java如何生成中間logo的二維碼,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Spring?Boot實現(xiàn)配置文件的自動加載和刷新功能

    Spring?Boot實現(xiàn)配置文件的自動加載和刷新功能

    這篇文章我們介紹了Spring?Boot如何實現(xiàn)配置文件的自動加載和刷新,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-05-05
  • Mybatis-Plus 全局配置無效的解決方案

    Mybatis-Plus 全局配置無效的解決方案

    這篇文章主要介紹了Mybatis-Plus 全局配置無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Gradle相對于Maven有哪些優(yōu)點

    Gradle相對于Maven有哪些優(yōu)點

    這篇文章主要介紹了Gradle相對于Maven有哪些優(yōu)點,幫助大家選擇合適的自動構(gòu)建工具,更好的構(gòu)建項目,感興趣的朋友可以了解下
    2020-10-10
  • Java中-Xms和-Xmx參數(shù)的使用與默認(rèn)內(nèi)存設(shè)置

    Java中-Xms和-Xmx參數(shù)的使用與默認(rèn)內(nèi)存設(shè)置

    在 Java 程序運(yùn)行時,內(nèi)存的管理是影響程序性能的關(guān)鍵因素之一,Java 程序使用的內(nèi)存主要由兩部分組成:堆內(nèi)存和棧內(nèi)存,Java 提供了多個參數(shù)來控制堆內(nèi)存的大小,其中最常用的參數(shù)是 -Xms 和 -Xmx,本文將詳細(xì)介紹這些參數(shù),需要的朋友可以參考下
    2024-11-11
  • java如何給對象按照字符串屬性進(jìn)行排序

    java如何給對象按照字符串屬性進(jìn)行排序

    這篇文章主要介紹了java如何給對象按照字符串屬性進(jìn)行排序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 硬核 Redis 高頻面試題解析

    硬核 Redis 高頻面試題解析

    Redis 是一個高性能的key-value數(shù)據(jù)庫。在部分場合可以對關(guān)系數(shù)據(jù)庫起到很好的補(bǔ)充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端使用很方便
    2021-06-06
  • SpringBoot中獲取profile的方法詳解

    SpringBoot中獲取profile的方法詳解

    這篇文章主要介紹了springboot獲取profile的操作,文中的示例代碼講解詳細(xì),具有很好的參考價值,希望對大家有所幫助
    2022-04-04

最新評論

昌平区| 同德县| 宁陵县| 育儿| 汉中市| 彰武县| 贵南县| 曲松县| 拉萨市| 平山县| 赤城县| 莆田市| 开化县| 鸡西市| 盱眙县| 侯马市| 双流县| 建宁县| 来宾市| 资中县| 化隆| 永德县| 镇赉县| 德令哈市| 安西县| 江孜县| 永仁县| 拉孜县| 山阳县| 西乡县| 安多县| 盘山县| 阿拉善右旗| 托克逊县| 大石桥市| 梅州市| 宜州市| 巨野县| 镇康县| 远安县| 凤山县|