做为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是咱们对数据库的操做更加简单,更加快捷。利用Hibernate框架咱们就能够再也不编写重复的JDBC代码,再也不反复的测试咱们的SQL语句写的如何。这里这须要咱们简单配置,调用框架给咱们提供的方法,就能够完成对数据增删改查的,那么Hibernate究竟是个什么样的框架呢?如何使用呢?先看一个关于Hibernate框架的知识体系图:html
这篇博客,咱们来总结一下,Hibernate宏观的认识和,环境搭建。java
一,Hibernate究竟是什么?mysql
Hibernate是一个基于元数据的轻量级的ORM框架:sql
1,元数据(Meta Data):data about data(数据的数据),也就是说描述一个对象数据,至关于这个对象的上下文环境。数据库
2,轻量级:占用资源少,没有侵入性。(其实我认为这只是相对而言,若是和Ibatis相比,它到成重量级的了)。编程
3,ORM:(Object Relation Mapping)对象关系数据库的映射缓存
这是Hibernate框架的重点,也就是说将咱们程序中的实体(bean,这里也叫POJO)和数据库中的表进行映射。java类型和sql类型映射,面向对象设计和关系型数据库设计的映射,从而咱们只须要将更多的精力放到业务中,而不是sql数据库方面。session
4,POJO:(Plain Ordinary Java Object),无格式的普通java对象,也就是上边说的实体,和数据库作映射的简单类。只是在这里提出了一个新的名词而已。app
总而言之,Hibernate就是将咱们的数据库表和程序的POJO类进行映射,数据的操做进行了封装,使咱们不用把数据库弄得很是精通,咱们会面向对象编程就能够了,这样大大提升了咱们的编程效率,并且对我的的知识要求也下降了。(Hibernate的设计目的是这样的,但是我觉的要想更好的应用Hibernate,更好的掌握开发的前因后果,这是要求咱们要有更高的能力了,知其然知其因此然了)框架
二,环境搭建:
1,和前边几个框架的大概流程同样,首先须要咱们拷入必备的jar包。jar包的拷入奔着一个够用便可的原则,用什么拷贝什么,固然有些日志输出,单元测试是为了更好的观察框架而拷入的不是必备的。这里讲到是用MySql来进行演示,因此使用了mysql的驱动jar包:
antlr-2.7.6.jar (生成SQL语句)
asm.jar(字节码加强工具类)
c3p0-0.9.1.jar(数据源链接池组件)
cglib-2.1.3.jar(代理组件,基于继承的)
commons-collections-2.1.1.jar(集合工具类组件,会进行高效的操做)
commons-logging-1.0.4.jar(日志输出的转换组件)
log4j-1.2.11.jar(日志输出组件,更加详细和能够控制输出格式,及目的地)
dom4j-1.6.1.jar(XML解析)
ehcache-1.2.3.jar(缓存组件)
ejb3-persistence.jar(持久化操做的规范jar包)
hibernate3.jar(框架的核心jar包)
jta.jar(全局的事务管理)
junit-3.8.1.jar (单元测试)
mysql-connector-java-3.1.13-bin.jar (MySQL数据库驱动jar包)
2,引入配置文件:
hibernate.cfg.xml Hibernate核心配置文件(包括数据库的链接配置,映射文件的读取等)
log4j.properties Log4j的日志输出控制文件
User.hbm.xml 映射文件(这里的User只是匹配User实体的,一个实体类对应一个此类的映射文件。)
3,核心配置文件hibernate.cfg.xml的编写:
<hibernate-configuration> <!-- 构造数据库的链接工厂,这是Hibernate的核心类 --> <session-factory> <!-- 这里是简单的数据库链接的基本信息,也能够写在配置文件中,或者利用JNDI来调用数据源 --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/example?useUnicode=true&characterEncoding=utf8</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.username">ljh</property> <property name="hibernate.connection.password">ljh</property> <!-- 在控制台里打印生成的SQL语句 --> <property name="hibernate.show_sql">true</property> <!-- 格式化控制台输出的SQL语句,这两条都是方便咱们来学习Hibernate框架 --> <property name="hibernate.format_sql">true</property> <!-- 方言:根据指定的方言与数据库打交道,完成SQL的具备语句生成,由于不一样的数据库sql语法仍是有区别的, 这里至关于告诉Hibernate框架,咱们使用的是什么数据库。 MySQL : org.hibernate.dialect.MySQLDialect Oracle : org.hibernate.dialect.OracleDialect --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 管理全部的映射资源文件,这里仅仅配置了User类的配置映射文件,应该将咱们的全部的映射配置文件设置到这里,这样咱们框架才能找到 --> <mapping resource="com/ljh/hibernate/pojo/User.hbm.xml"/> </session-factory> </hibernate-configuration>
<hibernate-mapping> <!-- 实体类class和数据库表table的映射 --> <class name="com.ljh.hibernate.pojo.User" table="t_user"> <!-- id标签用来映射主键字段 name属性表示类的属性 column属性表示表的字段 --> <id name="usercode" column="usercode" length="20"> <!-- 主键生成策略 native 表示根据链接数据库的表的主键生成方式来生成主键值 mysql数据采用的auto_increment属性来生成主键值,通常主键字段须要设置的类型为int assigned 表示主键由用户本身维护。 --> <generator class="assigned"/> </id> <!-- 普通属性的映射 name 表示类中的属性名称 column 表示表中的列名称 column属性不指定会采用默认的值,默认名称与属性名称一致 length 表示属性的字符长度 not-null 表示属性值不能为null --> <property name="userpswd" column="userpswd" type="java.lang.String" length="20" not-null="true"/> <property name="username" /> <property name="regdate" length="19"/> <property name="orgtype" length="1"/> </class> </hibernate-mapping>
public void insert(User user) { //加载配置文件:classpath:hibernate.cfg.xml Configuration config = new Configuration().configure(); //建立链接工厂 SessionFactory sf = config.buildSessionFactory(); //会话对象,表示与数据库的链接会话过程,至关于jdbc的connection链接对象 Session session = null; Transaction tx = null ; try { //获取会话对象 session = sf.openSession(); //打开事务:Hibernate默认数据操做是不提交事务的,因此咱们要手动提交事务。 tx = session.beginTransaction(); //保存对象,持久化操做 session.save(user); //提交事务 tx.commit(); } catch (Exception e) { e.printStackTrace(); //事务回滚 tx.rollback(); } finally{ //链接会话关闭 if(session!=null){ session.close(); } } }
这样一看咱们的方法写的代码也是挺多了,想说的是这里只是写出了Hibernate框架是从建立sessionFactory对象,而后建立session对象,经过session对象进行对数据库的操做。其实真正的开发中,咱们会把这些对象,事务的操做交给框架来管理,咱们须要作的就是持久化操做的那些代码,是很是少的。
综上为Hibernate实现一个简单插入user数据的例子,固然若是数据库关系复杂了,或者更多的设置,后边会进行相关总结。最后来看看Hibernate框架的优缺点吧,固然这些优缺点都是相对而言呢,看用在什么环境下了!
优势:1,轻量级的ORM框架
2,对JDBC进行了很好的封装,使用了ORM作了映射,那么就能够经过面向对象的方式很容易的操做数据库了。
3,它还提供了缓存机制,能够提升效率。等
缺点:1,若是对大量的数据进行频繁的操做,性能效率比较低,不如直接使用JDBC。
总而言之对于框架,咱们利用其优秀的一面,避开其很差的一面,使其对咱们开发发挥最大的做用便可!!!