21-Java-Hibernate框架(一)
一、Hibernate了解
Hibernate框架是Java持久层的框架,是Gavin King发明的,2001年发布的,JBoss公司的产品,2003年进入市场。
Hibernate是基于对象来操作数据库的,但他最终还是被转换为SQL去进行操作
Hibernate对JDBC进行封装,简化数据库访问操作,采用ORM(Object Relation Mapping,对象关系映射)技术的持久层框架,自动实现表记录和实体对象之间的映射。
Hibernate与JDBC的区别:
Hibernate与JDBC都应用在持久层上,但Hibernate轻量级封装JDBC
Hibernate是自动的,不需要手写SQL语句的,它自动生成SQL语句,是面向对象的;
Mybatis是半自动的;
JDBC是手动的(需手写代码与数据库建立连接,获取对象,写SQL语句,执行SQL语句,返回结果,关闭连接),是面向过程的。
Hibernate体系结构:
1.框架工具包和驱动包
2.hibernate.cfg.xml
3.主配置文件,用于定义数据库连接参数
4.实体类(以entity为例)
5.映射描述文件entity.hbm.xml(这一步可以用注解代替)
6.定义类和表对应关系,属性和字段对应关系
二、Hibernate框架搭建(想要以下内容涉及的资源包的网友评论留言私聊,我百度网盘分享)
1.加载12个Hibernate包
dom4j-1.6.jar
geronimo-jta_1.2_spec-1.0-alpha-1.jar
hibernate-commons-annotations-4.0.5.Final.jar
hibernate-core-5.0.11.specid.jar
hibernate-jpa-2.1-api-1.0.2.Final.jar
javassist-3.18.0-ga-sources.jar
jboss-logging-3.3.0.Final.jar
mysql-connector-java-5.1.46.jar
slf4j-api-2.0.0-alpha1.jar
slf4j-jdk14-1.7.7.jar
slf4j-log4j12-1.7.5.jar
antlr-2.7.6.jar
将上述12个工具包放到web项目文件夹下的WebRoot/WEB-INF/lib/下
2.Hibernate两个配置文件(这一步也可以自己建xml文件配置参数,因为我之前建过,所以直接导入两个配置文件)
配置XML文件步骤:windows->preferences->XML->XML Catelog->add->location(找到dtd的位置)->key对应配置文件键值->OK
(1)*.hbm.xml 映射文件 建议放在entity/包下
(2)hibernate.cfg.xml 主配置文件 建议放在src/下
第一步:配置hibernate.cfg.xml文件(数据库连接信息,JDBC驱动,数据库dialect方言等)
<?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 方言 区分身份 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 数据库连接信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/hibernatetest</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property> <!-- hibernate自动生成表 --> <!-- hibernate在控制台显示SQL语句 -->
<property name="show_sql">true</property>
<!-- hibernate格式化SQL,控制台看起来更整齐 -->
<property name="format_sql">true</property>
<!-- 设置自动提交 -->
<property name="connection.autocommit">true</property> <!-- <property name="connection.characterEncoding">UTF-8</property> -->
<!--加载hibernate映射 -->
<mapping resource="com/hibernatetest/entity/User.hbm.xml" /> </session-factory> </hibernate-configuration>
第二步:配置*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>
<!-- name:对应的实体类的权限定名称,table:对应数据库表名称 -->
<class name="com.hibernatetest.entity.User" table="hibernateUser">
<!-- id标签用于配置主键属性
name:对应实体类中属性名称
type:可以省略,如果省略默认实体类中属性的对应类型
-->
<id name="uid" type="java.lang.Integer">
<!-- column用于设置对应数据库表中字段名
name:数据库表中的字段名
length:设置字段长度
-->
<column name="u_id" length="32"></column>
<!-- generator用于设置主键生成策略 -->
<generator class="native"></generator>
</id> <!-- property标签用于配置其他属性
name:对应实体类中属性名称
type:可以省略,如果省略默认实体类中属性的对应类型
-->
<property name="uname" column="u_name">
<!-- column用于设置对应数据库表中字段名
name:数据库表中的字段名
length:设置字段长度
-->
<column name="u_name" ></column>
</property> </class>
</hibernate-mapping>
三.使用Hibernate框架操作数据库(Hibernate有五大核心接口一个核心类)
Configuration:从hibernate.cfg.xml文件中加载主配置信息(数据库url,用户名,密码,jdbc驱动,数据库Dialect方言,数据库连接池,hibernate映射文件等)
SessionFactory:用于创建Session对象工厂,它可通过configuration创建得到,保存了数据库的配置信息和所有的映射关系
Session:用于执行数据库增删改查基本操作
Query和Criteria接口:用于负责执行各种数据的查询,它可以使用HQL语言或SQL语句两种表达方式
Transaction:用于事务控制(默认事务不自动提交)
Hibernate框架运行原理:
1.首先通过configuration去加载hibernate.cfg.xml这个配置文件
2.根据配置文件的信息去创建SessionFactory,SessionFactory是线程安全的,是一个session工厂
3.用SessionFactory来创建session,session不是线程安全的,通过session进行数据库的各种操作
4.在进行增删查改操作的时候通过Session打开Transaction进行事务的控制
public static void main(String[] args) {
//1.加载主配置文件
Configuration configuration = new Configuration().configure();//此处读取默认名称“hibernate.cfg.xml”,想要读取指定名称,需.configure("xxx.xml"); //2.建造Session工厂
SessionFactory sessionfactory = configuration.buildSessionFactory(); //3.获取Session,这个对象中提供了一套增删改查的方法
Session sess = sessionfactory.openSession(); //4.查询获取对象
User user = sess.get(User.class, 1);//在数据库数据表中获取id为1的记录
System.out.println(user);
//5.释放session
sess.close();
}
四、Session常用接口演示及Hibernate框架使用步骤
第一步:编写hibernate工具类
package HibernatenateUtils; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class hibernateUtils {
public static Session getSession(){
//1.加载主配置文件
Configuration configuration = new Configuration().configure(); //2.建造Session工厂
SessionFactory sessfactory = configuration.buildSessionFactory(); //3.获取Session,这个对象中提供了一套增删改查的方法
Session session = sessfactory.openSession(); return session;
}
}
第二步:编写实体类
package com.hibernatetest.entity; public class User {
private Integer uid;
private String uname;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(Integer uid, String uname) {
super();
this.uid = uid;
this.uname = uname;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((uid == null) ? 0 : uid.hashCode());
result = prime * result + ((uname == null) ? 0 : uname.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (uid == null) {
if (other.uid != null)
return false;
} else if (!uid.equals(other.uid))
return false;
if (uname == null) {
if (other.uname != null)
return false;
} else if (!uname.equals(other.uname))
return false;
return true;
}
@Override
public String toString() {
return "User [uid=" + uid + ", uname=" + uname + "]";
} }
第三步:进行数据库操作(此处只对Session相关常用操作进行注释)
package com.hibernatetest.test;
import java.io.Serializable;
import org.hibernate.Session;
import com.hibernatetest.entity.User;
import HibernatenateUtils.hibernateUtils; public class SessionTest {
public static void main(String[] args) {
Session session = hibernateUtils.getSession(); //4.数据库操作
/*save() 添加
*Update() 修改
*saveOrUpdate() 添加或修改
*createQuery() 创建Query查询对象
*delete() 删除
*get() 根据id查询,获取对象(立即加载,不管有没有访问对象,都会生成对应的SQL语句并执行)
*load() 根据id查询,获取对象(延迟加载,只有当访问对象的时候,才生成对应的SQL语句并执行)
*flush() 清理session缓存,在事务提交和session关闭时都会自动执行flush()
*beginTransaction()开启事务
* */
//(4 - 1)save添加操作
User user1 = new User(null,"lisi");
Serializable save = session.save(user1);//将对象添加到数据库中作为表的一条记录,返回的是一个主键值
//注意:此处我hibernate.cfg.xml设置的事务自动提交为true
// 事务自动提交默认为false,可在hibernate.cfg.xml中修改,
// 也可通过session.beginTracsation()开启事务和session2.getTransaction().commit();//提交事务
// 如果事务自动提交为false,此时数据并未同步到数据库中
// 如果事务自动提交为true,此时数据便已经同步到数据库中
System.out.println(save); //(4 - 2)Update修改操作
session.beginTransaction();//开启事务
User user2 = session.get(User.class, 5);//先从数据库中取出数据
user2.setUname("zhangsan");//再修改数据,此处不能修改设置了主键自增长的id.
session.update(user2);//最后再把数据放回去
session.getTransaction().commit();//提交事务 //(4 - 3)delete删除操作
//注意:使用delete操作必须保证删除对象在数据库中,如果数据库中没有则会报错:
//Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1;
session.beginTransaction();//开启事务
User user3 = new User(null,null);
user3.setUid(21);
session.delete(user3);
session.flush();
session.getTransaction().commit();//提交事务 //(4 - 4)saveOrUpdate删除操作:如果对象中主键不为null(并且这个主键的值在数据库中存在)做修改操作,如果为null做添加操作
//注意:如果对象中的主键在数据库中不存在,会报错:
//Error during managed flush [Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1]
session.beginTransaction();//开启事务
User user4 = new User(17,"zhangsan");
session.saveOrUpdate(user4);
User user5 = new User(null,"zhangsan");
session.saveOrUpdate(user5);
session.getTransaction().commit();//提交事务 //5.释放Session
session.close();//如果事务自动提交为false,此时session缓存中的数据会自动同步到数据库中,之后会自动调用flush清空缓存。
}
}
21-Java-Hibernate框架(一)的更多相关文章
- 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 ...
- java三大框架之一hibernate使用入门
综述:Hibernate的作用就是让实体类与数据库映射,使数据持久化,用于替代JDBC,使我们不致于写那么多sql语句代码. 1. 首先在官网www.hibernate.org下载hibernate包 ...
- Java最重要的21个技术点和知识点之JAVA集合框架、异常类、IO
(三)Java最重要的21个技术点和知识点之JAVA集合框架.异常类.IO 写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享 ...
- Java ssh 框架 hibernate 详细理解
Hibernate框架技术相信对大多数的 java 程序员并不陌生,数据表之间的关系如何通过Hibernate来建立,需要我们认真的分析数据表中数据项之间的交互: 数据库表的之间的关系有: (1)一对 ...
- JAVA框架之Hibernate框架的学习步骤
首先介绍一下Java三大框架的关系 以CRM项目即客户关系管理项目示例 hibernate框架的学习路线: 1.学习框架入门,自己搭建框架,完成增删改查的操作 2.学习一级缓存,事物管理和基本查询 3 ...
- 轻量级Java持久化框架,Hibernate完美助手,Minidao 1.6.2版本发布
Minidao 1.6.2 版本发布,轻量级Java持久化框架(Hibernate完美助手) Minidao产生初衷? 采用Hibernate的J2EE项目都有一个痛病,针对复杂业务SQL,hiber ...
- 深入浅出学习hibernate框架(三):java的反射机制
上篇博客写到了JDBC的基本操作,今天准备写一篇关于JAVA反射机制的文章,因为java的反射机制和上一篇JDBC都是Hibernate框架的基本要素.在Hibernate的运行机制中,这两块的内容正 ...
- (转)Hibernate框架基础——Java对象持久化概述
http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构 说明 ...
- java三大框架——Struts + Hibernate + Spring
Struts主要负责表示层的显示 Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作) Hibernate主要是数据持久化到数据库 再用jsp的servlet做网页开发的时候有个 w ...
- java:Hibernate框架1(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态,增删查改)
1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件 准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cf ...
随机推荐
- 论文速递 | 实例分割算法BlendMask,实时又state-of-the-art
BlendMask通过更合理的blender模块融合top-level和low-level的语义信息来提取更准确的实例分割特征,该模型效果达到state-of-the-art,但结构十分精简,推理速度 ...
- python3 open txt的UnicodeDecodeError: 'gbk' codec问题解决方案
python3 open txt的UnicodeDecodeError: 'gbk' codec问题解决方案先直截了当给出解决方案,在程序开头加上:import _locale_locale._get ...
- TCP、UDP服务器模型 在网络程序里面,通常都是一
TCP.UDP服务器模型 在网络程序里面,通常都是一个服务器处理多个客户机,为了出个多个客户机的请求,服务器端的程序有不同的处理方式. 目前最常用的服务器模型: 循环服务器:循环服务器在同一时刻只能响 ...
- 在Windows Python3.4 上安装NumPy、Matplotlib、SciPy和IPython
NumPy 下载地址: http://sourceforge.net/projects/numpy/files/NumPy/1.8.1/ SciPy 下载地址: http://sourceforge. ...
- 使用skimage处理图像数据的9个技巧
介绍 我们非常熟悉结构化(表格)数据的预处理步骤.你可以找到缺失的值然后添补它,然后检测并处理异常值,等等这些步骤.这有助于我们建立更好.更健壮的机器学习模型.但是当我们处理图像数据时,应该如何进行预 ...
- Github标星过万,Python新手100天学习计划,这次再学不会算我输!
作为目前最火也是最实用的编程语言,Python不仅是新手入门程序界的首选,也逐渐成为了从大厂到小厂,招牌需求list的必要一条. 当然,学Python这件事情,你可能也和文摘菌一样,已经下了一百次 ...
- python入门灵魂5问--python学习路线,python教程,python学哪些,python怎么学,python学到什么程度
一.python入门简介 对于刚接触python编程或者想学习python自动化的人来说,基本都会有以下python入门灵魂5问--python学习路线,python教程,python学哪些,pyth ...
- mac 中使用git 和pycharm提交项目
一.安装Git 1.验证git是否安装: 终端中输入: git 如果安装过出现: 2.安装git: 进入https://git-scm.com: 点击 Download 2.23.0 for Mac ...
- java.lang.NoSuchMethodException: java.util.List.<init>()
报错信息如下 java.lang.NoSuchMethodException: java.util.List.<init>() at java.lang.Class.getConstruc ...
- 6L-单向链表实现
关注公众号 MageByte,有你想要的精彩内容.文中涉及的代码可访问 GitHub:https://github.com/UniqueDong/algorithms.git 上一篇<链表导论心 ...