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倉庫本地執行
如圖所示: