hibernate入门二之单表操作
友情提醒:以下所有的操作都是在hibernate入门一的基础上操作的,参考链接:https://www.cnblogs.com/lindaiyu/p/10990525.html
单一主键
assigned 由Java程序负责生成(手工赋值)
native 由底层数据库自动生成表示符,如果是mysql就是increment,如果是oracle就是sequence,等等。
这个主要跟两个地方有关:
hbm.xml(主要地方)
<id name="sid" type="int">
<column name="SID"/>
<!--主键的生成策略-->
<generator class="assigned"/>
</id>
cfg.xml
<!--自动生成,create会覆盖掉原来的数据,若是要后续增加,需使用update--> <property name="hbm2ddl.auto">create</property>
基本类型
hibernate映射类、Java类型、标准SQL类型(不常用)
容易出错的两种类型:date类型、timestamp类型(时间戳)
<!--java.util.Date 的日期类型是日期+时间(也可以使用hibernate的timestamp),若是只需要日期或者时间,只需要将Java.util.Date改为hibernate的date或者time类型即可-->
<property name="birthday" type="java.util.Date">
对象类型
//如何使用hibernate存储照片
@org.junit.Test
public void testWriteBlob() throws Exception{
Students s = new Students();
//先获得照片文件
File f = new File("/Users/huizhao/Desktop"+File.separator+"1.jpg");
//获得文件的输入流
InputStream inputStream = new FileInputStream(f);
//创建一个Blob对象
Blob image = Hibernate.getLobCreator(session).createBlob(inputStream, inputStream.available());
//设置照片属性
s.setPictur(image);
//保存学生
session.save(s);
}
//如何使用hibernate输出照片
@org.junit.Test
public void testReadBlob() throws Exception{
Students s =(Students) session.get(Students.class,1);
//获得Blob对象
Blob image = s.getPictur();
//获得照片的输入流
InputStream input = image.getBinaryStream();
//创建输出流
File file = new File("/Users/huizhao/Desktop" + File.separator + "2.jpg");
//获得输出流
FileOutputStream fileOutputStream = new FileOutputStream(file);
//创建缓冲区
byte[] buff = new byte[input.available()];
input.read(buff);
fileOutputStream.write(buff);
fileOutputStream.close();
input.close();
}
组件属性
实体类中的某个属性属于用户自定义的类的属性(其中的name="address"对应类的变量,class为对应的实体类),component是组件属性,component中的property是address的字属性,三个属性构成了address属性
进行测试:
1、建立一个Address类
package com.hibernate.entity; public class Address { private String postcode; private String phone; private String address; public Address(){} public Address(String postcode, String phone, String address) { this.postcode = postcode; this.phone = phone; this.address = address; } public String getPostcode() { return postcode; } public void setPostcode(String postcode) { this.postcode = postcode; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Address{" + "postcode='" + postcode + '\'' + ", phone='" + phone + '\'' + ", address='" + address + '\'' + '}'; } }
2、在之前的学生类里面加上Addre属性,并配置set和get方法
private Address address;
3、在hbm.xml中加入以下代码:
<component name="address" class="com.hibernate.entity.Address" > <property name="postcode" column="POSTCODE" type="java.lang.String"/> <property name="phone" column="PHONE" type="java.lang.String"/> <property name="address" column="ADDRESS" type="java.lang.String"/> </component>
友情提醒:
1、class属性的类一定是带包名的,否则会出错
2、protperty元素之后也是要加type 类型的,否则会报错
4、测试
@org.junit.Test public void TestSaveStudents() { //生成学生对象 //Students s = new Students(2, "张三丰", "南", new Date(), "武当山"); Students s = new Students(); s.setSname("zhangsan"); s.setGender("nan"); s.setBirthday(new Date()); //s.setAddress("wudang"); Address address = new Address("123","456","789"); s.setAddress(address); session.save(s); }
单表CURD操作
参考链接:https://www.cnblogs.com/lindaiyu/p/10962716.html
格言:从不熟悉到熟悉是一个过程,无需恐惧。