1. 程式人生 > >JavaEE框架——hibernate的使用(關於hibernate事務的必須開啟的問題)

JavaEE框架——hibernate的使用(關於hibernate事務的必須開啟的問題)

一、與資料庫的互動(增刪改查)

注意:1.寫hql語言是是對於物件操作,而不是表資料

            2.注意hibernate中的快取

1.Hibernate 查詢方式

Hibernate配備了一種非常強大的查詢語言,這種語言看上去很像SQL。但是不要被語法結構上的相似所迷惑,HQL(Hibernate querylauguage)被設計為完全面向物件的查詢。

HQL對關鍵字的大寫小並不區分,但是對查詢的物件就要區分大小寫,因為它是面向物件的查詢,所以查詢的是一個物件,而不是資料庫的表,在sql中如果要加條件的話就是列,而在HQL裡面條件就是物件的屬性,而且還要給物件起別名

1.Hibernate
查詢HQL語句

限制查詢結果記錄數與起始記錄

Sessionsession=HibernateSessionFactory.getSession();

Queryquery=session.createQuery("fromCustomer");

query.setFirstResult(10); //設定查詢記錄開始位置,索引從0開始。

query.setMaxResults(10);//設定查詢返回的最大記錄個數。

Listlist=query.list();

注意:條件查詢

Sessionsession=HibernateSessionFactory.getSession();

Queryquery=session.createQuery("from Customer cus where cus.name='zhou'");

2、取表中部分列時

(1) 單一屬性查詢。還是返回一個集合,只不過集合中儲存的不是表的例項而是物件。

Sessionsession =null;

session= HibernateSessionFactory.getSession();

Listcnames = session.createQuery("select cname from Customer").list();

for(inti=0;i<cnames.size();i++) {

  String name = (String)cnames.get(i);

  System.out.println(name);

}

(2) 多個屬性的查詢,使用物件陣列。

Sessionsession =null;

session= HibernateSessionFactory.getSession();

//查詢多個屬性,其集合元素是物件陣列

//陣列元素的型別,跟實體類的屬性的型別相關

Liststudents = session.createQuery("select sno,sname from Students").list();

for(inti=0;i<students.size();i++) {

  Object[] obj = (Object[])students.get(i);

  System.out.println(obj[0] +", " + obj[1]);

}

 (3) 多個屬性的查詢,使用List集合裝部分列

Sessionsession = HibernateSessionFactory.getSession();

Queryquery = session.createQuery("select new list(cus.name,cus.phone) from Customer cus");

Listlist = query.list();

for(int i = 0; i < list.size(); i++) {

  List temp=(List)list.get(i);

  System.out.println(temp.get(0));  //0是索引

}

 (4) 使用Map集合裝部分列

Sessionsession = HibernateSessionFactory.getSession();

Queryquery = session.createQuery("select new map(cus.name,cus.phone) from Customer cus");

Listlist = query.list();

for(int i = 0; i < list.size(); i++) {

  Map temp=(Map)list.get(i);

  System.out.println(temp.get("1"));  //"1"是key
}

3、內連線

Queryquery=session.createQuery("select c.name, s.name fromStudent s join s.classes c").list();

for(Iterator iter = students.iterator();iter.hasNext();){

  Object[] obj = (Object[])iter.next();

  System.out.println(obj[0] +", " + obj[1]);

}

4、外連線

Queryquery=session.createQuery("select c.name, s.name fromStudent s join s.classes c").list();

for(Iterator iter = students.iterator();iter.hasNext();){

  Object[] obj = (Object[])iter.next();

  System.out.println(obj[0] +", " + obj[1]);

}</span>

5、帶引數的查詢

(1) ?作為引數 如"from Customer cus where cus.name=?";

     Session session = HibernateSessionFactory.getSession();

    Query query = session.createQuery("fromCustomer cuswhere cus.name=?");

     query.setParameter(0,"zhou");

     List list = query.list();

(2) 引數名稱  :name   如" from Customer cus where cus.name=:name";

Sessionsession = HibernateSessionFactory.getSession();

     Queryquery = session.createQuery("fromCustomer cuswhere cus.name=:name");

     query.setParameter("name","zhou");

     List list = query.list();
(3)條件查詢,使用 ?的方式傳遞引數
<p><span style="color:black;"> </span>Query <span style="color:black;">query</span><span style="color:black;"> = </span><span style="color:black;">session.createQuery</span><span style="color:black;">("SELECTs.id, s.name FROM Student s WHERE s.name </span><span style="color:#333399;">LIKE ?</span><span style="color:black;">");</span></p><p><span style="color:black;">  </span> <span style="color:black;">query</span><span style="color:#333399;">.setParameter</span><span style="color:black;">(0,“%</span><span style="color:black;">周</span><span style="color:black;">%”);//</span><span style="color:black;">傳遞引數引數的索引是從</span><span style="color:black;">0</span><span style="color:black;">開始的。  </span>如條件查詢,<span style="color:#333399;">使用</span><span style="color:#333399;">":</span><span style="color:#333399;">引數</span><span style="color:#333399;">"</span><span style="color:#333399;">名稱的方式傳遞引數</span></p><p><span style="color:black;">  </span>Query <span style="color:black;">query</span><span style="color:black;"> = </span><span style="color:black;">session.createQuery</span><span style="color:black;">("SELECTs.id, s.name FROM Student s WHERE s.name </span><span style="color:#333399;">LIKE </span><span style="color:#333399;">:</span><span style="color:#333399;">myname</span><span style="color:black;">");</span></p><p><span style="color:black;">  </span><span style="color:black;">query.setParameter</span><span style="color:black;">("</span><span style="color:black;">myname</span><span style="color:black;">","</span><span style="color:black;">張三</span><span style="color:black;">");//</span><span style="color:black;">傳遞引數</span></p><p><span style="color:black;">因為</span><span style="color:black;">setParameter</span><span style="color:black;">方法返回</span><span style="color:black;">Query</span><span style="color:black;">介面,所以可用省略方式來查詢</span></p><p><span style="color:black;">Liststudents = </span><span style="color:black;">session.createQuery</span><span style="color:black;">("SELECTs.id, s.name FROM Student s WHERE s.name </span><span style="color:#333399;">LIKE :</span><span style="color:#333399;">myname</span><span style="color:#333399;"> and s.id = :</span><span style="color:#333399;">myid</span><span style="color:black;">")</span></p><p><span style="color:black;">setParameter</span><span style="color:black;">("</span><span style="color:black;">myname</span><span style="color:black;">","%</span><span style="color:black;">周</span><span style="color:black;">%").</span><span style="color:black;">setParameter</span><span style="color:black;">("</span><span style="color:black;">myid</span><span style="color:black;">",15).list();</span></p>

6、嵌入原生sql測試

SQLQuerysqlQuery = session.createSQLQuery("select * from t_student");

  List students = sqlQuery.list();

  for (Iterator iter = students.iterator();iter.hasNext();){

  Object[] obj = (Object[])iter.next();

  System.out.println(obj[0] +", " + obj[1]);

  }


2.Hibernate增加、修改方式

拿到要修改的物件,呼叫session.saveOrUpdate();方法

public void addStudent(Student stud) {
		Session session=HibernateSessionFactory.getSession();
		Transaction tr=session.beginTransaction();
		try {
			session.saveOrUpdate(stud);//一個方法
//			session.update(stud);
		} catch (HibernateException e) {
			e.printStackTrace();
		}
		tr.commit();
}

2.Hibernate刪除方式


拿到要刪除的物件,呼叫session.delete();方法
public void delStudent(Student stud) {
		Session session=HibernateSessionFactory.getSession();
		
		Transaction tr=session.beginTransaction();
		try {
			session.delete(stud);
			session.flush();
		} catch (Exception e) {
			System.out.println("回滾了");
//			tr.rollback();
		}
		tr.commit();//刪除沒有事務不行!
	}

注意要新增事務:不然增刪改用不了

二、關於hibernate事務的必須開啟的問題

當我們在寫簡單的增刪改的時候,發現如果不開啟事務,資料就不會向資料庫提交這是因為hibernate中的session物件是Connection物件的子類,對Connection的加強,

而我們在看hibernate原始碼的時候發現Session物件中通過了代理,自動幫我們把setAtuoCommit(false),設定成不自動提交,所有我們在增刪改必須開啟事務,而且要提交,同時session還對rollback()進行了代理,所以在commit的時候是自動回滾

三、程式碼演示

package cn.hncu.demo.dao;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.hncu.domain.Student;
import cn.hncu.hib.HibernateSessionFactory;

public class DemoDaoJdbc {
	public List<Student> queryAllStudent(){
		Session session=HibernateSessionFactory.getSession();
		//無論是Load 還是 Get 都會首先查詢快取(一級快取) 如果沒有,才會去資料庫查詢,呼叫Clear() 方法,可以強制清除Session快取
		session.clear();
		Query query=session.createQuery("from Student");
		List<Student> list=query.list();
		return list;
	}
	public void delStudent(Student stud) {
		Session session=HibernateSessionFactory.getSession();
		
		Transaction tr=session.beginTransaction();
		try {
			session.delete(stud);
			session.flush();
		} catch (Exception e) {
			System.out.println("回滾了");
//			tr.rollback();
		}
		tr.commit();//刪除沒有事務不行!
	}
	
	@Test
	public void t(){
		Student stud=new Student();
		stud.setStudId("S003");
		delStudent(stud);
		System.out.println(queryAllStudent());
	}

	public void addStudent(Student stud) {
		Session session=HibernateSessionFactory.getSession();
		Transaction tr=session.beginTransaction();
		try {
			session.saveOrUpdate(stud);
//			session.update(stud);
		} catch (HibernateException e) {
			e.printStackTrace();
		}
		tr.commit();
	}

	public Student queryAStudent(Student stud) {
		Session session=HibernateSessionFactory.getSession();
		String hql="from Student s where s.studId=?";
		Query query=session.createQuery(hql);
		query.setParameter(0, stud.getStudId());
		List<Student> list=query.list();
		if(list!=null&&list.size()>0){
			return list.get(0);
		}
		return null;
	}
	public List<Student> queryStudent(Student stud) {
		Session session=HibernateSessionFactory.getSession();
		String hql="from Student s where 1=1";
		if(stud.getStudId()!=null&&stud.getStudId().trim().length()>0){
			hql+=" and s.studId='"+stud.getStudId()+"'";
		}
		if(stud.getStudName()!=null&&stud.getStudName().trim().length()>0){
			hql+=" and s.studName='"+stud.getStudName()+"'";
		}
		if(stud.getStudAge()!=null){
			hql+=" and s.studAge="+stud.getStudAge();
		}
		if(stud.getDeptId()!=null&&stud.getDeptId().trim().length()>0){
			hql+="and s.deptId='"+stud.getDeptId()+"'";
		}
		Query query=session.createQuery(hql);
		List<Student> list=query.list();
		return list;
	}
}

HibernateSessionFactory

package cn.hncu.hib;

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

public class HibernateSessionFactory {
	private static final String CONFIG_FILENAME="/hibernate.cfg.xml";//檔名
	private static final ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();//本地執行緒
	private static Configuration config=new Configuration();
	private static SessionFactory sessionFactory;//宣告一個SessionFactory物件
	static{
		try {
			config.configure(CONFIG_FILENAME);
			sessionFactory=config.buildSessionFactory();
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}
	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
	public static Session getSession() throws HibernateException{
		Session session=threadLocal.get();
		if(session==null||!session.isOpen()){//如果這個連結沒開
			if (sessionFactory==null) {
				config.configure(CONFIG_FILENAME);
				sessionFactory = config.buildSessionFactory();
			}
			session=(sessionFactory!=null)?sessionFactory.openSession():null;//是否開放一個session
			threadLocal.set(session);//把session放入本地執行緒
		}
		return session;
	}
	
	//關閉連線
	public static void closeSession() throws HibernateException{
		Session session=threadLocal.get();
		threadLocal.remove();
		if(session!=null){
			session.close();
		}
		
	}

}




相關推薦

Hibernate5.3.7版核心API

1、Configuration 該介面只存在系統初始化階段,將SessionFactory建立完成,語法如下: Configuration configuration = new Configuration().configure(); 或者: Configuratio

Hibernate5.3.7版本核心XML檔案

1、*.hbm.xml檔案詳解 該檔案是將物件持久化到關係型資料庫中的相關資訊,結構基本相同: <?xml version="1.0"?> <!--對映檔案的dtd資訊--> <!DOCTYPE hibernate-mapping PUBLIC "-

android mvp高速開發框架介紹dileber的簡單介紹

activity 數據 -c pos androi mod family 基於 ebe 今天我為大家介紹一款android mvp框架:dileber(https://github.com/dileber/dileber.git) 官方交流qq群:171443

Spring框架——AOP面向切面編程詳解

通過 cts ssi 沒有 object 引入 集中 method 可能 1 AOP概述 ●AOP(Aspect-Oriented Programming,面向切面編程):是一種新的方法論,是對傳統 OOP(Object-Oriented Programming,面向對象

java:Mybatis框架1基本配置,log4j

屬性 apache led sta sql inpu ack ima 文件中 1.mybatis01:   db.properties: driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3

python3 開發面試題裝飾器必須6.4

args 返回 event aps 面試題 wrap spl def pen def f(): print("2018-06-04") # 每次調用f的時候 在打印"2018-06-04" 之前打印一句 開始, 之後再打印一句 結束 d

mysql 5.7 基於GTID 主從同步的1236故障處理其它事務故障等同

其它 top 處理 set tid gtid stop eve 1-1 登錄從庫 stop slave; 查看執行事務 show slave status\G Retrieved_Gtid_Set: ee3bdb44-f6a1-11e7-b194-005056a35fd4

SSM框架搭建Eclipse+非Maven版本

時間:2018年5月26日 目的:                搭建一個簡單的ssm框架,提升自己對ssm框架的理解。 基本步驟: 1、建立web工程

SQL Server資料庫開發5.事務和遊標

一、事務 1.1事務:是有若干個T-SQL指令組成,並且所有的指令作為一個整體提交給資料庫系統,執行時,這這組指令要麼全部完成,要麼全部撤銷。因此,事務是一個不可分割的邏輯單元。 事務必須具有四個屬性:原子性、一致性、隔離性、永續性(也稱為事務的額ACID屬性) 1.2事務的模式(

SpringMVC框架搭建 使用Jar包搭建

在上次的部落格中演示瞭如何使用MyEclipse搭建Spring的開發環境,這次我們引導大家通過jar包的形式來搭建Spring的開發環境。 1.首先我們通過http://repo.springsource.org/libs-release-local/來到如下的目錄中 然後點選 org

Spring boot 框架搭建maven + mybatis + jersey +mysql

一、建立一個maven專案 1.首先是建立一個Spring boot 的maven 專案,選擇maven-archetype-quickstart這個maven過濾器,建立一個maven專案。 2.建立後續的自己專案的根節點資訊,然後選擇finish。

C# Winform下一個熱插拔的MIS/MRP/ERP框架12資料處理基類

/// <summary> /// 資料庫連線基類 /// </summary> public class DBContext { /// <summary> /// 預設的加密方法Key,用於使用者

vue框架搭建移動端-crm7slyun專案

一.開發環境 安裝nodejs、webpack,按網上教程即可 二.vue-cli初始化專案 拉取git已建好的專案名,在本地使用vue-cli初始化專案,按網上教程即可 三.css處理方式(scss) 使用scss方式處理css,首先安裝scss:執行 npm i

4程序子程序的開啟

序列問題: 多道處理技術 (*******************) 1. 時間的複用,cpu在多個任務之間不斷的進行切換 2. 空間的複用 多個任務必須開闢屬於自己的記憶體空間 (物理級別的隔離) 相關概念:(*******************) cpu: 計算執行任務的 不會執行IO操作(I

從零開始開發IoC依賴注入框架 -- containerx 深入研究Spring原始碼含github原始碼

摘要: 自己寫了一個開源的IoC控制反轉(依賴注入)框架,名為containerx。初學Spring原始碼的同學,可以先研究下這個小專案。更容易理解Spring的原始碼 自己寫了一個開源的IoC控制反轉(依賴注入)框架,名為containerx。初學Spring原始碼的同學,可以先研究下這個

Android TV框架 TIFAndroid TV Input Framework入門實踐

做TV開發一段時間了,國內目前關於這方面的資料並不多,這裡我來分享一下我對TIF的使用心得。Android TIF(Android TV Input Framework)是Google向電視製造商提供了一套標準的API,用於建立Input模組來控制Andro

讓微信小程式在瀏覽器和自己的App中執行--自己寫的一個開源框架FreeMina開發中。。

FreeMina: An open mina compatible framework for running in browser or webview. 一個相容微信小程式Mina框架的開源框架 從小程式的設計來看,微信正走向封閉生態。我們開發的微信

php搭建mvc框架類的自動載入

首先呢這是在上一篇的基礎上繼續寫的!! 目錄: 自動載入類: 下面的就是在上一篇的程式碼基礎上,寫的自動載入類的程式碼展示。 <?php /* * 入口檔案 * 定義常量 * 載入函

Android主流IOC框架淺析Java註解反射原理

TextView mTextView; mTextView=(TextView) findViewById(R.id.mTextView); mTextView.setOnClickListener(new OnClickListener() { @Override public void onClick

一步一步完成SSM框架整合Spring+Spring MVC + Mybatis

新建maven工程 eclipse中選擇new Maven Project項,制定archetype為webapp,填寫好groupId之類的,然後finish,這時可能工程有一些錯誤,通過修改Java Build Path,修復錯誤: 然後new一個s