Hibernate操作表单

来源:互联网 发布:手机直播源码教程 编辑:程序博客网 时间:2024/05/18 09:02

单表操作

单一主键

(1)assigned 由java应用程序负责生成(手工赋值)
(2)native 由底层数据库自动生成标示符,如果是MySQL就是increment,如果是Oracle就是sequence,等等
Ps1:assigned注意:如果实体类中设置的主键id是基本类型int的话,则可以不用赋值,系统默认值为0;如是引用类型Integer话,则默认值为null,不赋值系统则报错。
Ps2:native注意:系统会自动选择该数据库对应的自动增值方式,从1开始。即使手动给他赋值,也不会起作用,但也不会报错。

hibernates数据类型

hibernate数据类型对应的Java类型

特别关注date和timestamp类型
这里写图片描述

数据类型
这里写图片描述

Java中blob对象

BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。
在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。
BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。

在持久类中添加一个blob类型的picture,利用hibernate对数据库进行操作

@Testpublic void testWriteBlob() throws Exception{    //先获得照片文件    File f=new File("C:\\Users\\john\\Pictures\\tag.jpg");    //获得照片文件输入流    InputStream input =new FileInputStream(f);    //创建一个Blob对象    Blob image=Hibernate.getLobCreator(session).createBlob(input, input.available());    //设置照片属性    user user=new user();    user.setId(1);    user.setPassword("rose");    user.setUsername("rose");    user.setPicture(image);    //保存    session.save(user);}

**记得把配置文件中的
<property name="hbm2ddl.auto">update</property>
改成update
**


这段代码会在原有的数据表的基础上更新数据表,添加一个字段名为picture的longblob类型的对象。

可以再写一个测试方法用来读取该图片是否已经写进数据库中

@Test    public void testReadBlob() throws Exception{        user user=(user)session.get(user.class, 1);        //获得Blob对象        Blob image=user.getPicture();        //获得照片输入流        InputStream input=image.getBinaryStream();        //创建输出流        File f=new File("C:\\Users\\john\\Pictures\\copytag.jpg");        //获得输出流        OutputStream output=new FileOutputStream(f);        //创建缓冲区        byte[] buff=new byte[input.available()];        input.read(buff);        output.write(buff);        input.close();        output.close();}

如果在该路径下找到了文件名为copytag.jpg的文件,则表明该写入成功


-hibernate还有一种类型是组件属性

这里写图片描述

组件属性:实体类中的某个属性属于用户自定义类的对象;
作用:将两个实体类合并在一起组建成一个表;
在hbm.xml文件中配置:
格式:

<component name="取的名字" class="完整类名"><property name="类中属性" column="对应生成数据库中列属性名"></component>

完整类名:如果该类有包名,则需要加上包名,且用(.点 )来连接。

单表的CURD操作,即增删改查,会用到以下几个方法

1、save()
2、update()
3、delete()
4、get/load(查询单个记录)

get/load方法的区别

1.数据不存在,get方法返回null。
2.load方法,抛出ObjectNotFoundException
3.调用get方法后,直接发出sql语句,返回一个实体对象。
4.调用load方法后,返回一个代理对象,就是假的对象,里面只有实体对象的id存在,用到实体对象的其他属性时,才会发出sql获取一个完整的实体对象。

####openSession与getCurrentSession的区别?

1、前者每次都是创建新的session对象,而后者使用单例模式,每次创建都是相同的对象。openSession在使用完毕后需要显式地关闭,而getCurrentSession在事务提交之后会自动关闭。
2、他们都是来自于SessionFactory,如果使用getCurrentSession方法则需要在hibernate.cfg.xml文件中进行配置:

如果是本地事务(jdbc事务)

<propertyname="hibernate.current_session_context_class">thread</property>

如果是全局事务(jta事务)

<propertyname="hibernate.current_session_context_class">jta</property>

最后,总结一下开发Hibernate的步骤

(1)编写配置文档hibernate.cfg.xml

(2)编写实体类。注意:每一个实体类都要与数据库中的一张表一一对应,实体类的编写要遵循JavaBean的要求。

(3)生成对应实体类的映射文件并添加到配置文档中

(4)调用Hibernate API进行测试

1 0
原创粉丝点击