• 09-hibernate单表操作(1)


    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()。

    运行结果:发现在本地有图片,表示真正存到了数据库,并且被读取到本地。

  • 相关阅读:
    k8s二进制安装
    jenkins
    Deploy Apollo on Kubernetes
    Apollo配置中心搭建常见报错
    Apollo配置中心搭建过程
    使用CephRBD为Kubernetes提供StorageClass
    Ceph基础命令总结
    Ceph分布式存储系统搭建
    zabbix入门之配置邮件告警
    zabbix入门之定义触发器
  • 原文地址:https://www.cnblogs.com/alsf/p/7820483.html
Copyright © 2020-2023  润新知