09-hibernate单表操作

Posted 美好的明天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了09-hibernate单表操作相关的知识,希望对你有一定的参考价值。

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单表操作的主要内容,如果未能解决你的问题,请参考以下文章

mybatis单表操作实现完全java代码封装

sql片段

model,单表操作

11-hibernate,单表GRUD操作实例

sql片段的定义

VSCode自定义代码片段——git命令操作一个完整流程