一起学习Hibernate: Hibernate01 —— Hibernate的概述与入门案例
一 Hibernate的介绍
1 让我们从JDBC与替代它的框架Hibernate进行一下对比。
1.1 JDBC的缺点
1) 代码结构繁琐。每次书写sql语句操作数据库都得需要很多步;
2) 是面向过程的编程,而非面向对象的;
3) 没有做到数据缓存。这会导致程序与数据库的交互的次数很多;
4) 因为事务是自动开启的,所以存在安全隐患。
1.2 JDBC的优点
1) 因为是底层的数据库操作,所以执行效率很高;
2) sql语句可以自己编写,可以进行优化从而选择效率最高的那些。
1.3 Hibernate的优点
1) 面向对象编程的
2) 代码编程比较简单
3) Hibernate做到了数据缓存
用处: Hibernate用得场合最多的情况是企业中的中小型项目
1.4 Hibernate的缺点
1) 该框架程序员是没有办法干预sql语句的生成的
2) 如果一个项目中,对sql语句的优化的要求比较高,这个时候不能用hibernate来做
3) 表之间的关系很复杂的情况下,不能用hibernate来操作
4) 如果一张表的数据超过了千万级别也不适合用hibernate来做
2 Hibernate的组成
持久化类 —— 是一个JavaBean,对应现实世界中的实体的类。
映射文件 —— 用于建立数据库的表与持久化类之间的联系的文件
说明:
1 对应关系
表结构 对应 持久化类
表数据 对应 持久化类的对象
2 由1可知,数据库中有多少张表(或有多少个持久化类),便至少应该有多少个映射文件。
配置文件 —— 描述hibernate工程配置信息的文件
说明: 一个工程一般只有一个。
小结:
Hibernate就是利用面向对象的思想,以对象为基本单位来操作数据库的一种框架。
二 Hibernate入门案例
1 创建一个Java Project
2 导入jar包
3 创建配置文件
<?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代表一个数据库
-->
<session-factory>
<!--
链接数据库的用户名
-->
<property name="connection.username">root</property>
<!--
链接数据库的密码
-->
<property name="connection.password">sorry</property>
<!--
链接数据库的驱动
-->
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!--
链接数据库的url 最后一个/后面的字符串代表了一个数据库名称。所以,我们书写完配置文件后要创建相应的数据库
-->
<property name="connection.url">
jdbc:mysql://localhost:3306/blog_hibernate_01
</property>
<!--
方言
告诉hibernate用什么样的数据库
-->
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!--
validate 加载hibernate时,验证数据库的结构
update 加载hibernate时,检查数据库,如果表不存在,则创建,如果存在,则更新
create 每次加载hiberante,都会创建表
create-drop 每次加载hiberante,创建,卸载hiberante时,销毁
-->
<property name="hbm2ddl.auto">update</property>
<!--
显示sql语句
-->
<property name="show_sql">true</property>
<!--
格式化sql语句
-->
<property name="format_sql">true</property>
<!--
加载映射文件
-->
<mapping resource="com/hibernate/domain/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>
经验:
1 配置文件必须在src目录下
2 名称必须为hibernate.cfg.xml
4 创建持久化类
注:
1 该持久化类最好实现java.io.Serializable接口,以供序列化
2 一定要提供一个无参构造器,以供系统通过反射创建相应持久化类的对象
3 要提供字段的setters和getters
package com.hibernate.domain; import java.io.Serializable; public class Student implements Serializable{
private Long id;
private String name;
private int age;
private String gender; //必须提供一个无参构造器,供系统通过反射生成相关持久化类的对象。
public Student(){ } //生成域的setters和getters
public Long getId() {
return id;
} public void setId(Long 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;
} public String getGender() {
return gender;
} public void setGender(String gender) {
this.gender = gender;
}
}
5 创建映射文件
<?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.domain.Student" table="student">
<!--
id对应表中的主键
name为持久化类中属性的名称
length 为对应数据库表中相应字段的长度
column 属性的名称对应的表的字段名称 不写则默认和属性的名称一致
-->
<id name="id" length="5" type="java.lang.Long" column="id">
<!--
主键的生成器.
-->
<generator class="increment"></generator>
</id>
<property name="name" column="name" type="java.lang.String" length="20">
</property>
<property name="age" column="age" length="50">
</property>
<property name="gender" column="gender" type="java.lang.String" length="20"></property>
</class>
</hibernate-mapping>
6 创建Dao包,进行测试
package com.hibernate.crud; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; import com.hibernate.domain.Student; public class StudentDao { @Test
public void testSaveStudent(){
//1 创建配置对象
Configuration configuration = new Configuration();
//2 加载配置文件
configuration.configure();
//3 获取sessionFactory对象
SessionFactory sessionFactory = configuration.buildSessionFactory();
//4 创建session对象
Session session = sessionFactory.openSession();
//5 开启事务
Transaction transaction = session.beginTransaction();
//6 执行相关操作 —— 保存一个新建的学生对象
Student student = new Student();
//因为在映射文件中设置了主键生成器,所以不用在此设置主键了。后面我们会详细讲解。
student.setName("Leesin");
student.setAge(22);
student.setGender("male");
//调用save方法保存
session.save(student);
//7 提交事务
transaction.commit();
}
}
结果:
三 案例详解
1 Hibernate的流程
说明:
1 crud操作时由session对象完成的
2 Hibernate中,事务需要手动开启,并非自动开启的。
Configuration类
利用该类加载了hibernate的配置文件
sessionFactory类
1、 hibernate配置文件的信息、持久化类的信息、映射文件的信息全部在该类中
2、 sessionFactory对象有且只有一个
3、 生命周期是整个hibernate实例
4、 sessionFactory本身就是线程安全的
5、 二级缓存在sessionFactory中存放
6、 sessionFactory和数据库的链接没有直接的关系
session类
1、 crud操作由session来完成的
2、 一个session代表数据库的一个连接。session类实际上是对connection类的高级封装
内部执行流程
代码结构比较繁琐
面向纯sql语句的编程,面向过程的编程
一起学习Hibernate: Hibernate01 —— Hibernate的概述与入门案例的更多相关文章
- Mybatis学习笔记之一(环境搭建和入门案例介绍)
一.Mybatis概述 1.1 Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了go ...
- 回顾Spring MVC_01_概述_入门案例
SpringMVC: SpringMVC是Spring为展现层提供的基于MVC设计的优秀的Web框架,是目前最主流的MVC框架之一 SpringMVC通过注解,让POJO成为处理请求的控制器,而无须实 ...
- 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_09.RequestMapping注解的属性
看下RequestMapping下面 一共有几个属性 那么属性用处不大 value和path互相为别名 这里用value表示path也是没有问题的 只有一个属性,并且属性名称叫做value那么就可以省 ...
- 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_08.RequestMapping注解的作用
用于建立请求URL和处理请求方法之间的对应关系. 增加一个testResuqestMapping方法来测试 把注解放在类上 服务器重新部署 再次重新部署 这次就可以请求到数据 了 注解放在类上:用来表 ...
- 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_07.入门案例中使用的组件介绍
这里配置上注解的支持,相当于配置了上面的前端控制器.处理映射器这两个
- 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_06.入门案例的流程总结
配置了load-on-startup等于1 表示启动了服务器就会去创建DispatcherServlet 如果不配置load-on-startup为1 那么第一次发送请求才会去创建Dispatcher ...
- 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_05.入门程序之入门代码编写
先把默认的index.jsp删掉.默认的index.jsp没有jsp的声明 ok webapp文件夹下new一个 起名叫做index.新建的页面有jsp的头 创建控制器类 java下新建一个class ...
- 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_04.入门程序之搭建开发环境
选择骨架构建 默认选中next-然后finish后就会去网上下载插件.会比较耗费时间. 添加一组键值对: archetypeCatalog internal 添加了这组坚持对,就可以解决Mavn项目创 ...
- 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_03.入门程序之需求分析
随机推荐
- 51Nod--1085背包问题
1085 背包问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2--Wn(Wi为整 ...
- js 判断是否为数组的方式 及 类数组转换成数组格式
1. 判断是否为数组的通用方式 Object.prototype.toString.call(o)=='[object Array]' 其他方式: typeof , instanceof, ary ...
- 基于‘BOSS直聘的招聘信息’分析企业到底需要什么样的PHP程序员
原文地址:http://www.jtahstu.com/blog/scrapy_zhipin_php.html 基于'BOSS直聘的招聘信息'分析企业到底需要什么样的PHP程序员 标签(空格分隔): ...
- java 中Map 使用
Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复.所以通过指定的key就可以取出对应的value.Map接口定义了如下常用 ...
- LeetCode90:Subsets II
Given a collection of integers that might contain duplicates, nums, return all possible subsets. Not ...
- myeclipse tomcat java.lang.OutOfMemoryError: PermGen space错误的解决方法
错误代码: java.lang.OutOfMemoryError: PermGen space 原因分析: myeclipse或tomcat的内容分配的不够用,启动失败 解决方法: 1.找到tomca ...
- jQuery 学习笔记(三)——事件与应用
页面载入时触发ready()事件 ready()事件类似于onLoad()事件.但前者仅仅要页面的DOM结构载入后便触发.而后者必须在页面所有元素载入成功才触发,ready()能够写多个,按顺序运行. ...
- 十五、Spring Boot 环境变量读取 和 属性对象的绑定
凡是被spring管理的类,实现接口 EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,获取到系统环境变量和application配置文件中的变量. 如: @ ...
- Mesos初步尝试
记得几年前,用.net做分布式批处理的时候环境搭建很麻烦,虽然参数的分片算法.配置都搞定了,但是.net虚拟机的环境建立是个头疼的事: 节点要自己手工建 环境变量没法从前往后传递 批处理程序改动后的分 ...
- Hadoop:Rack Awareness
副本的放置对HDFS可靠性和性能至关重要. 优化副本放置HDFS有别于其他大多数分布式文件系统. 这是一个功能,需要大量的调优和经验. 基于机架感知(rack awareness)的副本放置策略的目的 ...