Hibernate初认识以及HelloWorld
一、Hibernate初认识
1、 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
2、对于对象持久化的理解:
a.狭义的理解,“持久化”仅仅指把对象永久保存到数据库中
b.广义的理解,“持久化”包括和数据库相关的各种操作:–保存:把对象永久保存到数据库中。
–更新:更新数据库中对象(记录)的状态。
–删除:从数据库中删除一个对象。
–查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。
–加载:根据特定的OID,把一个对象从数据库加载到内存中。
3、 ORM(Object/Relation Mapping)对象/关系映
–ORM 主要解决对象-关系的映射
面向对象 面向关系 类 表 对象 表的行(记录) 属性 表的列(z字段) –ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,把对数据库的操作转化为对对象的操作。
–ORM 采用元数据来描述对象-关系映射细节,元数据通常采用XML格式,并且存放在专门的对象-关系映射文件中.
二、Hibernate初使用之HelloWrld
1、创建一个Java工程,工程下面新建文件夹lib,在lib中加入Hibernate必须的jar包以及MySql的jar包
2、在src下新建Hibernate的配置文件:hibernate.cfg.xml ,配置信息如下,相关配置介绍见注释:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory >
<!-- 配置数据库连接基本信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">root123</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<!-- 配置Hibernate基本信息 -->
<!-- 配置MySQL数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 控制台是否打印SQL -->
<property name="show_sql">true</property>
<!-- 是否对SQL格式化 -->
<property name="format_sql">true</property>
<!-- 指定自动生成表的策略 -->
<property name="hbm2ddl.auto">update</property>
<!-- 指定关联的hbm.xml文件 -->
<mapping resource="com/elgin/hibernate/model/UserModel.hbm.xml"/>
</session-factory>
</hibernate-configuration>
3. 创建持久化的Java类,Hibernate 不要求持久化类继承任何父类或实现接口,这可以保证代码不被污染。这就是Hibernate被称为低侵入式设计的原因,示例代码如下:
•提供一个无参的构造器:使Hibernate可以使用Constructor.newInstance()来实例化持久化类•提供一个标识属性(identifier property):通常映射为数据库表的主键字段.如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate()•为类的持久化类字段声明访问方法(get/set):Hibernate对JavaBeans风格的属性实行持久化。•使用非 final类:在运行时生成代理是Hibernate的一个重要的功能.如果持久化类没有实现任何接口,Hibnernate使用CGLIB生成代理.如果使用的是final类,则无法生成CGLIB代理.•重写 eqauls和hashCode方法:如果需要把持久化类的实例放到Set中(当需要进行关联映射时),则应该重写这两个方法
package com.elgin.hibernate.model;
public class UserModel {
private int id;
private String username;
private String password;
private String phone;
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public UserModel() {
}
public UserModel(String username, String password, String phone, String email) {
super();
this.username = username;
this.password = password;
this.phone = phone;
this.email = email;
}
@Override
public String toString() {
return "UserModel [id=" + id + ", username=" + username + ", password=" + password + ", phone=" + phone
+ ", email=" + email + "]";
}
4. 创建对象-关系映射文件:UserModel.hbm.xml :
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2015-7-15 23:28:28 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.elgin.hibernate.model.UserModel" table="USERMODEL">
<id name="id" type="int">
<column name="ID" />
<!-- 主键生成方式,native:使用数据库本地方式 -->
<generator class="native" />
</id>
<property name="username" type="java.lang.String">
<column name="USERNAME" />
</property>
<property name="password" type="java.lang.String">
<column name="PASSWORD" />
</property>
<property name="phone" type="java.lang.String">
<column name="PHONE" />
</property>
<property name="email" type="java.lang.String">
<column name="EMAIL" />
</property>
</class>
</hibernate-mapping>
5. 编写Junit测试类HibernateTest来对Hibernate进行测试:
首先bulidpath,在工程中加入Junit4的类库,方便通过单元测试类对Hibernate进行测试。
package com.elgin.hibernate.test; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test; import com.elgin.hibernate.model.UserModel; public class HibernateTest { @Test
public void test(){ //1.创建sessionFactory对象
SessionFactory sessionFactory=null; //a> 创建Configuraton对象:关联hibernate配置文件和对象映射信息
Configuration configuration=new Configuration().configure();
// 4.0之前这么创建
//sessionFactory=configuration.buildSessionFactory();
//b> 创建一个serviceRegistry对象:hibernate 4.x新添加对象
// hibernate的任何配置和服务必须要在此对象中注册才能使用
ServiceRegistry serviceRegistry=
new ServiceRegistryBuilder().applySettings(configuration.getProperties())
.buildServiceRegistry(); sessionFactory=configuration.buildSessionFactory(serviceRegistry);
//2.创建一个session对象
Session session=sessionFactory.openSession();
//3.开启事务
Transaction transaction=session.beginTransaction();
//4.执行保存操作
UserModel user=new UserModel("Java", "123qwe", "13626345190", "ddddd@126.com");
session.save(user);
//5.提交事务
transaction.commit();
//6.关闭session
session.close();
//7.关闭sessionFactory
sessionFactory.close(); }
}
结束之后,用Junit Tester 运行,测试成功,并且在控制台打印出如下SQL语句:
Hibernate:
insert
into
USERMODEL
(USERNAME, PASSWORD, PHONE, EMAIL)
values
(?, ?, ?, ?)
打开navicat,可以看到在库hibernate下已经自动生成了表usermodel,打开之后发现存在我们之前存入的数据。
三、过程中出现的问题:
我在开始配置完毕之后,启动之后发现报错,错误信息如下:
ERROR: HHH000388: Unsuccessful: create table USERMODEL (ID integer not null auto_increment, USERNAME varchar(255), PASSWORD varchar(255), PHONE varchar(255),
EMAIL varchar(255), primary key (ID)) type=InnoDB七月 16, 2015 8:46:55 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'type=InnoDB'
at line 8
百度之后发现:因为type=InnoDB在5.0以前是可以使用的,但5.1之后就不行了。如果我们把type=InnoDB改为engine=InnoDB就不会有这个问题。但是,我想使用Hibernate,自动帮我建表,怎么办呢。这就与我们指定的数据库方言(dialect)有关了,之前数据库方言的配置是:
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
于是将此配置修改为上述配置文件中的配置,即
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
修改之后重新运行,运行正确,生成了表,也插入了数据。
注:Hibernate版本为4.2.5,MySQL为5.6.20
Hibernate初认识以及HelloWorld的更多相关文章
- hibernate初使用
准备工作,安装及配置Hibernate http://zhoualine.iteye.com/blog/1190141 在产生数据库表映射 Java 对象时,我增加了数据库中的两张表分别为Chatlo ...
- Hibernate(4)简单的HelloWorld
一个HelloWorld的案例 public class HelloWorld { @Test public void test() { //1.创建SessionFactory对象 SessionF ...
- hibernate 初印象
将要学习的内容: 1.HelloWorld a) xml b) annotation2.Hibernate 原理模拟 - 什么是 O/R Mapping 以及为什么要有 O/RMapping3.常见 ...
- hibernate学习二(HelloWorld)
一.建立hibernate配置文件 在工程Hibernate_01_HelloWorld下的src上建立hibernate.cfg.xml,打开hibernate-release-4.3.11.Fin ...
- >hibernate初认识
一.什么是hibernate 1.hibernate是java领域的一款开源的ORM框架技术 2.hibernate对JDBC进行了非常轻量级的封装(使用了反射机制+配置或注解) 二.hibernat ...
- hibernate初体验
简介: Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使 ...
- 初笔,JAVA.HelloWorld代码详解
HelloWorld.java //文件名 public class HelloWorld{ public static void main(String[] args){ System.out.pr ...
- Hibernate初体验及简单错误排除
Hibernate是什么,有多少好处,想必查找这类博文的都知道,所以就不多说了.下面是我对Hibernate简单使用的一个小小的总结.与君(主要是刚入门的)共勉吧! 创建的顺序 创建Hibernate ...
- Hibernate学习一----------Hibernate初实现
© 版权声明:本文为博主原创文章,转载请注明出处 ORM(Object/Relationship Mapping):对象/关系映射 - 利用面向对象思想编写的数据库应用程序最终都是把对象信息保存在关系 ...
随机推荐
- HTML 中的meta标签中的http-equiv与name属性使用介绍
meta是html语言head区的一个辅助性标签.也许你认为这些代码可有可无.其实如果你能够用好meta标签,会给你带来意想不到的效果,meta标签的作用有:搜索引擎优化(SEO),定义页面使用语言, ...
- C#使用sharppcap实现网络抓包-----2
虽然网上已经有了SharpSniffer 这一个SharpSniffer还是原创的无他,唯为学习工程文件下载:SharpSniffer.rar 1.创建套接字2.绑定到本机3.设置IOControl4 ...
- BZOJ 1898 Swamp 沼泽鳄鱼(矩阵)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1898 题意:一个无向图.给出起点和终点,以及某些时刻某些点不能到达的信息.问从起点出发在 ...
- JS中字符串拼装 单双引号的处理 字符转义
js中可能会用到动态追加元素,可能数据也是从后台传过来的,当然有两种思路, 1.在后台拼装好直接返回; 2.在前台js里面拼装, 如果拼装大量的html时可能单双引号就容易出问题;那么如何解决呢?最近 ...
- VS2012 professional和VS2012 Ultimate的区别
http://www.c-sharpcorner.com/news/1750/visual-studio-2012-editions-comparison.aspx http://karthikdod ...
- sendmessage()模拟鼠标点击
{鼠标软模拟:好处就是不会真的移动鼠标 开始按钮 坐标 x=386y=387 }sendmessage(hookHwnd,messages.WM_LBUTTONDOWN ,0,$0180017A); ...
- C/C++内存存储
#include <stdio.h> #include "string.h" #include "malloc.h" void Swap(int a ...
- Codeforces Round #206 (Div. 1)B(记忆化)
这题刚开始理解错题意了 以为只能往右和下走 这题挺好的 看题解看了N久啊 二维的DP 第一维表示走到第几步 可以画一个正方形 以左上角斜着划线 第i步走的点只能是第i条线上的点 而dp的第二维 就表示 ...
- lrj计算几何模板
整理了一下大白书上的计算几何模板. #include <cstdio> #include <algorithm> #include <cmath> #include ...
- bzoj1054: [HAOI2008]移动玩具
hash+bfs:要注意特殊情况.(似乎连sort.lower_bound都不用数据小直接判重了... #include<cstdio> #include<cstring> # ...