Hibernate4.2.4入门(一)——环境搭建和简单例子
一、前言
发下牢骚,这段时间要做项目,又要学框架,搞得都没时间写笔记,但是觉得这知识学过还是要记录下。进入主题了
1.1、Hibernate简介
什么是Hibernate?Hibernate有什么用?
Hibernate是开放源代码的对象关系映射框架,用来把java的对象映射到数据库中的关系数据中,以便永久保存数据。
(简单说来,我们都知道Java语言是面向对象的语言,数据库是面向关系的,我们每次要往数据库中添加数据的时候,是不是每次都需要写SQL语句,进行CRUD,而优秀的开发人员
他们想出了一个非常好的映射框架,对象关系映射,也就是Hibernate,再透彻点说,就是你往对象添加数据的时候,数据库中的表就自动添加了数据了。是不是很神奇!)
Hibernate的作用:
1、管理Java类的对象到数据库的映射
2、提供数据查询
3、提高效率,减少开发人员使用SQL和jdbc处理数据的时间
4、Hibernate能实现数据持久化和对象关系的映射
1.2、理解Hibernate
笔者在前面有说过,学一个东西,首先要理解它是什么?有什么用?为何存在?
我们要了解Hibernate,首先要先去了解三层结构,三层结构我们都听过,但是,它和Hibernate有什么关系呢?
这里简要说明下三层结构
三层结构分为: 表示层,业务逻辑层,数据库层
表示层: 提供与用户进行交互的界面
业务逻辑层: 负责各种业务逻辑,提供对业务数据的保存,更新,删除和查询操作等
数据库层: 存放管理应用的持久化业务数据
而Hibernate,其实就是在业务逻辑层和数据库层中间,添加一个持久化层,这个持久化层是业务逻辑中分离出来的;这样,业务逻辑层通过持久化层,持久化层通过数据库层。
这里说了持久化,那么什么是持久化呢?
将数据(如内存中的对象)永久的保存到存储设备中,就是持久化,持久化的作用是将内存中的数据存储到关系型的数据库中。
说到底其实数据存放分为两种,一种是短期存放,就是存放在内存中,当你重新运行项目的时候,内存中的数据就消失,而另外一种就是永久存放。
理论就到这里。
1.2、简单例子——增删改查
1.2.1、搭建环境
新建java property,这里笔者的环境是Eclipse+Tomcat8.0,下载所需要的jar包,打包在这里,注意还得添加mysql的jar包,将包导入到项目中,具体操作
右键项目名——Properties——Java Build Path——Libraries——Add Library——User Library——User Libraryies——New,接下来就添加jar,然后起个名字,之后将导入到你的项目就可以了。
效果图:
1.2.2、新建配置文件
这里需要注意一点就是:在Hibernate中,默认配置文件的命名为hibernate.cfg.xml,所以我们配置文件命名一般就是这个,如果说你想要重新命名的话,那么在读取配置文件的时候就要指定相对路径。
在src下新建hibernate.cfg.xml
内容有连接数据库,指定读取实体类的配置信息,还有在控制台输出SQL语句等数据;配置文件中的dtd文件,在hibernate-core-4.2.4.Final.jar中的org.hibernate中的最后就能看到hibernate-configuration-3.0.dtd,打开该文件,然后将下面的dtd文件限制加到xml配置文件中即可。注意:笔者这里使用的是hibernate 4.2的版本。但是一般都在核心包里面的。
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
新建实体类:Student.java
package com.hibernate.hellos; public class Student {
private int sid;
private String sname;
private int sage;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getSage() {
return sage;
}
public void setSage(int sage) {
this.sage = sage;
}
}
Student
重点来了:当我们新建实体类时,需要在该实体类的基础上新建映射文件,dtd限制同样在核心包中里面查找
新建配置文件:Student.hbn.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- name:表示的是该类的相对路径
table:表示的是数据库的表名
-->
<class name="com.hibernate.hellos.Student" table="Student">
<!--
type:表示该属性是int类型
column:映射的是数据库中的列名
native:根据底层数据库的能力选择identity, sequence 或者hilo中的一个,就是根据数据库生成
-->
<id name="sid" type="int">
<column name="ID" />
<generator class="native" />
</id>
<property name="sname" type="java.lang.String">
<column name="SNAME" />
</property>
<property name="sage" type="int">
<column name="SAGE" />
</property>
</class>
</hibernate-mapping>
注意:
其中generator的class有:
increment(递增)
用于为long, short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。
identity (标识)
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。返回的标识符是long, short 或者int类型的。
sequence (序列)
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的
uuid
用一个128位的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
native(本地)
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。
新建配置文件:hiberate.cfg.xml,该文件放在src下
<?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="show_sql">true</property> <!-- 显示sql语句 -->
<property name="format_sql">true</property> <!-- 格式化sql语句 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">
<![CDATA[jdbc:mysql://localhost:3306/myhibernate?useUnicode=true&characterEncoding=utf8]]>
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- 创建表 使用create,查询或者更新的时候使用update-->
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- hibernate的第一个测试例子 -->
<mapping resource="com/hibernate/hellos/Student.hbm.xml" /> </session-factory>
</hibernate-configuration>
注意:使用hibernate.hbm2ddl.auto的时候,当为create的时候,表示如果你数据库中没创建表也没关系,hibernate会自动帮你创建,当使用update的时候,表示在表的基础上使用
接下来新建一个测试类:Test.java
package com.hibernate.hellos; 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; public class Test {
private static SessionFactory sessionfactory;
private static Session session;
public static void main(String[] args){
//读取默认配置文件名 hibernate.cfg.xml
//如果要指定文件名,只需要在new Configuration().configure("指定文件的路径");
Configuration config = new Configuration().configure();
//注册服务
ServiceRegistry service = new ServiceRegistryBuilder().applySettings(config.getProperties())
.buildServiceRegistry();
//实例化一个session工厂
SessionFactory sessionfactory = config.buildSessionFactory(service);
//打开hibernate的session,执行操作
session = sessionfactory.openSession(); //添加
add(); //查询
sel(); //修改
update(); //删除
delete();
}
//添加
public static void add(){
Transaction transaction = session.beginTransaction();
Student s = new Student();
s.setSname("张三");
s.setSage(20);
session.save(s);
transaction.commit(); //注意:如果session关闭的话,需要指定打开
}
//查询
public static void sel(){
Student s = (Student) session.get(Student.class, 1);
System.out.println(s.getSname()); }
//修改数据
public static void update(){
Student s = new Student();
s.setSname("李四");
s.setSage(30); Transaction transaction = session.beginTransaction();
//获取数据库中的表
Student s1 = (Student) session.get(Student.class,1);
transaction.commit();
s1.setSname("李思思");
transaction = session.beginTransaction();
session.update(s1);
transaction.commit();
}
public static void delete(){ Transaction transaction = session.beginTransaction();
Student s = (Student) session.get(Student.class, 1);
session.delete(s);
transaction.commit(); }
}
如果你直接复制我代码的话,你就会看到数据库中除了一张表数据什么都没有,把delete()方法注释掉。恩,别犯傻。
当我们使用格式化的时候,就可以看到
添加和修改的效果图:
数据库中的表的数据:
总结:
1、新建实体类的时候,记得要写映射文件,当然可以使用注解的方式,后期笔者会慢慢记录
2、table表名不可以是mysql中的关键字
3、hibernate.hbm2ddl.auto的使用需要注意
Hibernate4.2.4入门(一)——环境搭建和简单例子的更多相关文章
- Struts2入门(一)——环境搭建和简单例子(Struts2 2.5.2版本)
一.前言 1.了解三大框架 什么是框架? 框架是一种规范,一种规则,一种把技术组织起来的规则,这就是框架. 什么是三大框架(SSH),Struts.hibernate和spring的作用是什么? St ...
- 【个人笔记】003-PHP基础-01-PHP快速入门-03-PHP环境搭建
003-PHP基础-01-PHP快速入门 03-PHP环境搭建 1.客户端(浏览器) IE FireFox CHROME Opera Safari 2.服务器 是运行网站的基本 是放置程序代码的地方 ...
- Android入门之环境搭建
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1376935560.html 原创:An ...
- scala 入门Eclipse环境搭建
scala 入门Eclipse环境搭建及第一个入门经典程序HelloWorld IDE选择并下载: scala for eclipse 下载: http://scala-ide.org/downloa ...
- 新手嘛,先学习下 Vue2.0 新手入门 — 从环境搭建到发布
Vue2.0 新手入门 — 从环境搭建到发布 转自:http://www.runoob.com/w3cnote/vue2-start-coding.html 具体文章详细就不搬了,步骤可过去看,我这就 ...
- scala 入门Eclipse环境搭建及第一个入门经典程序HelloWorld
scala 入门Eclipse环境搭建及第一个入门经典程序HelloWorld 学习了: http://blog.csdn.net/wangmuming/article/details/3407911 ...
- 总结Vue 第四天:vue-cli(Vue2.0 新手入门 — 从环境搭建到发布)
总结Vue 第四天:vue-cli(Vue2.0 新手入门 - 从环境搭建到发布) 一.Vue CLI----(Vue2.0 新手入门 - 从环境搭建到发布): ■ CLI是Command-Lin ...
- android Jni NDK开发环境搭建及其简单实例的编写
android Jni NDK开发环境搭建及其简单实例的编写 由于工作需要,需要采用开发想要的JNI,由于之前没有接触过安卓的开发,所以更加网上的帖子,学习了下.遇到了些问题,然后总结下学习过程中 ...
- Node.js 环境搭建及简单应用
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型.如果你想创建自己的服务,那么Node.js是一个非 ...
随机推荐
- Node.js使用PM2的集群将变得更加容易
介绍 众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心 ...
- H3 BPM让天下没有难用的流程之产品概述
一.产品简介 BPM(Business Process Management),是指根据业务环境的变化,推进人与人之间.人与系统之间以及系统与系统之间的整合及调整的经营方法与解决方案的IT工具. H3 ...
- ios 类似微信红点显示功能
设计思路:给UIView增加一个分类 所有的视图都可以根据需要来进行红点显示 #import <UIKit/UIKit.h> @interface UIView (CHRRedDot) @ ...
- 软件工程(C编码实践篇)学习心得
孟繁琛 + 原创作品转载请注明出处 + <软件工程(C编码实践篇)>MOOC课程 http://mooc.study.163.com/course/USTC-1000002006 软件工程 ...
- Nova PhoneGap框架 总结
Nova PhoneGap Framework 是完全针对PhoneGap应用程序量身定做的,在这个框架下开发的应用程序很容易实现高质量的代码,很容易让程序拥有很好的性能和用户体验. 在经历了多个项目 ...
- 锤子OneStep及BigBang使用体验
令人期待的Smartisan OS v3.1.2终于推送了,第一时间下载了更新.几乎花了半个小时才升级完毕,捧着还热乎的手机,赶忙体验一下传说中的两大杀器:OneStep以及BigBang. 先说On ...
- nginx常用代理配置
因为业务系统需求,需要对web服务作nginx代理,在不断的尝试过程中,简单总结了一下常见的nginx代理配置. 1. 最简反向代理配置 在http节点下,使用upstream配置服务地址,使用ser ...
- 基于java的分布式爬虫
分类 分布式网络爬虫包含多个爬虫,每个爬虫需要完成的任务和单个的爬行器类似,它们从互联网上下载网页,并把网页保存在本地的磁盘,从中抽取URL并沿着这些URL的指向继续爬行.由于并行爬行器需要分割下载任 ...
- ABP框架 - 介绍
文档目录 本节内容: 简介 一个快速示例 其它特性 启动模板 如何使用 简介 我们总是对不同的需求开发不同的应用.但至少在某些层面上,一次又一次地重复实现通用的和类似的功能.如:授权,验证,异常处理, ...
- Spark 学习总结
摘要: 1.spark_core 2.spark_sql 3.spark_ml 内容: 1.spark_core 原理篇: Spark RDD 核心总结 RangePartitioner 实现简记 S ...