1.什么是Hibernate?
Hibernate框架是当今主流的java持久层框架,也是一个开放源码的orm框架,由于对jdbc进行了轻量的对象封装,使其更具有简单易学,灵活性强,扩展性强等等特点
2.为什么学习Hibernate?
提高编程效率,也就是说少写代码多喝茶,快快乐乐过人生啊!
以下开始正式介绍Hibernate5,本着详尽的原则我会尽量写清每一步,也是复习一下,如有错误,欢迎指出.
- 下载Hibernate5传送门
- 解压Hibernate5
- documentation:存放Hibernate文档和API文档
- lib:存放Hibernate编译和运行所依赖的jar包,注意request子目录下的所有jar是Hibernate项目必须的jar包
- project:存放Hibernate各种相关的源代码
大功告成,现在我们已经完成了一大半了,累了就休息会,不累就继续看吧.
3.环境构建
- 新建javaweb项目,注意把版本更换成2.5
-
- 复制required中的所有jar包到工程中lib文件夹中,等等别急还有几个包要复制,连接数据库的jar包,和日志输出的jar包,全部jar包如下:
注意:junit,hamcrest只是用来单元测试的,不必担心包没错.
啦啦啦,愉快的cv结束了,接下来我们就要深入一点点认识Hibernate了.
- 我们在web阶段就已经知道了用javeBean进行数据的封装,我们Hibernate是和数据库打交道的当然也要有属于自己的实体类
- 创建实体类----Customer(客户)
- eclipse安Alt+Shift+S可以生成set和get方法.对了对了要注意包名和类名的大小写规范(也是告诉自己的),还有一点,可以将toSring也生成,方便用print大法排错哈哈哈.
- 到此实体类完成
- 感觉是不是成就感满满?但是下面才是重点
4.创建映射文件
什么是映射文件?呀!通俗来说吧映射文件就是将刚才建立的实体类同数据库相关联让Hibernate知道哪个实体要映射到哪个表,哪个属性对应哪个字段,毕竟人家是面向对象的.
- 映射文件名称和位置没有固定要求,心随你动,想写哪就写哪(但是通常写在实体类所在的包中,名字为XXX.hbm.xml)
- 好了xml文件建立完毕,接下来就要引入约束了
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- 约束添加完成;接着我们要认识几个标签,是他们来建立实体与数据库中的联系
-
<hibernate-mapping>根标签,每个xxx.hbmxml有且只有一个,可选属性默认即
<hibernate-mapping></hibernate-mapping>
<class>标签:
<class name="com.cn.entity.Customer" table="t_customer"> </class>
name属性值:刚才实体类的全路径,用来表示是哪个类要生成表
table属性值:数据库中表的名字叫什么
总结:一个填实体类名,一个填生成的表名
<id>标签:定义主键
<id name="cust_id" column="cust_id"> <generator class="native"></generator> </id>
- name属性:定义主键,你想让哪个是主键哪个就是主键,你做主(用cust_id吧)
- column属性:生成表字段的名称,默认可以不写
- generator class="native" 设置主键自增长
配置其他属性<property>标签:
<property name="cust_name" column="cust_name"></property> <property name="cust_soucre" column="cust_soucre"></property>
name属性:实体类的属性名称
column属性:生成表字段名称(当然也可以不写)
好了Hibernate的映射文件完成了,可以休息下了,但是你会觉得怎么没有配置数据库的信息?你不配置它怎么会知道哪个数据库?况且代码还没写那,一直在写配置文件,而且那个mysql是驱动还没有用那.
5.Hibernate核心配置文件:
注意:若不是ssh整合协同开发核心配置文件名称和位置是固定的:src下面;名称: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>属性值默认
<hibernate-configuration> <session-factory> </session-factory> </hibernate-configuration>
第一部分:配置数据库连接,必须要有的!
注意:
- 加载jdbc驱动
- 指定要连接的数据库
- 用户名
- 密码
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property> <property name="hibernate.connection.username">你的用户名</property> <property name="hibernate.connection.password">你的密码</property>
第二部分:可选的(更加清楚的观测Hibernate对数据库的操作)
- 输出底层sql语句:<property name="hibernate.show_sql">true</property>
- 看见format是不是很亲切,对!就是格式化输出sql语句:<property name="hibernate.format_sql">true</property>
- 自动建表(有的话会更新表)<property name="hibernate.hbm2ddl.auto">update</property>
- 配置mysql特有的语句(如:limit)<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
- 绑定session:<property name="hibernate.current_session_context_class">thread</property>
- 绑定session的原因:将 Session 与本地线程绑定,保证 Session 对象绝对是一个单线程对象
第三部分:最最最重要!要把映射文件放到核心配置文件中
- <mapping resource="com/cn/entity/customer.hbm.xml"/>
第二三部分代码:
<property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.current_session_context_class">thread</property> <mapping resource="com/cn/entity/customer.hbm.xml"/>
好啦好啦!!终于完成了,接下来就剩检验配置是否正确了.
来 让我们写个测试类!
- 第一步:加载hibernate核心配置文件---在hibernate里面封装对象就是到src下面找到hibernate.cfg.xml文件
- 第二步:创建SessionFactory对象
- 第三步:使用SessionFactory创建session对象
- 第四步:开启事务
- 第五步:添加一个客户
- 第六步:提交事务
- 注意!注意!关闭资源
以下是测试代码:
@Test
public void testAdd() {
Configuration cfg = new Configuration();
cfg.configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_name("Sweet_ywq");
session.save(customer);
tx.commit();
session.close();
sessionFactory.close();
}
运行结果:
//不积跬步,无以至千里;不积小流,无以成江海。与君共勉 ! 加油 !