package com.hanqi.test; import java.util.Date; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.hanqi.entity.User; public class Test01 { private Session se=null; private SessionFactory sf=null; private Transaction ts=null; //定義特殊方法 //在測試用例方法被執行以前自動執行的方法 //通常用來初始化公用的對象 //前置方法 @Before public void init() { //1獲取配置文件 Configuration cfg=new Configuration().configure(); //2註冊配置 ServiceRegistry sr=new StandardServiceRegistryBuilder() .applySettings(cfg.getProperties()).build(); //3獲取SessionFactory (至關於jdbc的鏈接connection) sf=cfg.buildSessionFactory(sr); System.out.println(sf); //4產生Session 保存 跟jsp session不要緊 叫會話而已 真正幹活的 se=sf.openSession(); //5啓動事務 ts=se.beginTransaction(); } //後置方法 //通常用來釋放資源 @After public void destory() { //7提交事務 ts.commit();//提交事務,否則沒有真正的放到數據庫 在這裏執行了insert語句才寫進數據庫 //8釋放資源 se.close(); sf.close(); } //測試Hibernate鏈接 @Test public void test() { //6操做數據庫 //添加數據 //實例化新對象,處於臨時狀態 User u1=new User(); u1.setBirthday(new Date());//建立當地時間 u1.setMoney(2000); u1.setPassword("123456"); u1.setUserName("測試1"); //u1.setUserID(2);//天然主鍵 //保存數據 //經過save方法把對象從臨時狀態轉成持久化狀態 se.save(u1);//不用操心insert語句,但不在這執行語句,也會有主鍵,hibernate自動生成 System.out.println(u1); } //測試查詢 @Test public void test1() { //查詢數據 查一個 //提供2個參數 //須要返回哪個持久化類的實例 //實例的標識(數據的主鍵值) //經過session的get方法得到的對象處於持久化狀態 User u2=(User)se.get(User.class,5);//User類 主鍵是3 System.out.println(u2); //修改數據 User u3=(User)se.get(User.class,10);//User類 主鍵是3 u3.setUserName("修改"); System.out.println(u3); //刪除 //se.delete(u2);//使持久化對象進入刪除狀態 } @Test public void test2() { User u1=(User)se.get(User.class,5);//當即加載數據 System.out.println("get後"); System.out.println("u1="+u1); User u2=(User)se.get(User.class,6); System.out.println("u2="+u2); } public void test3() { User u1=(User)se.load(User.class,6 );//延時加載數據 System.out.println("load後"); System.out.println("U1="+u1);//當要使用時才能加載 } //測試遊離狀態 @Test public void test4() { //獲得持久化狀態的對象 User u1=(User)se.get(User.class, 6); System.out.println("u1="+u1); se.close();//關閉遊離狀態 //使u1進入遊離狀態 u1.setUserName("測試遊離456"); //把OID置成null u1.setUserID(null);//把實體類的類型改成Integer System.out.println("從新建立Session和事務..."); //從新建立Session,再使session回來 se=sf.openSession(); //從新開啓事務 事務se.close()以前已經關了 ts=se.beginTransaction(); se.saveOrUpdate(u1);//自動判斷是save仍是update 爲空是添加,有的話修改 } //測試HQL @SuppressWarnings("unchecked") @Test public void test5()//Ouery是個查詢類,要建立 { //使用HQL 這是面向對象的,必定要注意大小寫 //建立Query對象 // Query qu=se.createQuery("from User u where u.userID >? and u.userName=:uname order by userID"); //user是類名,寫類名,針對實體類的 屬性 構造方法按規則減小麻煩 //設置佔位符 // qu.setInteger(0,20);//?的以前sql是從1開始,而這裏是從0開始 //按參數名方式設置 // qu.setString("uname","測試1"); //執行查詢 List<User> lu;//=qu.list();//獲得結果集 //方法鏈調用 //都返回Query qu來取得結果集 前面也是不用寫 lu=se.createQuery("from User where userID>?") .setInteger(0,100)//setInteger結果有返回值,返回它本身 .list(); for(User u:lu) { System.out.println(u); } } //Query qu=se.createQuery("from User where u.userID <100 and username like '測試1' order by userID desc"); //Query qu=se.createQuery("from User where userID >100 order by userID"); //java8 lu=上面的,加上.scream().formatch() @Test @SuppressWarnings("unchecked") public void test6() { List<User> lu=se.createQuery("from User order by userID") .setMaxResults(5)//默認從0行開始,不用寫第幾行開始 .list(); for(User u:lu) { System.out.println(u); } } @Test @SuppressWarnings("unchecked") public void test66() { //設置開始行號 :頁碼=2 //開始行數=(頁碼減一 )*每頁行數 List<User> lu=se.createQuery("from User order by userID") .setMaxResults(5)//默認從0行開始,不用寫第幾行開始 .setFirstResult(5)//(2-1)*5 .list(); for(User u:lu) { System.out.println(u); } } @SuppressWarnings("unchecked") @Test public void test7() { //分組查詢 單列 //由於group by在數據庫中select只能返回username,不能查全部,因此返回任意類型不是單個的object[] //from 開頭表示select * 不行因此加select //單個例不必數組 List<Object> lo=se.createQuery("select userName from User group by userName") .list(); //輸出長度 //System.out.println("數據條數="+lo.size()); for(Object o:lo) { System.out.println(o); } } @SuppressWarnings("unchecked") @Test public void test77() { //分組查詢 多列 //由於group by在數據庫中select只能返回username,不能查全部,因此返回任意類型不是單個的object[] //from 開頭表示select * 不行因此加select //單列不必數組 List<Object[]> lo=se.createQuery("select userName,count(1) from User group by userName") .list(); //輸出長度 //System.out.println("數據條數="+lo.size()); for(Object[] o:lo) { System.out.println(o[0]+""+o[1]); } } }
數據庫的表t_userjava
test6方法控制檯sql
test66方法的控制檯顯示數據庫
oracle的分頁寫法,效率最高的數組
select * from (select a.*, rownum as r from (select t.* from T_USER t order by userid) a
where rownum <=10)where r > 5session
不要有t.rowid,這是刪除數據用的oracle
數據庫中的表app
test7方法控制檯jsp
test77控制檯測試