Hibernate初探之单表操作(3)

1.[Hibernate单表操作] 单一主键

单一主键由某一列充当主键,当然也有复合主键,这里介绍单一主键常用的两种生成策略

  • assigned 由java应用程序负责生成(手工赋值)
  • native 由底层数据库自动生成标示符,如果是mysql就是increment,如果是oracle就是sequence等等
    我们用上节的代码来测试添加一个学生,先查看配置文件中的主键设置是assigned,手工赋值,如果我们生成一个学生对象,但是没有对其id赋值,我们添加试试,会发现添加还是成功了,是0,这是为什么呢?因为我们知道学生类的属性id我们定义的是整型,默认就是0。
    下面我们来测试native,还是不指定主键的值,这时执行后查看表结构,表结构主键显示是自动增长的类型,添加成功,id为1。注意第二次添加时将配置create改成update

2.[Hibernate单表操作] 基本类型

这里写图片描述
这里着重说一下Date类型
这里写图片描述
Hibernate的三种时间类型:日期date ,时间time ,时间戳(年月日时分秒)timestamp

3.[Hibernate单表操作] 对象类型

这里写图片描述
CLOB类型:大文本类型;
BLOB:大的二进制文件类型(如音频、视频、图片等)
MySQL不支持标准SQL的CLOB类型,在MySQL智能光,用TEXT,MEDIUMTEXT以及LONGTEXT类型表示长度唱过255字节的长文本数据。
这里我们来举个例子,比如给学生类插入一张张票属性,作为学生的大头贴传递进去,保存然后再复制出来。因为学生类有了变化,所以记得hibernate的配置文件也要有适应的变化或者重新生成一下Students.hbm.xml文件。

public void testSaveStudents() {
        /**
        //生成一个学生对象
        Configuration config=new Configuration().configure();//创建配置对象
        config.addClass(Students.class);
        ServiceRegistry serviceRegistry =new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
        //创建服务注册对象
        sessionFactory =config.buildSessionFactory(serviceRegistry);
        //创建会话工厂对象
        session =sessionFactory.openSession();//打开会话。
        transaction =session.beginTransaction();//打开事务 
        Students s=new Students(2,"张三丰","男",new Date(),"武当山");
        //先获得照片文件
        File f=new File("C:\\Users\\Administrator\\Desktop\\1.jpg");
        try {
            //获得文件的输入流
            FileInputStream fis=new FileInputStream(f);
            //创建一个Blob对象//最后一个参数是可用长度可以用输入流的available来写
            Blob b=Hibernate.getLobCreator(session).createBlob(fis, fis.available());
            s.setImage(b);

            session.save(s);//保存对象进数据库
            transaction.commit();//提交事务
            */
            //要获取这个存取的图片,首先我们要加载这个学生对象
        try {
            Configuration config=new Configuration().configure();//创建配置对象
            config.addClass(Students.class);
            ServiceRegistry serviceRegistry =new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
            //创建服务注册对象
            sessionFactory =config.buildSessionFactory(serviceRegistry);
            //创建会话工厂对象
            session =sessionFactory.openSession();//打开会话。
            Students s1=session.get(Students.class,1);//进行强制转换
            //获得Blob对象
            Blob b1=s1.getImage();
            //获得照片的输入流
            InputStream is=b1.getBinaryStream();
            File f2=new File("C:\\Users\\Administrator\\Desktop\\2.jpg");
            FileOutputStream fos1=new FileOutputStream(f2);
            //创建缓冲区
            byte[] buff=new byte[is.available()];
            is.read(buff);
            fos1.write(buff);
            is.close();
            fos1.close();

            //session.close();//关闭会话
            //sessionFactory.close();//关闭会话工厂
        } catch (FileNotFoundException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }

4.[Hibernate单表操作] 组件属性

这里写图片描述
某个类的属性是一个用户自定义的类的对象时,会这样配置,注意类要符合javabeans规范

5. [Hibernate单表操作] 单表操作CRUD实例

这里写图片描述
单个记录查询get与load的区别
1.在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql语句,返回持久化对象。
2.load方法会在调用后返回一个代理对象,该代理对象只保存了实体对象的id,直到使用对象的非主键属性时才会发出sql语句。
3.查询数据库中不存在的数据时,get方法返回null,load方法抛出异常org.hibernate.ObjectNotFoundException

单表的增删改查CRUD
1.保存对象,save
2.修改对象,update
3.删除对象,delete
4.查询单个记录,get/load

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值