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