一、與數據庫的交互(增刪改查)
注意: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();
- }
- }
- }