Hibernate知识总结(一)
一、orm
orm的全称是object/relation mapping,即对象/关系映射,可以将其理解成一种规范,它概述了这类框架的基本特征:完成面向对象的编程语言到关系数据库的映射。可以把orm看作应用程序和数据库的桥梁。
orm基本映射方式
1、数据表映射实体类(持久化类);
2、数据表中的行映射对象;
3、数据表中的字段映射对象的属性。
基本上所有的orm工具大致都遵循相同的映射思路。
二、hibernate
hibernate是一款轻量级的持久层框架,它完成了对象模型和基于sql的关系模型的映射关系,使得开发者能够以面向对象的方式开发应用程序,它还提供数据处理的方法,可以大幅度减少开发人员使用sql和jdbc处理数据的时间。
hibernate初步使用
下载hibernate(此步骤略过),解压该文件;
使用ide新建普通java项目(本人使用idea),在项目中引入使用hibernate所必须的jar包,即引入required文件夹中的jar包;另外此处使用jdbc连接,需要额外引入mysql-connector的jar包
现在使用一个简单的小例子,实现hibernate的初步使用。
注:此处使用的是hibernate的注解来创建数据表,不提及xml配置文件建表方式。
创建持久化类user,该类和一般的javabean并没有什么区别;
user类包含id、username、age属性,user类的代码如下:
1 package com.yjry.note; 2 3 public class user { 4 private integer id; 5 private string username; 6 private integer age; 7 //重写tostring方法,便于显示数据 8 @override 9 public string tostring() { 10 return "user{" + 11 "id=" + id + 12 ", username='" + username + '\'' + 13 ", age=" + age + 14 '}'; 15 } 16 17 public integer getid() { 18 return id; 19 } 20 21 public void setid(integer id) { 22 this.id = id; 23 } 24 25 public string getusername() { 26 return username; 27 } 28 29 public void setusername(string username) { 30 this.username = username; 31 } 32 33 public integer getage() { 34 return age; 35 } 36 37 public void setage(integer age) { 38 this.age = age; 39 } 40 }
为该类添加hibernate注解,添加注解后代码如下:
package com.yjry.note; import javax.persistence.*; @entity @table(name = "t_user") public class user { @id @column(nullable = false) @generatedvalue(strategy = generationtype.identity) private integer id; @column(name = "user_name", length = 30) private string username; private integer age; //重写tostring方法,便于显示数据 @override public string tostring() { return "user{" + "id=" + id + ", username='" + username + '\'' + ", age=" + age + '}'; } public integer getid() { return id; } public void setid(integer id) { this.id = id; } public string getusername() { return username; } public void setusername(string username) { this.username = username; } public integer getage() { return age; } public void setage(integer age) { this.age = age; } }
下面解释下各个注解的意义:
@entity注解声明该类是一个hibernate的持久化类;
@table注解指定该类映射的数据表,此处指定该类映射的数据表为t_user表;
@id用于指定该类的标识属性(可以唯一表示该对象的属性),标识属性通常映射到数据表的主键列;
@generatedvalue用于指定主键生成策略,其中strategy属性指定了主键生成策略为identity,对于mysql数据库来说,主键自增长。
接下来编写hibernate的核心配置文件hibernate.cfg.xml(该文件名为hibernate加载的默认文件名),配置文件代码如下:
<!doctype hibernate-configuration public "-//hibernate/hibernate configuration dtd 3.0//en" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!--配置数据库的连接四要素--> <property name="hibernate.connection.driver_class">com.mysql.jdbc.driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123456</property> <!--是否打印sql语句--> <property name="hibernate.show_sql">true</property> <!--打印出来的sql语句是否格式化--> <property name="hibernate.format_sql">true</property> <!--建表策略,建议使用update--> <property name="hibernate.hbm2ddl.auto">update</property> <!--指定数据库方言--> <property name="hibernate.dialect">org.hibernate.dialect.mysql5dialect</property> <!--告诉hibernate映射文件所在位置--> <mapping class="com.yjry.note.user"/> </session-factory> </hibernate-configuration>
建表策略
hibernate.hbm2ddl.auto属性可以为validate、update、create、create-drop。
validate:每次创建sessionfactory时,若数据库中没有与持久化类对应的数据表,或者数据表与持久化类不一致,则抛出异常;
注:判断不一致的条件为:数据表中缺少持久化类的属性对应的字段,也就是说,若持久化类对应的数据表含有多余的字段,不会影响validate检查,即程序不会抛出异常。
update:每次创建sessionfactory时,若数据库中没有与持久化类对应的数据表,则自动建表;若数据库中存在对应的表,则保留已有的数据表和数据,仅更新或插入数据;
create:每次创建sessionfactory时,都会自动建表,若之前存在数据表,则原表保留的数据会全部丢失;
create-drop:每次创建sessionfactory时,自动建表,sessionfactory关闭时,自动删表。
数据库方言
hibernate底层依然使用sql语句来执行数据库操作,然而各个数据库在sql语法上存在一些差异,因此hibernate需要根据数据库来识别这些差异,此时就要指定hibernate.dialect,这里使用mysql数据库方言,告诉hibernate使用mysql的方式执行sql语句。
创建测试类,完成数据表的创建以及数据的插入操作。代码如下:
package com.yjry.test; import com.yjry.note.user; import org.hibernate.session; import org.hibernate.sessionfactory; import org.hibernate.transaction; import org.hibernate.cfg.configuration; public class usertest { public static void main(string[] args) { /** * 加载hibernate配置文件 * 不带参数的configuration方法,默认加载hibernate.cfg.xml文件 * 若传入test.xml作为参数,则加载test.xml文件 */ configuration configuration = new configuration().configure(); //创建sessionfactory实例,创建该实例后,数据表已经创建完毕 sessionfactory sessionfactory = configuration.buildsessionfactory(); //创建session实例 session session = sessionfactory.opensession(); //开启事务 transaction transaction = session.begintransaction(); //创建user对象,并设置属性 user user = new user(); user.setusername("张三"); user.setage(20); //执行session的save方法,保存数据,数据表待插入该数据 session.save(user); //提交事务,数据插入到数据表 transaction.commit(); //关闭资源 session.close(); sessionfactory.close(); } }
执行该代码,会发现mysql数据库中多了一张t_user表,该表包含id、age、user_name三个字段,并且刚才创建的user对象数据已经插入到数据表中。