Hibernate框架入门
导读
本文主要介绍hibernate的入门,主要包括以下内容:hibernate介绍、hibernate环境搭建、hibernate简单测试、测试涉及的api详解。
一、hibernate介绍
JDBC是Java操作数据库的工具,我们可以使用jdbc来书写并执行sql语句来操作数据库,对于普通的业务,jdbc工具是完全可以胜任的,但但当任务复杂,特别是数据库中表格很多的时候,jdbc就会显得力不从心,代码复用率低且sql语句容易出错。
Hibernate框架从jdbc面向过程操作数据库的过程转变为面向对象来操作数据库。其原理是ORM编程,即Object Relational Mapping(对象关系映射)。每一个数据库表对应一个实体类,这个实体类通过映射关系来操作这个数据库表,映射可以理解为平常我们所说的函数,如y=f(x);y是数据库中的表,x是实体类,f(x)即映射关系,我们通过操作x可以改变y值,同样的操作实体类便可以达到操作数据库的目的,这就是通过面向对象方式来操作数据库。
二、hibernate环境搭建
hibernate的环境搭建包括以下部分:1、导入运行环境需要的jar包;2、创建数据库表和对应的实体类;3、编写表和实体之间的映射关系(也叫orm元数据);4、编写主配置文件hibernate.cfg.xml
1、导包
搜索下载压缩包:hibernate-release-5.0.7.Final.zip就可以找到相应的jar包:
注:不要忘了导入数据库驱动包(这里我使用的是mysql数据库),所以还需导入:
2、创建数据库表和实体类
这里假设我们创建了user表:
CREATE TABLE `user` (
`uid` bigint(32) NOT NULL AUTO_INCREMENT,
`uname` varchar(32) NOT NULL,
PRIMARY KEY (`uid`)
)
实体类:User
package domain;
public class User {
private Long uid;
private String uname; public Long getUid() {
return uid;
}
public void setUid(Long uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
@Override
public String toString() {
return "User [uid=" + uid + ", uname=" + uname + "]";
}
}
3、编写表和实体之间的映射关系(orm元数据)
1)导入dtd约束
hibernate框架使用的是xml文件作为配置文件,所以在编写xml文件之前需要先导入dtd约束(该约束文件也在上面使用到的压缩包里)
导入方式:eclipse-->Preferences-->xml-->XML Catalog-->add
两个文件都添加完成后你的eclipse中有了这个dtd约束了,如果你的eclipse已经有了该dtd约束上面的步骤就可以忽略。
2)配置映射关系:User.hbm.xml
一般该文件的命名格式为(当然你可以随意命名):类名.hbm.xml。且放在和该实体类同一个目录下。
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 package="domain" > <class name="User" table="user" >
<id name="uid" >
<generator class="native"></generator>
</id> <property name="uname" column="uname" ></property>
</class>
</hibernate-mapping>
xml注释版:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 1、导入dtd约束 -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- 2、ORM元数据:配置表与实体对象的关系(映射关系) --> <!-- package属性:填写一个包名.在元素内部凡是需要书写完整类名的属性,可以直接写简答类名了. -->
<hibernate-mapping package="domain" > <!--
2.1 class元素: 配置实体与表的对应关系的
name: 完整类名
table:数据库表名
-->
<class name="User" table="user" >
<!-- id元素:配置主键映射的属性
name: 填写主键对应属性名
column(可选): 填写表中的主键列名.默认值:列名会默认使用属性名
type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
每个类型有三种填法: java类型|hibernate类型|数据库类型
not-null(可选):配置该属性(列)是否不能为空. 默认值:false
length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
-->
<id name="uid" >
<!-- generator:主键生成策略(明天讲) -->
<generator class="native"></generator>
</id>
<!-- 2.2property元素:除id之外的普通属性映射
name: 填写属性名
column(可选): 填写列名
type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
每个类型有三种填法: java类型|hibernate类型|数据库类型
not-null(可选):配置该属性(列)是否不能为空. 默认值:false
length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
-->
<property name="uname" column="uname" ></property>
</class>
</hibernate-mapping>
4、编写主配置文件
主配置文件一般是整体环境的配置一些数据库操作设置。主要分为:1、必要配置:数据库驱动等配置;2、可选配置;3、引入orm元数据:指定要操作的关系映射。
一般主配置文件都以hibernate.xfg.xml来命名(这样我们在使用时可以直接使用无参方法调用,比较方便)。且需要将文件放到src目录下。
hebernate.cfg.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>
<!--
#hibernate.dialect org.hibernate.dialect.MySQLDialect
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
#hibernate.connection.driver_class com.mysql.jdbc.Driver
#hibernate.connection.url jdbc:mysql:///test
#hibernate.connection.username gavin
#hibernate.connection.password
<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">root</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> <mapping resource="domain/User.hbm.xml" /> </session-factory>
</hibernate-configuration>
hebernate.cfg.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>
<!--
#hibernate.dialect org.hibernate.dialect.MySQLDialect
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
#hibernate.connection.driver_class com.mysql.jdbc.Driver
#hibernate.connection.url jdbc:mysql:///test
#hibernate.connection.username gavin
#hibernate.connection.password
-->
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库url -->
<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
<!-- 数据库连接用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库连接密码 -->
<property name="hibernate.connection.password">password</property>
<!-- 数据库方言
不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
sql99标准: DDL 定义语言 库表的增删改查
DCL 控制语言 事务 权限
DML 操纵语言 增删改查
注意: MYSQL在选择方言时,请选择最短的方言.
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- #hibernate.show_sql true
#hibernate.format_sql true
-->
<!-- 将hibernate生成的sql语句打印到控制台 -->
<property name="hibernate.show_sql">true</property>
<!-- 将hibernate生成的sql语句格式化(语法缩进) -->
<property name="hibernate.format_sql">true</property>
<!--
## auto schema export 自动导出表结构. 自动建表
#hibernate.hbm2ddl.auto create 自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
#hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
#hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
#hibernate.hbm2ddl.auto validate 校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 引入orm元数据
路径书写: 填写src下的路径
-->
<mapping resource="domain/User.hbm.xml" /> </session-factory>
</hibernate-configuration>
到这里我们的hibernate环境就搭建完成了,刚开始感觉很多,用多了其实就很可以很快copy这些文件然后改改就o了。
三、hibernate简单测试
1)Demo测试类:
package test; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; import domain.User; public class Demo { @Test
//使用hibernate框架,通过操作User对象往user表中插入一条数据。
public void addUser(){
//操作涉及的核心类
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction(); //操作User
//-----------------------
User user = new User();
user.setUid(1l);
user.setUname("张三"); session.save(user);//执行
//----------------------- //关闭资源
tx.commit();
session.close();
factory.close();
}
2)执行结果:
四、测试涉及的api详解
//1 创建,调用空参构造
Configuration conf = new Configuration().configure();
//2 根据配置信息,创建 SessionFactory对象
SessionFactory sf = conf.buildSessionFactory();
//3 获得session
Session session = sf.openSession();
//4 session获得操作事务的Transaction对象
//获得操作事务的tx对象
Transaction tx = session.getTransaction();
tx.begin();
//开启事务并获得操作事务的tx对象(建议使用)
Transaction tx2 = session.beginTransaction();
//----------------------------------------------
//1 获得要修改的对象
User u = session.get(User.class, 1l);
//2 调用delete删除对象
session.delete(u);
//----------------------------------------------
tx2.commit();//提交事务
session.close();//释放资源
sf.close();//释放资源
除了虚线//-----------------之间的操作部分,上下两部分一般都是固定不变的。所以我们可以使用工具类进行抽取,以提高代码复用率:
HibernateUtils:
package utils; import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class HibernateUtils { // 会话工厂,以单例方式管理
private static SessionFactory sessionFactory; // ThreadLocal存储session
private static ThreadLocal<Session> session = new ThreadLocal<Session>(); // 以单例方式管理sessionFactory
static {
try {
sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
} catch (HibernateException e) {
e.printStackTrace();
throw new HibernateException("初始化会话工厂失败!");
} }
//得到一个单例的会话工厂
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
//获取一个新session
public static Session openSession(){
return sessionFactory.openSession();
} public static Session getCurrentSession() throws HibernateException {
return sessionFactory.getCurrentSession();
} public static void closeSession() throws HibernateException {
sessionFactory.getCurrentSession().close();
} }
Hibernate框架入门的更多相关文章
- Hibernate 框架入门(一)
1. SSH Web 层: Struts2 业务层: Spring 持久层: Hibernate 2. Hibernate 概述 概述 Hibernate 是一个对象关系映射框架(ORM 框架); 对 ...
- Hibernate 框架入门
接着上一篇的 Hibernate 框架的了解,我们就继续学习 Hibernate 框架.这次就进入 Hibernate 框架的入门学习. 首先在学习 Hibernate 框架之前,我们要准备好我们需要 ...
- hibernate框架入门配置
1.新建一个项目(可以是java项目,也可以是webapp) 2.导入jar包,包括日志,mysql驱动,必备request包,jpa配置规范包 3.创建实体类 1.创建数据库,使用hibernate ...
- Hibernate框架之入门
1.Hibernate框架简述 Hibernate的核心组件在基于MVC设计模式的JAVA WEB应用中,Hibernate可以作为模型层/数据访问层.它通过配置文件(hibernate.proper ...
- Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis
https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=6 ...
- 框架之 hibernate简单入门
hibernate框架的搭建 Hibernate框架的概述 1. Hibernate框架的概述 * Hibernate称为 * Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JD ...
- Hibernate入门第一讲——Hibernate框架的快速入门
Hibernate框架的概述 什么是框架? 框架指的是软件的半成品,已经完成了部分功能. JavaEE开发的三层架构 了解框架的基本概念之后,我们就来看看Hibernate框架处于JavaEE开发的经 ...
- Hibernate框架之入门案例
今天终于开始学习了三大框架的其中一个框架,Hibernate框架,在这里不去讲Hibernate框架的一些基础概念了,直接切入代码,带大家了解一下Hibernate能干什么, Hibernate的人们 ...
- java三大框架之一hibernate使用入门
综述:Hibernate的作用就是让实体类与数据库映射,使数据持久化,用于替代JDBC,使我们不致于写那么多sql语句代码. 1. 首先在官网www.hibernate.org下载hibernate包 ...
随机推荐
- 三种方式打印杨辉三角形(JAVA实现)
//采用一个二维数组打印杨辉三角 class Yanghui1 { public static void main(String[] args) { //设置杨辉三角的行数 int num = 10; ...
- Leetcode题解(十一)
31.Next Permutation 题目 这道题目的意思是给定一个序列,找出其按照字典顺序的下一个顺序,如果给定顺序是字典中的最后一个顺序,其下一个顺序则为字典中的第一个顺序.比如: 1,2,3, ...
- java Callable创建线程
package com.java.concurrent; import java.util.concurrent.Callable; import java.util.concurrent.Execu ...
- undefined 与void 0
参考:https://segmentfault.com/a/1190000000474941 Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值.void 操作符用法 ...
- linux DHCP安装和测试
1.Yum 安装DHCP服务 2.拷贝模板配置文件,方便后期的配置修改. cp /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample /etc/dhcp/dhcpd. ...
- Python爬虫入门:URLError异常处理
大家好,本节在这里主要说的是URLError还有HTTPError,以及对它们的一些处理. 1.URLError 首先解释下URLError可能产生的原因: 网络无连接,即本机无法上网 连接不到特定的 ...
- 开发环境MAPLAB下使用仿真器ICD2程序下载流程
程序下载流程 一. 连接示意图 二. 下载步骤 1.目标板电源断开 2.将仿真器下载端口与电路板JTAG端口有效连接 3.启动MPLAB软件 4.点击MAPLAB软件上方Programme ...
- Postman参数化使用以及中文乱码问题解决
1.参数化详解 准备工作,数据准备 2.使用csv文件时中文乱码可以通过使用txt文本,json文本改变调用json文件改变文件的编码格式解决 3:参数化数据调用的两种方式通过调用读取文件传入环境变量 ...
- Scrum Meeting Alpha - 3
Scrum Meeting Alpha - 3 NewTeam 2017/10/27 地点:新主楼F座二楼 任务反馈 团队成员 完成任务 计划任务 安万贺 找到了几个开源项目,参考了API的包装方式, ...
- socket阻塞IO流程图
单线程 多线程