1. 程式人生 > >09-hibernate單表操作(1)

09-hibernate單表操作(1)

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; @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);//保存對象進入數據庫 } }

結果發現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)