Hibernate是一个开放源代码的对象关系映射框架,

它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,

最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

Hibernate是轻量级JavaEE应用的持久层解决方案,是一个关系数据库ORM框架(Object Relational Mapping)

传统方式开发的时候,我们直接编写SQL语句来执行,

而Hibernate将Java中的实体类与数据库的关系表建立一个映射,这样就可以操作Java中对象,从而操作数据库。

为什么要使用Hibernate?

Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
  Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作
  Hibernate使用java的反射机制,而不是字节码增强程序类实现透明性
  Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系.

搭建Hibernate环境

1,首先下包导包,以下采用Hibernate 3最终版本,包下载地址:http://sourceforge.net/projects/hibernate/files/hibernate3

   对应的jar包:

* hibernate3.jar
  * HIBERNATE_HOME/lib/required/*.jar
  * HIBERNATE_HOME/lib/jpa/hibernate-jpa-2.0-api-1.0.1.Final.jar
  * 导入日志记录的包:
    * log4j-1.2.16.jar
    * slf4j-log4j12-1.7.2.jar
  * 导入mysql数据库驱动

2,创建表:(关系型数据库)

 create database hibernate3_day01;
use hibernate3_day01;
create table customer(
id int primary key auto_increment,
name varchar(20),
age int
);

3,创建一个实体类:(面向对象)

 public class Customer {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

这边int类型建议使用包装类型Integer,因为int默认值为0,而Integer默认值为null,方便确认数据情况

接下就是把数据库表和实体类建立映射关系

4,创建ORM的映射:

映射文件一般来说只要是个xml格式文件就可以,但为了观看清晰,建议命名:实体类名称.hbm.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!-- 引入约束 -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<!-- 建立类与表的映射 -->
<!-- class标签:用于映射类与表的关系 name :类的全路径 table:表名称 -->
<class name="com.emuii.bean.Customer" table="customer">
<!-- 建立类中属性与表中的字段映射 -->
<!-- 唯一标识 -->
<!-- 使用id的标签 配置唯一属性 -->
<!-- 在<id>标签中配置一个主键的生成策略. -->
<id name="id" column="id">
<generator class="native"/>
</id> <!-- 普通属性 -->
<!-- property标签:映射类中的普通属性 name:类中的属性名称, column:表中字段名称 -->
<!--
type:三种写法
* Java类型 :java.lang.String
* Hibernate类型 :string
* SQL类型 :不能直接使用type属性,需要子标签<column>
* <column name="name" sql-type="varchar(20)"/>
-->
<!--<property name="id">
<column name="id" sql-type="int" />
</property>-->
<property name="name" column="name" type="string" length="20"/>
<property name="age" column="age"/>
</class> </hibernate-mapping>

主键有自然主键和代理主键。

自然主键:创建一个人员表,人员表中某条记录唯一确定,人都有身份证号,我们可以使用身份证号作为主键(身份证号本身就是人员的一个属性.作为主键)

代理主键:创建一个人员表,人员表中某条记录唯一确定,但是没有使用身份证号作为主键,新建字段(用新建的字段作为主键,只是一个标识作用)

在hibernate中我们尽量让hibernate自己去维护主键

其中hibernate主键的生成策略展示以下几种:

increment    :自动增长.适合 short int long...不是使用数据库的自动增长机制.使用Hibernate框架提供的自动增长方式。在集群下不要使用,因为有线程安全问题,其插入是先select max(id) from 表; 在最大值的基础上+1.(多线程的问题.)
  identity     :自动增长.适合 short int long...采用数据库的自动增长机制.不适合于Oracle数据库.
  sequence :序列.适用于 short int long ... 应用在Oracle上 .
  uuid          :适用于字符串类型的主键.采用随机的字符串作为主键.
  native       :本地策略.底层数据库不同.自动选择适用identity 还是 sequence.
  assigned  :Hibernate框架不维护主键,主键由程序自动生成.
  foreign      :主键的外来的.(应用在多表一对一的关系.)

上表采用的是    navite

<!-- 在<id>标签中配置一个主键的生成策略. -->
15 <id name="id" column="id">
16 <generator class="native"/>
17 </id>

5,创建Hibernate的核心配置文件在src下,命名 hibernate.cfg.xml

核心配置有两种常用方式:属性文件和XML格式文件。

属性文件:hibernate.properties 其内格式是  key =  value

eg: hibernate.connection.driver_class=com.mysql.jdbc.Driver

另外属性配置文件只能手动加载,

生成Configuration对象,configuration.addResource("属性配置文件");

下面展示xml格式的

 <?xml version="1.0" encoding="UTF-8" ?>

 <!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:///hibernate3
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property> <!--生成hibernate的方言-->
<!--生成底层SQL不同的-->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property> <!-- C3P0连接池设定-->
<!-- 使用c3po连接池 配置连接池提供的供应商-->
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider </property>
<!--在连接池中可用的数据库连接的最少数目 -->
<property name="c3p0.min_size">5</property>
<!--在连接池中所有数据库连接的最大数目 -->
<property name="c3p0.max_size">20</property>
<!--设定数据库连接的过期时间,以秒为单位,
如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
<property name="c3p0.idle_test_period">3000</property> <!-- 可选的属性 -->
<!-- 显示SQL一条到底,不美观 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL让语句看起来更美观 -->
<property name="hibernate.format_sql">true</property>
<!--自动提交,一般为false-->
<property name="hibernate.connection.autocommit">false</property>
<!-- hbm:映射 to DDL: create drop alter -->
<!--create: 每次执行创建一个新表(如果以前有该表,删除重建)-->
<!--create-drop: 每次执行的时候,创建一个新的表,程序执行结束后将这个表,删除掉了-->
<!--update: 如果数据库中没有表,创建一个新的表,如果有了,直接使用这个表.可以更新表的结构-->
<!--validate: 会使用原有的表.完成校验.校验映射文件与表中配置的字段是否一致.不一致报错-->
<property name="hibernate.hbm2ddl.auto">update</property> <!-- 通知Hibernate加载那些映射文件 -->
<mapping resource="com/emuii/bean/Customer.hbm.xml" />
</session-factory>
</hibernate-configuration>

其中可选属性一条是52 <property name="hibernate.hbm2ddl.auto">update</property>参数详情xml已经注释。

如果没在xml中加载映射文件,同样地和加载属性配置文件一样,需要手动加载configuration.addResource("com/emuii/bean/Customer.hbm.xml");

另外hibernate默认连接方式不是c3p0,这边要自己配置,如上。

6,接下来就是测试,向数据库中插入一条记录

 @Test
//向数据库中插入一条记录
public void demo1() { //1,hibernate框架加载核心配置文件(有数据库连接信息)
Configuration configuration = new Configuration().configure(); //2,创建一个SessionFactory(获得session-相当连接对象)
SessionFactory sessionFactory = configuration.buildSessionFactory(); //3,获得session对象
Session session = sessionFactory.openSession(); //4,默认的情况下事务是不自动提交的
Transaction tx = session.beginTransaction(); //5,业务逻辑操作 //向数据库中插入一条记录
Customer customer = new Customer();
customer.setName("司欧克");
customer.setAge(16); //保存记录
session.save(customer); //6,事务提交
tx.commit(); //7,释放资源
session.close();
sessionFactory.close();
}

查看数据库应该可以发现多了一条记录。

Hibernate初了解的更多相关文章

  1. Hibernate初认识以及HelloWorld

    一.Hibernate初认识 1. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. 2.对 ...

  2. hibernate初使用

    准备工作,安装及配置Hibernate http://zhoualine.iteye.com/blog/1190141 在产生数据库表映射 Java 对象时,我增加了数据库中的两张表分别为Chatlo ...

  3. >hibernate初认识

    一.什么是hibernate 1.hibernate是java领域的一款开源的ORM框架技术 2.hibernate对JDBC进行了非常轻量级的封装(使用了反射机制+配置或注解) 二.hibernat ...

  4. hibernate初体验

    简介: Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使 ...

  5. Hibernate初体验及简单错误排除

    Hibernate是什么,有多少好处,想必查找这类博文的都知道,所以就不多说了.下面是我对Hibernate简单使用的一个小小的总结.与君(主要是刚入门的)共勉吧! 创建的顺序 创建Hibernate ...

  6. hibernate 初印象

    将要学习的内容: 1.HelloWorld a) xml b) annotation2.Hibernate 原理模拟 - 什么是 O/R Mapping 以及为什么要有 O/RMapping3.常见 ...

  7. Hibernate学习一----------Hibernate初实现

    © 版权声明:本文为博主原创文章,转载请注明出处 ORM(Object/Relationship Mapping):对象/关系映射 - 利用面向对象思想编写的数据库应用程序最终都是把对象信息保存在关系 ...

  8. (三)mybatis之对Hibernate初了解

    前言:为什么会写Hibernate呢?因为HIbernate跟Mybatis一样,是以ORM模型为核心思想的,但是这两者有相似的地方也有差异的地方.通过这两种框架的比对,可以对mybatis有着更深的 ...

  9. Hibernate 初体验

    为什么会产生 Hibernate Mybatis 这类的dao层框架 传统的jdbc 虽然执行速度很快,但是开发效率很低,随着面向对象开发的设计思想,在面向对象编程中 将对象 进行持久化,存入关系型的 ...

随机推荐

  1. 使用gson将字符串转换成对象

    Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); System.out.pr ...

  2. k8s存储卷概述

    pod本身具有生命周期,故其内部运行的容器及其相关数据自身均无法持久存在.docker支持配置容器使用存储卷将数据持久存储于容器自身文件系统之外的存储空间中,它们可以是节点文件系统或网络文件系统之上的 ...

  3. 如何查看 SQL Server 执行的历史 SQL 语句记录?

    SELECT st.text as sql_statement, qs.creation_time as plan_last_compiled, qs.last_execution_time as p ...

  4. Linux服务器pxe+kickstart部署无人值守安装

    一.    使用光盘镜像安装好一台Redhat6.8系统的虚拟机(图形化界面) 二.    部署相关服务程序 1.     安装并配置dhcpd服务程序 a)安装dhcp服务程序 b)对dhcp服务进 ...

  5. 我不熟悉的list

    其实在日常中,链表的题目做的比较多,但是使用STL自带链表的还是比较少,所以里面的一些API不大熟悉.这边也简要介绍一些. 基本的一些API 先列举的这些和上面几篇用法几乎一样,所以不再累述. 赋值相 ...

  6. AcWing:106. 动态中位数(对顶堆)

    依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. 输入格式 第一行输入一个整数PP,代表后面数据集的个数,接下来若干行输入各个数据集. 每个数据集的第一行首先 ...

  7. CentOS版本禁用Ctrl+Alt+Del重启功能

    1  禁用Ctrl+Alt+Del重启功能(不重启系统的前提条件) 1.1  CentOS 6 ##查看/etc/inittab确认Ctrl+Alt+Del相关配置文件 cat /etc/initta ...

  8. wkhtmltopdfhtml php生成pdf快照,网页截图,网页快照完整版 (原)

    首先,安装(linux安装为例) 1.下载wkhtmltopdf wget http://download.gna.org/wkhtmltopdf/obsolete/linux/wkhtmltopdf ...

  9. 个推CTO深度解析数据智能之多维度分析系统的选型方法

    引言 前文回顾:[<数据智能时代来临:本质及技术体系要求>][2]作为本系列的第一篇文章,概括性地阐述了对于数据智能的理解以及推出了对应的核心技术体系要求: 数据智能就是以数据作为生产资料 ...

  10. 我的 CSDN 博客目录索引(主要记录了我学习视频、书籍的笔记,持续更新中)

    我的 CSDN 博客地址: lw_power的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/lw_power 佟刚老师<Spring4视频教程>学习笔记 ...