09-hibernate單表操作(1)
阿新 • • 發佈:2017-11-12
hbm.xml ive eat ring sets () 16px bin 提交
1,單一主鍵
2,基本類型
3,對象類型
4,組件屬性
5,單表操作
單一主鍵
常用生成策略:
assigned 有程序員生成(手工)
native 由數據庫底層,如果是mysql是increment,如果是Oracle是sequence。
測試assigned :代碼手動給他賦值,不給ID賦值
import java.util.Date; 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; //測試類 public class StudentsTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @Beforepublic void init() { //創建配置對象 Configuration config=new Configuration().configure(); config.addClass(Students.class);//這個需要加上(視頻裏面沒有) //創建服務註冊對象。 ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder() .applySettings(config.getProperties()).build();//通過config.getProperties()讀取配置文檔。 //創建會話工廠對象 sessionFactory=config.buildSessionFactory(serviceRegistry); //創建會話對象 session=sessionFactory.openSession(); //開啟事務 transaction=session.beginTransaction(); } @After public void destory() { transaction.commit();//提交事務 session.close();//關閉會話 sessionFactory.close();//關閉會話工廠 } @Test public void testSaveStudents() { //生成學生對象 // Students s=new Students(1,"張三豐","男",new Date(),"武當山"); Students s=new Students(); s.setSname("張三豐"); s.setGender("男"); s.setAddress("北京"); s.setBirthday(new Date()); session.save(s);//保存對象進入數據庫 } }
結果發現SID字段默認為0,並沒有給他賦值。.
基本類型:
對象類型
mysql裏面clob類型用Text替代。
保存blob類型測試:在類文件中加上blob類型的picture屬性。
import java.sql.Blob; import java.util.Date; //學生類 public class Students { //必須是共有類 //提供共有的不帶參數的默認的構造方法 //屬性私有 //熟悉使用setter/getter封裝 private int sid;//學號 private String sname;//姓名 private String gender;//性別 private Date birthday;//出生日期 private String address;//地址 private Blob picture; public Blob getPicture() { return picture; } public void setPicture(Blob picture) { this.picture = picture; } public Students() { } public Students(int sid, String sname, String gender, Date birthday, String address) { //super(); this.sid = sid; this.sname = sname; this.gender = gender; this.birthday = birthday; this.address = address; } public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Students [sid=" + sid + ", sname=" + sname + ", gender=" + gender + ", birthday=" + birthday + ", address=" + address + "]"; } }
重新生成一下hbm.xml文件,新增了如下:
在測試類中加上測試方法:
以下用到了獲取Blob對象的方法:
//createBlob(從哪個輸入流讀取,讀取的長度(這裏就是輸入流可用的字節數)) Blob image=Hibernate.getLobCreator(session).createBlob(input,input.available());
其中createBlob兩個參數分別表示:從哪個輸入流讀取,要讀取的長度,input.available()表示該輸入流可用的字節流。
import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Blob; import java.util.Date; import org.hibernate.Hibernate; 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; //測試類 public class StudentsTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @Before public void init() { //創建配置對象 Configuration config=new Configuration().configure(); config.addClass(Students.class);//這個需要加上(視頻裏面沒有) //創建服務註冊對象。 ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder() .applySettings(config.getProperties()).build(); //通過config.getProperties()讀取配置文檔。 //創建會話工廠對象 sessionFactory=config.buildSessionFactory(serviceRegistry); //創建會話對象 session=sessionFactory.openSession(); //開啟事務 transaction=session.beginTransaction(); } @After public void destory() { transaction.commit();//提交事務 session.close();//關閉會話 sessionFactory.close();//關閉會話工廠 } @Test public void testSaveStudents() { //生成學生對象 // Students s=new Students(1,"張三豐","男",new Date(),"武當山"); Students s=new Students(); s.setSname("張三豐"); s.setGender("男"); s.setAddress("北京"); s.setBirthday(new Date()); session.save(s);//保存對象進入數據庫 } @Test public void testWriteBlob() throws Exception { Students s=new Students(1,"張三豐","男",new Date(),"武當山"); //先獲得照片文件 File f=new File("d:"+File.separator+"jee-oxygen"+File.separator+"文檔"+File.separator+"Picture"+File.separator+"孫悟空.png"); //獲得照片文件的輸入流 InputStream input=new FileInputStream(f); //創建一個Blob對象 //createBlob(從哪個輸入流讀取,讀取的長度(這裏就是輸入流可用的字節數)) Blob image=Hibernate.getLobCreator(session).createBlob(input,input.available()); //設置照片屬性 s.setPicture(image); //保存 session.save(s); } }
生成結果:
為了測試是否真正寫到了數據庫中,把它讀取出來:
為了保證數據不被刪除,把hbm2ddl.auto改成update
為了獲取數據庫中對應的數據,映射到類。用如下方法session.get():
//從數據庫中獲取該條數據的對象 //get(類.class,主鍵值為1的數據) Students s=session.get(Students.class, 1);
表示從數據庫中讀取students這個類所映射的表,裏面主鍵值為1的數據。
session.get(類.CLASS,主鍵值)獲取
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.sql.Blob; import java.util.Date; import org.hibernate.Hibernate; 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; //測試類 public class StudentsTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @Before public void init() { //創建配置對象 Configuration config=new Configuration().configure(); config.addClass(Students.class);//這個需要加上(視頻裏面沒有) //創建服務註冊對象。 ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder() .applySettings(config.getProperties()).build(); //通過config.getProperties()讀取配置文檔。 //創建會話工廠對象 sessionFactory=config.buildSessionFactory(serviceRegistry); //創建會話對象 session=sessionFactory.openSession(); //開啟事務 transaction=session.beginTransaction(); } @After public void destory() { transaction.commit();//提交事務 session.close();//關閉會話 sessionFactory.close();//關閉會話工廠 } @Test public void testSaveStudents() { //生成學生對象 // Students s=new Students(1,"張三豐","男",new Date(),"武當山"); Students s=new Students(); s.setSname("張三豐"); s.setGender("男"); s.setAddress("北京"); s.setBirthday(new Date()); session.save(s);//保存對象進入數據庫 } @Test public void testWriteBlob() throws Exception { Students s=new Students(1,"張三豐","男",new Date(),"武當山"); //先獲得照片文件 File f=new File("d:"+File.separator+"jee-oxygen"+File.separator+"文檔"+File.separator+"Picture"+File.separator+"孫悟空.png"); //獲得照片文件的輸入流 InputStream input=new FileInputStream(f); //創建一個Blob對象 //createBlob(從哪個輸入流讀取,讀取的長度(這裏就是輸入流可用的字節數)) Blob image=Hibernate.getLobCreator(session).createBlob(input,input.available()); //設置照片屬性 s.setPicture(image); //保存 session.save(s); } @Test public void testReadBlob() throws Exception { //從數據庫中獲取該條數據的對象 //get(類.class,主鍵值為1的數據) Students s=session.get(Students.class, 1); //獲得Blob對象 Blob image=s.getPicture(); //獲得輸入流 InputStream input=image.getBinaryStream(); //創建輸出流 File f=new File("D"+File.separator+"孫悟空.png"); //獲得輸出流 OutputStream output=new FileOutputStream(f); //創建緩沖區 byte[] buff=new byte[input.available()]; //把輸入流讀取到緩沖區裏面 input.read(buff); //把緩沖區的內容寫入到輸出流 output.write(buff); //File對象就像是一個本地倉庫,需要指明倉庫的地址,而數據庫是相對的另一個倉庫 //,輸入流InputStream就像是數據庫的專職運輸人員,而輸出流OutputStream就像是存儲的專職運輸人員 //緩沖區byte[] buff就像是輸入流和輸出流兩個運輸人員要交接的一個快遞櫃。 //如果要把數據讀取到數據庫,這個操作就要交給輸入流運輸人員。 //要把數據讀取到本地,就要輸出流運輸人員來幹。 //對於輸入流和輸出流來說,要從數據庫這個倉庫裏面的東西放到本地倉庫,先由數據庫的專職人員拿鑰匙從數據庫取出來, //存放到一個快遞櫃裏面,然後本地的專職運輸人員,從快遞櫃裏面,把東西拿出來,放到File這個對象說好的地址。 //輸入流運輸人員放東西進入快遞櫃的操作,叫做read(),輸出流把東西從快遞櫃取出來的操作,叫做write()。 } }
對IO操作的個人理解:
//File對象就像是一個本地倉庫,需要指明倉庫的地址,而數據庫是相對的另一個倉庫 //,輸入流InputStream就像是數據庫的專職運輸人員,而輸出流OutputStream就像是存儲的專職運輸人員 //緩沖區byte[] buff就像是輸入流和輸出流兩個運輸人員要交接的一個快遞櫃。 //如果要把數據讀取到數據庫,這個操作就要交給輸入流運輸人員。 //要把數據讀取到本地,就要輸出流運輸人員來幹。 //對於輸入流和輸出流來說,要從數據庫這個倉庫裏面的東西放到本地倉庫,先由數據庫的專職人員拿鑰匙從數據庫取出來, //存放到一個快遞櫃裏面,然後本地的專職運輸人員,從快遞櫃裏面,把東西拿出來,放到File這個對象說好的地址。 //輸入流運輸人員放東西進入快遞櫃的操作,叫做read(),輸出流把東西從快遞櫃取出來的操作,叫做write()。
運行結果:發現在本地有圖片,表示真正存到了數據庫,並且被讀取到本地。
09-hibernate單表操作(1)