转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6760773.html
一:ORM
ORM:对象-关系 映射。
即:把Java中有关联关系的对象,转换成关系型数据库里有主、外键关系的表中的记录,其转换的过程叫做映射,是通过配置文件实现的。
基于ORM的框架,就是实现了在编程时,脱离开繁杂的SQL语句,用面向对象的方式来操作数据,而框架则负责根据配置文件的配置而转换成具体的数据库语句并执行。
二:创建Hibernate项目
1:在Myeclipse中配置DataBase
2:创建一个项目
3:右键项目,添加Hibernate支持,选择刚才配置的DataBase连接
4:创建Java实体类,实体类至少包含构造函数、getter、setter
5:为实体类配置映射文件,一个类一个 classname.hbm.xml 文件,其中配置该对象的id属性以及其他字段属性
6:配置hibernate.cfg.xml文件,配置数据库连接的驱动、数据库路径、账户、密码等,引入每个实体类的hbm.xml 文件。
三:使用Hibernate
一般步骤为:
Session session=HibernateSessionFactory.getSession();//单例模式获得session Transaction transaction=(Transaction) session.beginTransaction();//开启事务 session.save(article);//执行session操作,保存、更改、删除某对象 transaction.commit();//提交事务 session.close();//关闭session
四:Session
Myeclipse中创建Hibernate工程时,会自动生成一个HibernateSeesionFactory类,里面定义了Session字段以及getSession的静态方法。
其中,session被定义为ThreadLocal类型变量,也就是说,这个session是与线程绑定的。当一个请求发送到服务器,服务器启动一条线程来处理这个请求,在处理过程中,会经历filter、servlet、service、dao等各层方法的执行,而session对象则贯穿整个过程,直到线程关闭。并且,getSession方法是静态的单例模式的方法。因此,整个线程执行期间获取的是同一个session对象。这样做的意义在于:可以在非DAO层进行事务管理,可以在DAO层用session进行了save、update等操作后,在service或filter层进行事务的提交。
Session的非查询类操作,如:save、update、delete等都需要事务提交才能生效,持久化到数据库,get则不需。
五:hbm.xml映射文件
<?xmlversion="1.0"encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> //1:头不能错 <hibernate-mapping package="包名"> //2:根标签为 hibernate-mapping,package属性指明包名 <class name="类名"table="表名"> //3:class标签配置实体类,包括类名、表名 <id name="主键在java类中的字段名" column="对应表中属性列名" type="数据类型 "> //4:id 标签配置实体类的主键属性,包含类中字段名、表中列名、数据类型、主键生成策略 <generator class="主键生成策略"/> </id>
<property name="属性名" type="数据类型"> //5:property标签配置实体类其他属性,包括属性名、数据类型、表中对应列
<column name="数据库表中属性列名" length="长度" not-null="是否非空"/>
</property>
<component name="实体类中字段名" class="哪个属性实体类"> //6:组件属性:组件属性对应一个自定义属性类的对象,但是这个属性类没有映射表,而是把属性值作为当前class的表中的某几个属性列
<property name="属性实体类中字段名" column="表中哪列">
</component>
...... //7:关系映射标签:配置那个字段与哪个实体类具有什么类型的关系,如one-to-many
</class> </hibernate-mapping>
主键生成策略有:
1) assigned
主键由程序负责生成,编码时在 save() 之前指定。
2) hilo
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。
3) seqhilo
与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle。
4) increment
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。由数据库自增。
5) identity
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。
6) sequence
采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。
7) native
由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。
8) uuid.hex
由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
9) uuid.string
与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在 PostgreSQL 数据中。
10) foreign
使用另外一个相关联的对象的标识符作为主键。
(使用最多的是:assigned、increment、native)
六:hibernate.cfg.xml文件
<?xml version='1.0' encoding='gb2312'?> <!--表明解析本XML文件的DTD文档位置--> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <!--Hibernate配置文件的开始--> <hibernate-configuration> <!--session-factory配置--> <session-factory> <!--配置数据库驱动--> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver </property> <!--设置数据库连接--> <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate </hibernate> <!--连接数据库用户名--> <property name="hibernate.connection.username">root </property> <!--连接数据库密码--> <property name="hibernate.connection.password">123456 </property> <!--数据库连接池大小--> <property name="hibernate.connection.pool.size">20 </property> <!--是否在后台显示Hibernate用到的SQL语句,开发时设置为true,便于差错,程序运行时可以在Eclipse的控制台显示Hibernate的执行Sql语句。项目部署后可以设置为false,提高运行效率--> <property name="hibernate.show_sql">true </property> <!--jdbc.fetch_size是指Hibernate每次从数据库中取出并放到JDBC的Statement中的记录条数。Fetch Size设的越大,读数据库的次数越少,速度越快,Fetch Size越小,读数据库的次数越多,速度越慢--> <property name="jdbc.fetch_size">50 </property> <!--jdbc.batch_size是指Hibernate批量插入,删除和更新时每次操作的记录数。Batch Size越大,批量操作的向数据库发送Sql的次数越少,速度就越快,同样耗用内存就越大--> <property name="jdbc.batch_size">23 </property> <!--jdbc.use_scrollable_resultset是否允许Hibernate用JDBC的可滚动的结果集。对分页的结果集。对分页时的设置非常有帮助--> <property name="jdbc.use_scrollable_resultset">false </property> <!--connection.characterEncoding连接数据库时数据的传输字符集编码方式--> <property name="connection.characterEncoding">UTF-8</property> <!--hibernate.dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。--> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect </property>
<!--配置实体类的映射文件--> <mapping resource="org/mxg/XX.hbm.xml">
</session-factory> </hibernate-configuration>