https://study.163.com/course/courseMain.htm?courseId=1004377001
对网易云课堂hibernate课程的文字总结:
一、javaEE的三层结构:
1、web层:视图层;
用到struct2框架
2、service层:业务逻辑层;
用到spring框架
3、dao层:持久化层;
用到hibernate框架
用来对数据库进行增删改查crud操作;
二、MVC思想:分层
1、m:模型
2、v:视图
3、c:控制器
三、Hibernate概述:
1、是什么?
1.1什么是框架?
写程序,使用框架之后,帮我们实现一部分功能。使用框架好处,少写一部分代码实现功能
1.2 什么是hibernate框架(重点记住)?
hibernate框架应用在javaee三层结构中dao层框架
在dao层里面做对数据库crud操作,使用hibernate实现crud操作,hibernate底层代码就是jdbc,hibernate对jdbc进行封装。使用hibernate好处,不需要写复杂jdbc代码了,不需要写sql语句实现。
hibernate开源轻量级的框架:免费,源代码是开放的,不需要依赖其他东西,就可以直接来使用。
hibernate版本:hibernate3.x;hibernate4.x:现在不去用,该版本是过度版本;hibernate5.x:现在在用;
其中lib:hibernate相关jar包;
1.3hibernate思想:对db进行crud操作
即什么是orm思想 ?
hibernate使用orm思想对数据库进行crud操作;
在web阶段学习的javabean,javabean更正确的叫法,叫做实体类。
orm:用到实体类,O:object ;R:relational;M:mapping;对象关系映射。
即hibernate用orm对象关系映射思想来对数据库进行crud操作;
对象关系映射:
(1)让实体类和数据库表进行一一对应关系;
让实体类首先和数据库表对应;比如:user类和user表
让实体类属性和表里面的字段对应;
(2)不需要直接操作数据库表,而操作表对应的实体类对象即可;
画图说明:
在框架阶段要用配置文件完成很多功能;
知识点:
jdbc:加载驱动、创建连接,预编译,执行.......
javabean可以封装数据,javabean写法规范:属性是私有的,私有属性有公开的get,set方法;javabean更正确的叫法,叫做实体类。
2、能做什么
3、怎么来做;
4、为什么能做
四、hibernate入门:
1、搭建hibernate环境:
hibernate用到dao层框架,可以单独使用;所以可以建立java project;也可以建立成web project;
1.1创建java project项目
预期目录结构:
1.2导入hibernate的jar包:
要知道在什么里面找到的hibernate的lib的require
jpa是规范也得导入;
导入其他日志jar包,因为使用hibernate时候,有日志信息输出,hibernate本身没有日志输出的jar包。
下载链接:http://archive.apache.org/dist/logging/log4j/
slf4j下载链接:http://repo2.maven.org/maven2/org/slf4j/
http://repo2.maven.org/maven2/org/slf4j/slf4j-log4j12/1.7.2/
mysql驱动:https://mvnrepository.com/artifact/mysql/mysql-connector-java/5.0.4,做jdbc时用
1.3创建实体类,即Javabean
(1)使用hibernate时,不需自己手动创建表,hibernate帮把表创建;即只需创建数据库即可。
完整的实体类为:
package cn.itcast.entity;
public class User {
/*hibernate要求实体类有一个属性唯一的*/
private int uid;
private String username;
private String password;
private String address;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
1.4配置实体类和数据库表一一对应关系(映射关系)
(1)使用配置文件实现映射关系
(1.1)创建xml格式的配置文件
映射配置文件名称和位置没有固定要求
建议:在实体类所在的包里创建,实体类名称.hbm.xml
(2)配置文件是xml格式,在配置文件中首先引入xml约束;
在hibernate里面引入的约束dtd约束。
在目录:hibernate-release-5.0.7.Final\hibernate-release-5.0.7.Final\project\hibernate-core\src\main\resources\org\hibernate下
找到约束,粘贴到配置文件中即可。
(3)配置映射关系(重点)
<?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>
<!-- 1.配置类和表对应
class标签
name属性:实体类的全路径;包名
table属性:数据库表名称
-->
<class name="cn.itcast.entity.User" table="t_user">
<!-- 2.配置实体类id和表id对应
hibernate要求实体类有一个属性唯一值
hibernate要求表有字段作为唯一值
-->
<!-- id标签
name属性:实体类里面id属性名称
column属性:生成的表字段名称
name和column的值可不一样
-->
<id name="uid" column="uid">
<!-- 设置数据库表id增长策略
native:生成表id值就会是主键自动增长
-->
<generator class="native"></generator>
</id>
<!-- 配置其他属性和表的字段的对应
name属性:实体类属性名称
column属性:生成表字段名称
-->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>
1.5创建hibernate的核心配置文件
数据库的配置
(1)核心配置文件的格式xml,核心配置文件名称和位置固定的
位置:必须在src下
名称:必须hibernate.cfg.xml
(2)引入dtd约束
(3)核心配置文件中做些相关配置
hibernate操作过程中,只会加载核心配置文件,其他配置文件不会加载;所以要想加载其他配置文件,只能将其他配置文件添加到核心配置文件中。
(3.1)配置数据库的信息
properties文件路径:hibernate-release-5.0.7.Final\hibernate-release-5.0.7.Final\project\hibernate-spatial\databases\postgis\resources
(3.2)配置hibernate的信息
(3.3)把映射文件放到核心配置文件中
ddl:数据定义语言;建表create,就是数据定义语言;
完整 的配置文件内容为:
<?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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 第二部分:配置hibernate的信息 可选的-->
<!-- 输出底层SQL语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 输出底层SQL语句 进行格式化 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate帮 创建表,需要配置之后
update:如果已经有表,更新,如果没有,创建表
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--配置数据库方言
在MySQL中实现分页,关键字limit,只能使用在mysql中
在oracle数据库,实现分页rownum
让hibernate框架识别不同数据库自己特有的关键字或者语句
-->
<property name="hibernate。dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 第三部分:把映射文件放到核心配置文件中 必须的-->
<mapping resource="cn/itcast/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
1.6实现添加操作,测试
(1)加载hibernate核心配置文件
(2)创建SessionFactory对象
Session的工厂,为了创建Session;
(3)使用SessionFactory来创建Session对象
注意:此时的Session跟http中的Session是没有任何关系的
(4)开启事务
建议,手动做事务的操作
(5)写具体逻辑crud操作
(6)提交事务
(7)关闭资源(有连接)
(1-4是固定的,5是变化的,6-7是固定的)
运行:在单元测试方法名上右击鼠标--->Run As---->JUnit Test
观察:console
package cn.itcast.hibernatetest;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.itcast.entity.User;
public class HibernateDemo {
@Test
public void testAdd() {
/*(1)加载hibernate核心配置文件
在hibernate里面封装对象
到src下面找到名称是hibernate.cfg.xml文件,
加载到下面Configuration对象中去。
*
*/
Configuration cfg=new Configuration();
cfg.configure();
/*(2)创建SessionFactory对象
* 读hibernate核心配置文件内容,创建SessionFactory
* 在过程中,根据映射关系,在配置数据库里面把表创建
*/
SessionFactory sessionFactory=cfg.buildSessionFactory();
/*(3)使用SessionFactory来创建Session对象
* 类似于jdbc连接
*/
Session session=sessionFactory.openSession();
/*(4)开启事务
*
*/
Transaction tx=session.beginTransaction();
/*(5)写具体逻辑crud操作
* 添加功能
*/
User user=new User();
user.setUsername("小王");
user.setPassword("250");
user.setAddress("日本");
//调用session对象完成添加
session.save(user);
/*(6)提交事务
*
*/
tx.commit();
/*(7)关闭资源(有连接)
*
*/
session.close();
sessionFactory.close();
}
}
看到效果:
(1)是否生成表
(2)表里面是否有记录
知识点:
xml约束有哪些?有,dtd、schema。在hibernate里面引入的约束dtd约束。
ctrl+shift+t:搜索某个类
事务:操作中的基本单元,多个操作要么都成功,要么都失败。
JUnit是java中的单元测试;
五、hibernate配置文件的详解:
1、映射配置文件hibernate.hbm.xml
(1)映射配置文件和位置没有固定格式
(2)映射配置文件中,标签name属性值写实体类相关内容
(2.1)class标签name属性值实体类全路径
(2.2)id标签和property标签name属性值实体类属性名称
(3)id标签和property标签中,column属性是可以省略的,其值默认为name属性值
(4)property标签type属性,设置生成表的字段的类型,hibernate自动生成对应的类型。
2、核心配置文件hibernate.cfg.xml
(1)配置写位置要求
(2)配置三部分要求
(2.1)数据库部分是必须的
(2.2)hibernate部分是可选的
(2.3)映射文件必须的
(3)核心配置文件名称和位置固定的
(3.1)位置:src下面
(3.2)名称:hibernate.cfg.xml
六、hibernate的api
1、Configuration
到src下面找到名称是hibernate.cfg.xml配置文件,创建对象,把配置文件放到对象里面(加载核心配置文件)。
2、SessionFactory(重点)
(1)使用Configuration对象来创建SessionFactory对象
在创建SessionFactory对象过程中做事情:
根据核心配置文件中,有数据库配置,有映射文件部分,到数据库里面根据映射关系把表创建。
(2)创建SessionFactory过程中,这个过程特别耗资源
(2.1)在hibernate操作中,建议一个项目一般创建一个SessionFactory对象。所有人用的都是统一的这个对象。
(3)具体实现
(3.1)写工具类,写静态代码块实现,(类加载时执行,执行一次)
静态代码块在类加载时候执行,执行一次
注意:web项目中,不需要关闭session,因为第一次关闭session后,第二次再用就会得不到session。
3、Session(重点)
(1)session类似于jdbc中的connection
(2)调用session里面不同的方法来实现crud操作
(2.1)添加save方法
(2.2)修改update方法
(2.3)删除delete方法
(2.4)根据id查询get方法
(3)session对象最大特点:单线程对象(该对象只能自己用,别人不能跟我共用)
(3.1)session对象不能共用,只能自己使用。
比如360安全卫士打开是个进程,其中的电脑清理、优化加速都是每个线程,当优化加速在执行时,不能接着再点击优化加速;即单线程
4、Transaction
(1)事务对象
(2)事务提交和回滚方法
tx.commit()
tx.rollback();
(3)事务概念
事务特性:原子性,一组操作要么都成功,有一个失败,就都失败;一致性:操作之前之后数据总量没变化;隔离性:多个事务同时操作同条记录;他们之间不受影响;持久性,当提交数据库中是否生效了;
七、解决配置文件没有提示问题
1、可以上网:找到约束,帮助提示
2、为什么没有提示呐?
就是因为找不到配置文件中的约束条件
解决方法:把约束文件引入到eclipse中;
在windows菜单中选择Preference
然后:
(1)在配置文件中复制一句话
http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd
(2)
(3)重启eclipse开发工具
ALT+/:提示写代码
八、实验过程中出现的错误:
Attribute "column" must be declared for element type "properties".
在hibernate.hbm.xml文件中:
改为: