JavaEE架构介绍
分层
- 客户端
- Web层
- 业务层
- 持久层
ssh对应的层级
- hibernate:持久层技术
- struts2: Web层技术
- spring: 业务层,跨所有层的整合技术
技术分析图
Hibernate相关概念
介绍
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。
Hibernate帮助程序员通过操作对象的方式来操作数据库表记录
ORM的概念
ORM:Object Relational Mapping.
是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的–“虚拟对象数据库”。O: Object对象,面向对象语言领域,Java中的JavaBean
R: 关系数据库领域的Relational(数据库中表的结构)
M: 映射Mapping(XML的配置文件)
优点
- Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
- Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作
- Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系
Hibernate环境搭建步骤
1. 下载Hibernate环境资源
2. 导入Hibernate环境必要的jar包
- hibernate的必须jar
- 数据库驱动的jar
3. 创建数据库表结构
drop database hibernate_01;create database hibernate_01;use hibernate_01;CREATE TABLE `hibernate_1`.`t_user`( `u_id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, `u_name` VARCHAR(32) NOT NULL , `u_age` INT(16));
4. 编写数据bean
public class User { private Integer u_id; private String u_name; private int u_age;}
注意:
需要给数据bean中对应表中主键的属性设置为对象类型,且必须实现序列化接口。 需要提供getter和setter方法。
5. 配置映射文件
映射文件的作用就是将数据bean和表结构建立关系
- 命名规范问题:hibernate命名以
类名.hbm.xml
方式命名。- 新建位置规范:通常和java类放到同一个包中。
- dtd头的导入: org.hibernate 的包中有对应的dtd头。
- 在配置关系过程中,几乎所有的name属性指向的都是Java类,column和table指向数据库表。
6. 配置核心启动文件
org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql:///hibernate_setup root 123456
- 命名规范要求:以
hibernate.cfg.xml
方式命名- 新建位置规范:放到src目录中,也就是classpath路径(类根路径)
- dtd头的导入: org.hibernate 的包中有对应的dtd头。
7. 编写程序访问数据库
// 新建一个Hibernate的配置对象,其实就是去模拟hibernate.cfg.xmlConfiguration configuration = new Configuration();// 加载解析hibernate.cfg.xmlconfiguration.configure();// 创建一个SessionfactorySessionFactory factory = configuration.buildSessionFactory();// 通过工厂创建一个和数据库连接的会话Session session = factory.openSession();// 开启事务Transaction transaction = session.beginTransaction();User user = new User();user.setU_name("张三疯");user.setU_age(11);//不需要再通过sql去保存用户,直接用对象保存用户session.save(user);transaction.commit(); //释放资源session.close();
Hibernate工具
下载JBoos Tools
下载对应版本JBoss Tools
eclipse安装插件
Help
–>Install New Software
–>add
- 在打开的对话框中
Location
后点击Archive
,选择下载的JBoss Tools的压缩包
- 在对话框中只勾选
Hibernate Tools
- 下一步直到完成重启
工具开发提供的便利
- 自动生成核心启动文件
- 自动生成映射关系
Hibernate映射配置
class标签
- 用来描述Java类和数据库表的对应关系
- name属性:Java类的类名
- table属性:数据库表的表名
id标签
- 用来描述java类中属性和数据库表的主键的关系
- name属性:java类中属性名称
- type属性:描述java类中属性的类型,hibernate会根据此类型生成对应数据库列的数据库类型
- column属性或标签:数据库表中的主键的列名
- generator标签:描述主键的生成策略
properties标签
- 用来描述java类中其他属性和数据库表的其他列的关系
- name属性:java类中属性名称
- type属性:描述java类中属性的类型,hibernate会根据此类型生成对应数据库列的数据库类型
- column属性或标签:数据库表中的主键的列名
Hibernate核心启动配置
整个核心配置在hibernate.properties中可以找到
必须配置
通过property标签进行配置: 方言
,驱动
,地址
,帐号
,密码
映射配置
通过mapper标签进行配置
选配
通过property标签进行配置
- 日志显示:hibernate.show_sql
- 日志格式化:hibernate.format_sql
- 数据库DDL的自动生成:hibernate.hbm2ddl.auto
- create-drop:几乎不用。先删除,再创建,再删除。
- create:测试用例中用。先删除,再创建。
- update:开发中用。没有就创建,有就不创建。对新增的列进行维护。
- validate:开发稳定后用。校验表结构。
补充
- DDL: Data Definition Language。数据库声明语言。 使用了
CREATE
,ALTER
,DROP
,TRUNCATE
,COMMENT
,RENAME
关键字。- DML:Data Manipulation Language。数据库操作语言。 使用了
SELECT
,INSERT
,DELETE
,UPDATE
关键字。- DCL: Data Control Language。数据库权限控制语言。 使用了
GRANT
,REVOKE
关键字。- TCL:Transaction Control Language。事务控制语言。 使用了
SAVEPOINT
,ROLLBACK
,COMMIT
关键字。
日志集成
日志介绍
- JCL:规范。Java common logger。
- SLF4J:规范。Simple Logger fade for Java。
- log4j:实现。
规范的出现是因为在一个程序中多个框架用到了不同的日志系统,日志杂乱。规范提供统一解决方案。
规范和实现的整合,需要中间整合桥梁。
Log4j与slf4j集成步骤
- 导入jar
- slf4j-api-x.x.x.jar : 规范接口jar
- slf4j-log4j12-x.x.x.jar : log4j与Slf4j整合的jar
- log4j-x.x.x.jar : log4j实现日志规范的jar
- 在src目录下编写log4j.properties配置文件
##设置日志记录到控制台的方式log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.errlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n##设置日志记录到文件的方式log4j.appender.file=org.apache.log4j.FileAppenderlog4j.appender.file.File=c\:mylog.loglog4j.appender.file.layout=org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n##日志输出的级别,以及配置记录方案log4j.rootLogger=info, stdout, file
3.代码中调用Log4j
- 初始化(引入的包为slf4j的,使用规范接口编程)
Logger logger = LoggerFactory.getLogger(Clazz);
- 调用
logger.trace();logger.debug();logger.info();logger.warn();logger.error();
- 初始化(引入的包为slf4j的,使用规范接口编程)
日志级别
- trance
- debug
- info
- warn
- error
- fatal
Log4j日志配置规则介绍
- 日志记录器:rootLogger
- 日志输出源:appender
- 日志布局器:layout
Hibernate核心类
Hibernate运行流程介绍
Configuration类
Configuration configuration = new Configuration();configuration.configure();
- 用于配置并且启动Hibernate框架。
- Hibernate框架通过该对象来获得对象-关系映射文件中的元数据,以及动态配置Hibernate的属性。
- 可以创建SessionFactory对象。
Configuration配置
-
加载配置文件的种类,Hibernate支持xml和properties类型的配置文件,在开发中基本都使用XML配置文件的方式。
如果采用的是properties的配置文件,那么需要通过
Configuration configuration = new Configuration(); configuration.addResource("com/itheima/domain/XX.hbm.xml")
手动进行加载,比较麻烦,不推荐使用
SessionFactory
由Configuration通过加载配置文件创建该对象
- 工厂类,用于创建生成Session对象
- SessionFactory对象中保存了当前的数据库配置信息和所有映射关系
- SessionFactory对象中保存了预定义的SQL语句。
预定义可以提示代码效率,同时准备会耗时,也会占用内存
- 数据库方言常用sql
- 常见的SQL语句是增删改查(通过主键来查询)
- SessionFactory负责维护Hibernate的二级缓存。
- 一个SessionFactory实例对应一个数据库,应用从该对象中获得Session实例。
- SessionFactory是线程安全的,意味着它的一个实例可以被应用的多个线程共享。
- SessionFactory是重量级的,意味着不能随意创建或销毁它的实例。如果只访问一个数据库,只需要创建一个SessionFactory实例,且在应用初始化的时候完成。
- SessionFactory需要一个较大的缓存,用来存放预定义的SQL语句及实体的映射信息。另外可以配置一个缓存插件,这个插件被称之为Hibernate的二级缓存,被多线程所共享.
Transcation
负责事务管理
-
常用API
- commit():提交事务
- rollback():回滚事务
-
特点
- Hibernate框架默认情况下事务不自动提交.需要手动提交事务
- 如果没有开启事务,那么每个Session的操作,都相当于一个独立的事务
- 每段事务操作都是隐含着异常的,需要手动添加try catch
Session
-
特点
- Session是在Hibernate中使用最频繁的接口。也被称之为持久化管理器。它提供了和持久化有关的操作,比如添加、修改、删除、加载和查询实体对象
- Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心
- Session是线程不安全的
- 所有持久化对象必须在 session 的管理下才可以进行持久化操作
- Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久化操作的数据都缓存在 session 对象处
- 持久化类与 Session 关联起来后就具有了持久化的能力
-
常用的方法
- save(obj): 保存数据
- delete(obj): 删除数据
- get(Class,id): 通过主键查询该条记录
- update(obj): 修改数据
- saveOrUpdate(obj): 保存或者修改
- createQuery(String hql): 查询所有的数据
C3P0连接池集成
- 导入Jar包
- 配置hibernate启动配置文件
org.hibernate.c3p0.internal.C3P0ConnectionProvider 5 20 120 120 120 2 false