码迷,mamicode.com
首页 > Web开发 > 详细

09-hibernate单表操作(1)

时间:2017-11-12 13:31:13      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:figure   binary   参数   over   UI   生日   缓冲区   es2017   输入   

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)

标签:figure   binary   参数   over   UI   生日   缓冲区   es2017   输入   

原文地址:http://www.cnblogs.com/alsf/p/7820483.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!