在学习hibernate的学习程中,我们要涉及到两个问题,我的程序如何连接到数据库、程序怎么知道我的一个POJO实例要保存到数据库的哪张表中。Hibernate中的两个配置文件就为我们解决这这两个问题,*.cfg.xml文件来设置我们连接的数据库,*.hbm.xml文件来设置我们的实体文件要和哪张表对应。
下面就分别总结一下这两个配置文件的一些主要的配置方法。
hibernate.cfg.xml与hibernate.properties 配置文件
hibernate.properties的配置比较简单。Heibernate引用的包里提供了该配置文件,这个配置文件详细列出了hibernate配置文件的所有属性。每个配置段都给出了大致的注释,我们只需要取消注释就可以了。
下面来说一说hibernate.cfg.xml的一些基本的配置,该配置文件定义了连接数据库的属性。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 数据库连接的用户名 --> <property name="connection.username">root</property> <!-- 数据库连接的密码 --> <property name="connection.password">123</property> <!-- 设置连接数据库的驱动 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 连接数据库服务的地址 --> <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&characterEncoding=UTF-8</property> <!-- 数据库方言 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- hibernate运行时是否将sql语句打印到控制台 --> <property name="show_sql">true</property> <!-- 输出到控制台的语句是否要进行排版,方便阅读 --> <property name="format_sql">true</property> <!-- 设置是否由java代码生成数据库脚本,进而生成数据库的表结构 --> <property name="hbm2ddl.auto">create</property> <!-- 是否在hibernate生成SQL语句中添加有助于调试的注释 --> <property name="use_sql_commments">false</property> <!-- 添入映射文件 --> <mapping resource="hibernate/Students.hbm.xml"/> </session-factory> </hibernate-configuration>
hibernate映射文件
<span style="font-size:18px;"><?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2016-3-10 20:53:38 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="hibernate.Students" table="STUDENTS"> <id name="sid" type="int"> <column name="SID" /> <generator class="assigned" /> </id> <property name="sname" type="java.lang.String"> <column name="SNAME" /> </property> <property name="gender" type="java.lang.String"> <column name="GENDER" /> </property> <property name="birthday" type="java.util.Date"> <column name="BIRTHDAY" /> </property> <property name="address" type="java.lang.String"> <column name="ADDRESS" /> </property> </class> </hibernate-mapping></span><strong style="font-size:24px;"> </strong>
Mapping下面可以有很多的<class..../>元素。其中 name表示了实体类。table代表了数据库中的表。
映射主键
通常情况下,hibernate建议为持久hibernate类定义一个标志属性,用于唯一的标志某个持久化实例,而标志属性需要映射到底层数据库表的主键。
标志属性通过<id……>来指定,其中的name属性值就是持久化类标志属性名。现在的数据库建模理论都不推荐使用具有实际意义的物理主键,而是使用没有实际意义的逻辑主键。
Hibernate为逻辑主键提供了主键生成器,用来负责生成数据库记录的主键,下面简单介绍几种主键生成器:
Incerment:为long、short或者int类型主键生成唯一标识。
Indentity:设置为自增长类型。返回值的标识属性是long、short、int类型。
Native:根据底层的数据库的能力选择Identity、sequence或hilo中的一个。
fetch_size 和batch_size
Fetch_Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数。
Batch_Size是设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小。
比如我们将fetch_size设置为10,那么当我们查询到五千条数据时,数据库只会返回10条数据,当这十条数据遍历完之后,继续取十条数据。同样batch_Size也是这样。当我们设置的值过大时会很消耗内存,但是操作次数会减少,当我们设置的值过小时内存占用小,但是操作次数会增加。所以这个值到底取多少也是因环境而异了。
映射普通文件
Hibernate使用<property…./>元素来映射普通睡醒,配置该元素是只需要指定一个name属性。也可以使用column属性来强制指定列名。列名默认与属性名相同。
两个配置文件的设置还有很多这里面没有提及,但是这些属性已经足够我们来建立我们的hibernate文件。知识就是不断的重复,在学习的一开始我们就是要能够化繁为简。这样才能让我们每次学习都有新的收获,也不至于在学习的一开始就是去学习的兴趣