一般一个映射文件对应于一个class,即对应于一张表。但是一个映射文件中可以有多个class
<hibernate-mapping package="cn.it.domain">
<!-- (name)哪个类,如果在<hibernate-mapping package指定了包名,那么在class 中就不用指定包名,直接写User就行了,一般写出来
(table) 对应于哪个表:这里可以不写,默认是类的简单名称
-->
<class name="User" table="t_user">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="name" column="name"/>
</class>
</hibernate-mapping>
<hibernate-mapping package="cn.itcast.c_hbm_property">
<!-- name属性:哪个类
table属性:对应哪个表,如果不写,默认的表名就是类的简单名称
-->
<class name="User" table="t_user">
<id name="id" type="int" column="id">
<generator/>
</id>
<!-- 普通的属性(数据库中的基本类型,如字符串、日期、数字等)
name属性:对象中的属性名,必须要有。
type属性:类型,如果不写,Hibernate会自动检测。
可以写Java中类的全名:java.lang.String
或是写hibernate类型:string 小写,推荐使用
column属性:对应表中的列名,如果没有,默认为属性名。
length属性:长度,不是所有的类型都有长度属性,比如varchar有,但int没有,如果不写默认为255
not-null属性:非空约束,默认为false
-->
<!--
<property name="name"/>
-->
<property name="name" type="string" column="name" length="20" not-null="true"/>
<property name="age" type="int" column="age_"/>
<property name="birthday" type="date" column="birthday_"/>
<!-- 当列表与关键字冲突时,可以通过column属性指定一个其他的列名。
或是使用反引号包围起来,在键盘的波浪线下面:·· 建议不使用。
指定使用text类型时,最好再指定length,以确定生成的SQL类型是能够存放指定数量的字符的。
<property name="desc">
<column name="desc_" length="5000" sql-type="text"/>
</property>
-->
<property name="desc" type="text" length="5000" column="`desc`" ></property>
这里是两种方式:一种是将列名写成子元素,一种是将列名写成属性
<!-- 头像,二进制类型,最好指定长度 -->
<property name="photo" type="binary" length="102400"></property>
</class>
</hibernate-mapping>
对于二进制文件的存取:
// 读取图片文件
InputStream in = new FileInputStream( "c:/test.png");
byte[] photo = new byte[in.available()];
in.read(photo);
in.close();
// 创建对象实例
User user = new User();
user.setName("张三");
user.setAge(20);
user.setBirthday(new Date());
user.setDesc("一大段的说明,此处省略5000字……");
user.setPhoto(photo);
这样之后将数据放在了数据库中
下面是从数据库中取出数据,写入到文件中:
public void testGet() throws Exception {
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = (User) session.get(User.class, 4); // 获取
System.out.println(user.getId());
System.out.println(user.getName());
System.out.println(user.getDesc());
System.out.println(user.getPhoto());
OutputStream out = new FileOutputStream("c:/copy.png");
out.write(user.getPhoto());//用流关联,将数据写入到文件中
out.close();
tx.commit();
session.close();
==============
主键:
如果是数字,建议使用包装类型。
identity
sequence
hilo
native
assigned
uuid
foreign
...
<hibernate-mapping package="cn.itcast.d_hbm_id">
<class name="User" table="t_user">
<!-- id元素用于映射主键。
子元素generator是用于指定主键生成策略的,即:某种生成主键的某种方式,
可能程序员手动指定,可能数据库中自动生成,等等。
-->
<id name="id">
<!-- identity:使用数据库的自动增长策略,不是所有数据库都支持,比如oracle就不支持 ,数据库的自动增长策略时不同的。
<generator/>
-->
<!-- sequence:在 DB2,PostgreSQL,Oracle,SAP DB,McKoi 中使用序列(sequence)
在使用Oracle数据库时可以使用这一个
<generator/>
-->
以上几种是数据库的自动生成的,我们是不用管的。
<!-- hilo,使用高低位算法生成主键值。是不依赖数据库的一种方式。
只需要一张额外表,所有的数据都支持。
<generator>
<param name="table">hi_value</param>
<param name="column">next_value</param>
<param name="max_lo">100</param>
</generator>
像上面写了之后,表将自动创建出来,表名:hi_value,表中的列名:next_value。
规律是:n*100+n,即生成的主键是:n*100+n,n是next_value的值
-->
<!-- 根据底层数据库的能力选择 identity、sequence 或者 hilo中的一个。
<generator></generator>
-->
<!-- increment:由Hibernate维护的自动增长。
先查询当前最大的id值,再加1使用
不推荐使用,因为在多线程下会问题。
<generator></generator>
-->
<!-- assigned:手工指定主键值
<generator></generator>
-->
<!-- uuid:由Hibernate自动生成UUID并指定为主键值。 -->
<generator></generator>
</id>
<property name="name"/>
</class>
</hibernate-mapping>