SSH框架的介绍
什么是框架
* 框架是软件的半成品,其完成大部分的通用功能,我们程序员只需要实现自己的业务即可。(提高开发效率),学习框架就是学习api和配置文件
了解web开发中,mvc模型组成:
M:model层,javaBean+jdbc
V:view层,jsp
C:control层,servlet
SSH框架
* * SSH = Struts2 + Spring + Hibernate
* * SSM = SpringMVC + Spring + Mybatis
总结:
- SSH3个框架,分别对应开发的web层,service层,dao层三层,从而形成一个整体(套装)。
- SSH,比较老的。SSM,比较新的。
- 框架:都是降低运行效率,提高开发效率的(代码少)。硬件的成本越来越低,人力的成本,越来越高。
hibernate的概述
hibernate的定义
Hibernate可以应用在任何使用JDBC的场合,即可以在Java客户端程序使用,也可以在Servlet/jsp的web应用中使用。
*
* 是一个持久层的框架
* 是一个ORM(Object Relational Mapping)框架
* 对jdbc的封装(记忆)
*
* 说明hibernate的底层是依赖于jdbc的。jdbc是java数据库与java世界沟通的桥梁
* 用面向对象的思想,操作关系型数据库(理解)
(持久层:参与持久化操作的层,即dao层,推广到计算机就是把容易腐败的数据(内存的数据),长期保存的操作,就是存储到了硬盘、数据库、云盘,从而成为持久化)
ORM(重点) - 对象关系映射
Ojbect relational mapping,对象关系映射,java对象与关系型数据库的映射。映射:指的是对应关系。
hibernate常见版本介绍
3.x ,4.x, 5.x
版本4用的人很少,因为和以前的3.x的版本的API,不兼容
hibernate入门案例
聊聊入门案例的步骤
a. 建表
b. javabean编写
c. 导入包
d. 页面
e. 编写映射文件
f. 使用hibernate的API写代码
实现步骤:
1. 创建工程(java工程或者web工程)
* 使用java工程
导入hibernate的所需jar包 (10+1个)
a. hibernate所需的:
b. mysql的jdbc驱动创建表
- user表
创建javaBean
- User类
创建映射文件
a. 作用: 处理表与类的关系
b. 位置:理论上任意,推荐:和对应的类放在同一个包下
c. 名字:理论上任意,推荐:类名.hbm.xml –>User.hbm.xml
d. 约束:hibernate-core-5.0.7.Final.jar\org.hibnerate\hibernate-mapping-3.0.dtd
<?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">
这部分代码如何找!!!
工程下面:Referenced Libraries -- hibernate-core-5.1.8.final.jar -- (第一个)org.hibernate
--(倒数4个)hibernate-mapping-3.0.dtd
6 创建核心配置文件(hiberante自身的配置文件)
a. 作用:配置hibernate本身
b. 位置:理论上任意,推荐:src下
c. 名字:理论上任意,推荐:hibernate.cfg.xml
d. 约束:hibernate-core-5.0.7.Final.jar\org.hibnerate\hibernate-configuration-3.0.dtd
<?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">
这部分代码如何找!!!
工程下面:Referenced Libraries – hibernate-core-5.1.8.final.jar – (第一个)org.hibernate
–(倒数4个)hibernate-configuration-3.0.dtd
7 hibernate的使用(7步曲)
//1. 创建配置对象
Configuration configuration = new Configuration();
configuration.configure(); // 加载hibernate.cfg.xml
//2. 创建SessionFactory对象
SessionFactory sf= configuration.buildSessionFactory();
//3. 获取session
Session session =sf.openSession();
//4. 开启事务, transaction事务对象
Transaction transaction= session.beginTransaction();
//5. 实际的业务(模拟用户注册)
User user = new User();
user.setName("admin");
user.setPassword("123");
session.save(user);
//6. 事务提交
transaction.commit();
//7. 释放资源
session.close();
sf.close();
细节
1. 如何导入约束文件:见《eclipse导入约束的操作.docx》
- 记住要配置主键生成策略:
<generator class="native"></generator>
3.建表的时候,主键必须有auto_increment.
4.类的全限定名称:”cn.itcast.domian.User” 不是”cn/itcast/domain/User.java”
hibernate配置文件样板:
1)映射配置文件
User.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>
<!-- 建立类和数据表的映射关系 -->
<class name="com.itheima.domain.User" table="USER">
<!-- 建立类中属性与数据库表中主键的映射关系 -->
<id name="uid" column="uid">
<!-- 主键生成策略 -->
<generator class="native"></generator>
</id>
<!-- 建立类中普通属性与数据库表中字段的映射关系 -->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
</class>
</hibernate-mapping>
2)hibernate核心配置文件
<?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>
<!--1. 连接数据库的参数 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/day38_hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!--2. hiberntae自身的特色:方言 : 指定底层的数据库是那个-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--3. 加载映射文件 User.hbm.xml -->
<mapping resource="com/itheima/domain/User.hbm.xml"/>
</session-factory>
hibernate配置文件的介绍
配置文件1:映射配置文件 – (类名.hbm.xml)
class标签:表与javaBean的映射关系
name: javaBean的全路径名称
table:对应的表的表名(细节:如果名称与javaBean名称相同,可以省略,但不建议省略)
catalog: 指定表所在数据库的名字
id标签:完成主键字段的映射
name: 类中表示主键的属性的名称
column:表中主键的字段名称(细节:如果和name名称相同,可以省略)
type: 类型,java类型或者hibernate类型 (用于hiberante自动建表 )
以int为例, java类型:java.lang.Integer hibernate类型:integer
length:长度 (用于hiberante自动建表 )
property标签:完成普通字段的映射
name: 类中表示普通字段的属性的名称
column:表中普通字段的字段名称(细节:如果和name名称相同,可以省略)
type: 类型,java类型或者hibernate类型(默认) (自动建表时使用 )
java:java.lang.Integer hibernate:integer
length:长度(自动建表时使用 )
not-null:非空约束 (自动建表时使用 )
unique:唯一约束 (自动建表时使用 )
配置文件2:核心配置文件 (hibernate.cfg.xml)
1. 连接数据库的参数配置
<!--1. 连接数据库的参数 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/day38_hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
- 自身的参数
a. 必选:方言配置(重点关注)
<!--2. hiberntae自身的特色:方言 : 指定底层的数据库是那个-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
* 指定底层的数据库。自动生成sql语句。
* 优点:针对性的生成SQL,实现跨数据库特性。
* 现在有个项目,从mysql数据库,迁移到oracle数据库。
* 不同的数据库,sql语句存在差异。最明显的差异:分页语句不同。
* mysql: select * from user limit 5,5; 6--10
* oracle: select a.* from (select rownum as num, * from user where rownum <=10) a where num >=5;
* hibernate,利用sql语句,是自己生成的特性。你要实现分页,不用sql语句。你就调用一个方法:分页(5,5 );
b. 可选:(部分)
(1) 显示并格式化sql语句–sql依然存在,不过是hibernate自动生成。
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
(2) hibernate自动建表
<!-- 可选:是否自动建表
none:默认值
create:启动时,自动建表(测试)
create-drop:启动时,自动建表,关闭时,自动销毁表(测试)
update:没有表的时候,自动建表。有表,使用原来的表。如果表结构不匹配,更新表结构
validate:不会自动建表。如果有表,检查表的结构,如果,不匹配,报错。
<property name="hibernate.hbm2ddl.auto"></property>
- 加载映射文件(有多少个映射文件写多少行)
<mapping resource="cn/itcast/domain/Customer.hbm.xml"/>
配置文件【总结】
1. 重点理解“方言”,其实现跨数据库的特性。例如:项目从mysql数据库,迁移到oracle数据库,代码无需修改,只需要修改方言配置即可。
- 自动建表:工作中,肯定配置为:none
hibernate4个核心对象的关系图
就是使用过程中七步曲中使用的核心对象
hibernate核心API:Configuration对象
用途:加载核心配置文件。
API介绍
(1) configure():–无参,默认加载src下hibernate.cfg.xml核心配置文件
(2) configure(String resource): –加载自定义名字(非hibernate.cfg.xml)的核心配置文件
(3) addResource(String resourceName):–加载的映射文件
(4) SessionFactory buildSessionFactory():–用于创建SessionFactory对象
hibernate核心API:SessionFactory对象(最重要的知识点)
1. SessionFactory概述
(1) Session工厂对象,用于创建Session对象。
(2) sessionFactory对象,是线程安全的。
(3) 不是轻量级的,创建这个对象的成本很高。一个web项目只需要创建一个即可。
(4) 本质:对jdbc中数据库连接池的封装。类似于jdbc中的数据源(数据库连接池)
(5) 维护了hibernate二级缓存。(见明天内容)
2 API介绍
* openSession(): –获取session对象
* getCurrentSession():–获取与当前线程绑定的session.(明天讲解)
3 抽取工具类–不是轻量级的,一个项目只需要创建一个即可。(jdbc:连接池)
* 方法和思路(详解源码)—编程技能
4 整合c3p0流程(hiberante官方推荐连接池技术)
* hibnerate有一个内置的连接池,不过是玩具级别的。实际开发中,使用hibernate官方推荐的连接池技术c3p0。
a.补充–增加日志
- 增加jar包:log4j日志文件夹下的 (3个jar包都需要)
- 增加log4j的配置文件,直接扔到src目录下面即可
b.加载c3p0的jar
- 加载3个jar.位置:必须资料\jar包整理\c3p0数据库连接池*.jar
- c.增加c3p0的配置(写在核心配置文件中)
<!--c3p0的配置-->
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!--在连接池中可用的数据库连接的最少数目 -->
<property name="c3p0.min_size">10</property>
<!--在连接池中所有数据库连接的最大数目 -->
<property name="c3p0.max_size">30</property>
<!--设定数据库连接的过期时间,以秒为单位,
如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
<property name="c3p0.idle_test_period">3000</property>
hibernate核心API:Session对象
概述
a. 执行CRUD的主体(增删改查)
b. hibernate与数据库交互的桥梁。(类似jdbc中Connection对象)
c. 线程不安全的对象。API介绍
a. Serializable save(Ojbect obj); –保存
b. T get(Class class, Serializable id); –查询
c. T load(Class class, Serializable id);–查询
d. void update(Object obj);–修改
* 推荐:先查询,后修改
e. void delete(Object obj);–删除
* 推荐:先查询,后删除,但是原因,后面讲级联操作的时候,才会体会
User user = new User();
user.setUsername("测试");
user.setPassword("123");
session.save(user);
System.out.println("增加成功=======");
User user2 = session.get(User.class, 3);
System.out.println(user2);
System.out.println("查找成功成功=======");
user2.setUsername("测试2");
session.update(user2);
System.out.println("修改成功=======");
session.delete(user2);
System.out.println("删除成功=======");
4 API使用总结
a. 增删改查,4个操作
b. 4个方法,都依赖于主键(id)。
c. 更新和删除操作前,推荐先查询。其中删除操作,需要后面级联的时候,才会体现。
例如:
User user = session.load(User.class, 2);
user.setUsername("测试");
session.update(user);
5 get和load的异同(面试题)
a. get方法:立即加载策略:执行get,立即发送SQL查询语句。
b. load方法:延迟加载(懒加载):执行load,不会发送sql语句;真正使用数据的时候,才发送sql查询语句。
c. 查询不到数据是,get方法的错误是:java.lang.NullPointerException
load方法的错误是:org.hibernate.ObjectNotFoundException
hibernate核心API:Transcation对象
概述
- hibernate封装的处理事务的对象。
- 通过session来创建Transcation对象,说明与session对象密切相关。
API介绍
a. Transcation transaction = session.beginTransaction(); // 事务对象的创建方式
b. commit(): // 事务提交
c. rollback(): // 事务回滚
抽取Hibernate工具类:
public class HibernateUtils {
private static SessionFactory sessionFactory;
private static Configuration configuration;
static {
configuration = new Configuration();
configuration.configure();
sessionFactory = configuration.buildSessionFactory();
}
/**
* @Title: HibernateUtils.java
* @Description: TODO(获得session对象)
* @return
* @author jjizh
* @date 2017年7月26日 下午8:07:59
* @version V1.0
*/
public static Session openSession(){
return sessionFactory.openSession();
}
}
下述抽取方法的问题:
问题:线程不安全,如果第一个线程进入之后,判定sf为空,就回去创建sessionFactory,此时如果又有一个线程进入的话,那么还是判定sf为空,就又回去创建一个sessionFactory,那么就无法做到只创建一个sessionFactory了
附加内容
类型对照表(部分): Hibernate映射类型和java类型的对照表
sql语句的分类
- DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库database、表table,列column等。关键字:创建create, 修改alter, 删除drop等(结构)
- DML(Data Manipulation Language):数据操作语言,用来对数据库中表的记录进行更新。关键字:插入insert, 删除delete, 更新update等(数据)
- DQL(Data Query Language):数据查询语言,用来查询数据库中表的记录。关键字:select, from ,where等。
- DCL(Data Control Language):数据控制语言,用来定义数据库的访问权限和安全级别及创建用户;关键字:grant等