Hibernate之CRUD操作實(shí)踐
Hibernate作為一個(gè)高度封裝的持久層框架,曾經(jīng)是非常牛逼的,現(xiàn)在雖然應(yīng)用不是特別廣,比如我前公司主要是做OA的,應(yīng)用的框架就是Spring+SpringMVC+Hibernate。
Hibernate與MyBatis相比,雖然應(yīng)用面不是特別廣,但是并不代表就沒(méi)有用武之地。
今天講講Hibernate的CRUD,本文主要告訴讀者Hibernate是什么,為什么要使用HibernateHibernate的優(yōu)缺點(diǎn),Hibernate的基礎(chǔ)實(shí)例應(yīng)用。
一、Hibernate是什么
Hibernate是一個(gè)開(kāi)放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,它將POJO與數(shù)據(jù)庫(kù)表建立映射關(guān)系,是一個(gè)全自動(dòng)的orm框架,hibernate可以自動(dòng)生成SQL語(yǔ)句,自動(dòng)執(zhí)行,使得Java程序員可以隨心所欲的使用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù)。 Hibernate可以應(yīng)用在任何使用JDBC的場(chǎng)合,既可以在Java的客戶(hù)端程序使用,也可以在Servlet/JSP的Web應(yīng)用中使用,最具革命意義的是,Hibernate可以在應(yīng)用EJB的JaveEE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化的重任(這里引用百度的描述)
二、為什么要使用Hibernate
為什么要使用Hibernate,先不回答為什么要使用它,因?yàn)橐豁?xiàng)技術(shù)入世,一定有其應(yīng)用的場(chǎng)景。
那么Hibernate的優(yōu)點(diǎn)有哪些呢?
(1)標(biāo)準(zhǔn)的orm框架,程序員不需要編寫(xiě)SQL語(yǔ)句
(2)具有良好的數(shù)據(jù)庫(kù)無(wú)關(guān)性,即數(shù)據(jù)庫(kù)發(fā)生變化的話,代碼無(wú)需再次編寫(xiě);
任何事情有利也有弊
那么Hibernate的缺點(diǎn)有哪些呢?
(1)學(xué)習(xí)門(mén)檻高,需要對(duì)數(shù)據(jù)關(guān)系模型有良好的基礎(chǔ),而且在設(shè)置OR映射的時(shí)候,需要考慮好性能和對(duì)象模型的權(quán)衡;
(2)程序員不能自主的去進(jìn)行SQL性能優(yōu)化;
那么Hibernate的應(yīng)用場(chǎng)景有哪些呢?
例如需求明確、業(yè)務(wù)固定的項(xiàng)目,比如OA項(xiàng)目、ERP、CRM等項(xiàng)目
三、Hibernate的基礎(chǔ)實(shí)例
記得很久之前在初學(xué)Hibernate時(shí),雖然網(wǎng)上有不少例子,但是我覺(jué)得都不是我想要的,因?yàn)楹軞埲辈皇翘貏e系統(tǒng),但是如果太系統(tǒng)化的話,必然會(huì)連載,但是我覺(jué)得對(duì)于初學(xué)者而言,有些時(shí)候看連載確實(shí)有點(diǎn)昏昏欲睡,沒(méi)意思。這次實(shí)例是以maven工程作為示例,maven是當(dāng)前最流行的項(xiàng)目管理工具之一。
接下來(lái)示例演示與說(shuō)明:
1.導(dǎo)入maven依賴(lài)
<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ù)庫(kù) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<!--junit單元測(cè)試 -->
<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.編寫(xiě)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ù)庫(kù)四要素:加載驅(qū)動(dòng)、建立連接、用戶(hù)名、密碼。這些我就不多說(shuō)了。
hibernate.dialect:數(shù)據(jù)庫(kù)方言 hibernate的良好的可移植性就在這里體現(xiàn),面對(duì)不同的數(shù)據(jù)庫(kù)只需改方言即可適用
hibernate.show_sql:是否打印SQL語(yǔ)句 開(kāi)發(fā)環(huán)境建議 生產(chǎn)環(huán)境不建議
hibernate.hbm2ddl.auto: 一般建議使用update 而不是使用create
current_session_context_class:這里主要針對(duì)session對(duì)象,后面我會(huì)有針對(duì)性地講解
3.編寫(xiě)實(shí)體
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;
/**
* 用戶(hù)主鍵
*/
private Integer userId;
/**
* 用戶(hù)編碼(登錄賬戶(hù)) 手機(jī)號(hào) 郵箱號(hào)
*/
private String loginCode;
/**
* 用戶(hù)名
*/
private String userName;
/**
* 密碼
*/
private String password;
/**
* 性別
*/
private Integer sex;
/**
* 身份證
*/
private String identityCard;
/**
* 創(chuàng)建時(shí)間
*/
private String createTime;
/**
* 創(chuàng)建人
*/
private String createBy;
/**
* 更新時(shí)間
*/
private String updateTime;
/**
* 更新人
*/
private String updateBy;
/**
* 狀態(tài):0注冊(cè)新用戶(hù) 1郵件認(rèn)證用戶(hù) 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.編寫(xiě)實(shí)體對(duì)應(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類(lèi)中的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屬性作用:主要是使對(duì)象實(shí)體與表映射
type:實(shí)體屬性
length:長(zhǎng)度
not-null:是否為空 默認(rèn)為false 不為空
unique 獨(dú)特的唯一的
5.封裝工具類(lèi)
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.編寫(xiě)測(cè)試類(lèi)
下面就是具體的crud操作 有部分注釋了,只需去除注釋即可測(cè)驗(yàn)效果。
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ù)主鍵查詢(xún)單條數(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();
}
*/
/*
模糊查詢(xún)數(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ù)用我的這篇文章在實(shí)際遇到較多的問(wèn)題而無(wú)法解決,可直接clone我的git倉(cāng)庫(kù)本地運(yùn)行
如圖所示:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Hibernate核心類(lèi)和接口的詳細(xì)介紹
- Hibernate的各種保存方式的區(qū)別詳解
- Hibernate中Session.get()方法和load()方法的詳細(xì)比較
- Hibernate用ThreadLocal模式(線程局部變量模式)管理Session
- hibernate測(cè)試時(shí)遇到的幾個(gè)異常及解決方法匯總
- Hibernate中使用HQLQuery查詢(xún)?nèi)繑?shù)據(jù)和部分?jǐn)?shù)據(jù)的方法實(shí)例
- Hibernate實(shí)現(xiàn)many-to-many的映射關(guān)系
- Hibernate一級(jí)緩存和二級(jí)緩存詳解
- SpringBoot 使用hibernate validator校驗(yàn)
- Hibernate連接三種數(shù)據(jù)庫(kù)的配置文件
相關(guān)文章
mybatis項(xiàng)目CRUD步驟實(shí)例詳解
這篇文章主要介紹了mybatis項(xiàng)目CRUD步驟,包括pom.xml引入相應(yīng)的依賴(lài),在resources目錄下寫(xiě)配置文件,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
Spring?Boot實(shí)現(xiàn)配置文件的自動(dòng)加載和刷新功能
這篇文章我們介紹了Spring?Boot如何實(shí)現(xiàn)配置文件的自動(dòng)加載和刷新,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-05-05
Gradle相對(duì)于Maven有哪些優(yōu)點(diǎn)
這篇文章主要介紹了Gradle相對(duì)于Maven有哪些優(yōu)點(diǎn),幫助大家選擇合適的自動(dòng)構(gòu)建工具,更好的構(gòu)建項(xiàng)目,感興趣的朋友可以了解下2020-10-10
Java中-Xms和-Xmx參數(shù)的使用與默認(rèn)內(nèi)存設(shè)置
在 Java 程序運(yùn)行時(shí),內(nèi)存的管理是影響程序性能的關(guān)鍵因素之一,Java 程序使用的內(nèi)存主要由兩部分組成:堆內(nèi)存和棧內(nèi)存,Java 提供了多個(gè)參數(shù)來(lái)控制堆內(nèi)存的大小,其中最常用的參數(shù)是 -Xms 和 -Xmx,本文將詳細(xì)介紹這些參數(shù),需要的朋友可以參考下2024-11-11
java如何給對(duì)象按照字符串屬性進(jìn)行排序
這篇文章主要介紹了java如何給對(duì)象按照字符串屬性進(jìn)行排序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

