具体说hibernate框架的项目搭建之前,首先说一下什么是框架。。。
框架可以理解成一个半成品的项目,它封装了一些功能,我么需要掌握的是如何驾驭这些功能,不需要操心它是怎么实现的。其实他就是按照我们之前所学的内容实现的。框架可以提高我们开发的效率。
那么,简单介绍一下,什么是hibernate框架?
hibernate是dao层的框架,完成的功能是插入crud(增(create)、查(retrieve)、改(update)、删(delete)).
hibernate是一个ORM框架(对象关系映射)。(Object Relational Mapping)
hibernate是以面向对象的方式进行数据库的增删改查,甚至不用写sql语句。
ORM:
是随着面向对象的软件开发方法发展而产生的。用来把对象模型表示的对象映射到基于S Q L 的关系模型数据库结构中去。这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQ L 语句打交道,只需简单的操作实体对象的属性和方法。O R M 技术是在对象和关系之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化。
项目搭建过程:
1、导包 (hibernate-release-5.2.12.Final.rar)
除此之外,还需要一个数据库驱动包。mysql驱动包
2、建立实体bean类
①.所有的属性应该设置为private,并附加get和set方法
②.构造函数,如果不写的话是可以的;但是如果写的话,至少要写两个(必须要包含一个空的构造函数)
③.字段名要设置为包装类。(为什么使用包装类?)
eg:小明考试考了零分和没有参加考试是有区别的。如果使用基本类型则无法表示,但是使用包装类,则可以设置为null
④.实体类中必须有一个id(主键)
具体代码示例奉上:(以学生类为例,未写构造方法)
package cn.hd.bean; public class Student { private Integer sid; private String name; private String denger; public Integer getSid() { return sid; } public void setSid(Integer sid) { this.sid = sid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDenger() { return denger; } public void setDenger(String denger) { this.denger = denger; } @Override public String toString() { return "Student{" + "sid=" + sid + ", name='" + name + '\'' + ", denger='" + denger + '\'' + '}'; } }
3、建立数据库对应的表
可以省略,hibernate可以帮助我们自动根据实体类生成数据表。(具体代码后面会奉上)
4、 建立映射关系
第一步:建立一个配置文件,命名和位置都没有强硬的规范,一般情况下规定,把这个文件放到对应的bean目录下,命名规范为 实体类名 + .hbm +.xml
第二步:导入约束文件,声明这个文件是hibernate配置文件,导入之后书写配置的时候会有提示信息。
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
第三步:配置信息。
<hibernate-mapping> <!--name:Javabean类的相对路径,table:数据库表名--> <class name="cn.hd.bean.User" table="User"> <!-- id:数据库中的主键,对应的是Javabean类中id(主键),和数据表中的主键, name:代表的是实体类中的名字 column:代表的是字段名(可以省略不写) --> <id name="uid" column="uid"> <!-- generator:主键生成策略 代理主键 identity 是由数据库自己维护,id自动加一 increment 数据库自己维护,自动查询表中数据,然后进行id加1 hilo 高低位生成主键,需要用到一个额外的表,所有的数据库都可以使用这种类型 native 我们用的(代表的上面三个) uuid (Java api 的生成策略,要自己去设置主键,) 自然主键 assigned 手工指定,比如指定UUID --> <generator class="native"></generator> </id> <!-- 其他的属性 这里也可以设置数据库中字段的属性 type 生成表中的类型 legth not-null --> <property name="name" column="name"/> <property name="psd" column="psd"></property> </class>
补充:关于代理主键和自然主键 我的理解是,当将id也就是主键设置为int类型将它自动递增时,用代理主键中的可以有数据库自己维护,id自动增加的代理主键;而自然主键就是当id为其他类型的时候,需要手动添加主键的时候,去用自然主键。
5、配置hibernate核心配置文件
第一步:创建核心配置文件,文件的命名和位置都必须按照指定来,文件放在src目录下,文件名为hibernate.cfg.xml。
第二步:导入约束文件。
<!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/hibrnate?useUnicode=true&characterEncoding=utf-8</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">123</property> <!-- 配置方言,指定用的什么数据库 sql语句方言,我们在上面设置了数据库的信息是mysql mysql 中的sql语句limit在Oracle中没有 所以要设置方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <!--设置hibernate执行SQL语句的时候,自动显示在控制台上--> <property name="hibernate.show_sql">true</property> <!--设置显示的格式--> <property name="hibernate.format_sql">true</property> <!-- 设置数据库表的生成策略,自动建表 测试时: create 每次执行hibernate 就会创建新的表,原来的数据就会丢失 create-drop 每次执行完hibernate之后就会将表给删除掉 原来的数据就会丢失 开发时: update 每次启动检查数据表是否有有更新,如果有则自动更新,如果没有,则不变 validate 校验 对数据表不进行任何操作 --> <property name="hibernate.hbm2ddl.auto">update</property> <!--加载映射文件,将hbm配置文件配置到核心文件中,使其自动读取--> <mapping resource="cn/hd/bean/User.hbm.xml"></mapping> <mapping resource="cn/hd/bean/Student.hbm.xml"></mapping> </session-factory> </hibernate-configuration>
6、书写dao层测试代码
其中的student对象,就是未建立数据表之前运行;运行后数据表自动创建。
package cn.hd.test; import cn.hd.MyUtils.HibernateUtils; import cn.hd.bean.Student; import cn.hd.bean.User; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; public class Demo { public static void main(String[] args) { /*读取配置文件 .configure()自动读取cfg.xml文件*/ Configuration configuration = new Configuration().configure(); /*获得sessionFactory对象,自动生成表,读取数据库信息,检查数据表是否更新 * 这个对象我们用它只用来获取session * 实际上这行代码 它检查了数据库和实体类 * 如果有变化它会更新 * 非常耗费资源 解决方案:(封装工具类) * */ SessionFactory sessionFactory = configuration.buildSessionFactory(); /*使用sessionFactory获得session对象*/ Session session = sessionFactory.openSession(); /*开启事务 * hibernate 必须开启事务 * 不开启事务不会将数据保存到数据库 * */ Transaction transaction = session.beginTransaction(); /*向数据表中插入一条数据*/ /*User user = new User(); user.setName("张三"); user.setPsd("38383838");*/ Student student = new Student(); student.setName("张三"); student.setDenger("男"); /*添加、保存方法*/ session.save(student); /*提交事务*/ transaction.commit(); /*关闭资源*/ session.close(); sessionFactory.close(); } }如果能够往数据表中添加数据的话,就说明你的hibernate框架项目搭建成功!!!