這篇文章給大家介紹如何在Hibernate中實(shí)現(xiàn)CRUD操作,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
成都創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、商水網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁(yè)面制作、商城開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為商水等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
一、Hibernate是什么
Hibernate是一個(gè)開放源代碼的對(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ì)象編程思維來操縱數(shù)據(jù)庫(kù)。 Hibernate可以應(yīng)用在任何使用JDBC的場(chǎng)合,既可以在Java的客戶端程序使用,也可以在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框架,程序員不需要編寫SQL語(yǔ)句
(2)具有良好的數(shù)據(jù)庫(kù)無(wú)關(guān)性,即數(shù)據(jù)庫(kù)發(fā)生變化的話,代碼無(wú)需再次編寫;
任何事情有利也有弊
那么Hibernate的缺點(diǎn)有哪些呢?
(1)學(xué)習(xí)門檻高,需要對(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)上有不少例子,但是我覺得都不是我想要的,因?yàn)楹軞埲辈皇翘貏e系統(tǒng),但是如果太系統(tǒng)化的話,必然會(huì)連載,但是我覺得對(duì)于初學(xué)者而言,有些時(shí)候看連載確實(shí)有點(diǎn)昏昏欲睡,沒意思。這次實(shí)例是以maven工程作為示例,maven是當(dāng)前最流行的項(xiàng)目管理工具之一。
接下來示例演示與說明:
1.導(dǎo)入maven依賴
4.0.0 cn.example hibernate-crud 0.0.1-SNAPSHOT org.hibernate hibernate-core 4.3.11.Final mysql mysql-connector-java 5.1.44 junit junit 4.12 org.apache.maven.plugins maven-compiler-plugin 3.7.0 1.8
2.編寫hibernate的主要配置文件
hibernate.cfg.xml
com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/blog_test root 1234 org.hibernate.dialect.MySQLDialect true update thread
數(shù)據(jù)庫(kù)四要素:加載驅(qū)動(dòng)、建立連接、用戶名、密碼。這些我就不多說了。
hibernate.dialect:數(shù)據(jù)庫(kù)方言 hibernate的良好的可移植性就在這里體現(xiàn),面對(duì)不同的數(shù)據(jù)庫(kù)只需改方言即可適用
hibernate.show_sql:是否打印SQL語(yǔ)句 開發(fā)環(huán)境建議 生產(chǎn)環(huán)境不建議
hibernate.hbm2ddl.auto: 一般建議使用update 而不是使用create
current_session_context_class:這里主要針對(duì)session對(duì)象,后面我會(huì)有針對(duì)性地講解
3.編寫實(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; /** * 用戶主鍵 */ private Integer userId; /** * 用戶編碼(登錄賬戶) 手機(jī)號(hào) 郵箱號(hào) */ private String loginCode; /** * 用戶名 */ 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è)新用戶 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.編寫實(shí)體對(duì)應(yīng)的映射文件
User.hbm.xml
column中的name屬性作用:主要是使對(duì)象實(shí)體與表映射
type:實(shí)體屬性
length:長(zhǎng)度
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 ThreadLocalthreadLocal = new ThreadLocal (); 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.編寫測(cè)試類
下面就是具體的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ù)主鍵查詢單條數(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+"%")); Listuser = 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ú)法解決,可直接clone我的git倉(cāng)庫(kù)本地運(yùn)行
如圖所示:
關(guān)于如何在Hibernate中實(shí)現(xiàn)CRUD操作就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。