JAVAWEB开发之Hibernate详解(一)——Hibernate的框架概述、开发流程、CURD操作和核心配置与API以及Hibernate日志的使用

本文详细介绍了Hibernate框架,包括其概念、为何学习、版本信息以及日志记录。通过Log4J技术,展示了如何进行日志调试。接着,逐步引导读者进行Hibernate的快速入门,包括下载、配置、环境搭建、CRUD操作。还深入讨论了Hibernate的配置、核心API,如Configuration、SessionFactory、Session、Transaction、Query和Criteria接口。最后,文章探讨了持久化配置、对象标识和主键生成策略。
摘要由CSDN通过智能技术生成

Hibernate框架概述

什么是Hibernate?

 框架:软件的半成品,完成部分代码的功能。
Hibernate:Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思想来操作数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序中使用,也可以在Servlet/JSP的web应用程序中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

为何要学习Hibernate?

Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的ORM实现,它很大程度的简化了dao层编码工作。
HIbernate使用Java的反射机制,而不是字节码增强程序类实现透明性。
Hibernate的性能非常好,因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。
ORM:Object Relational Mapping 对象关系映射
 传统方式开发:
  •  持久层:
  •  编写SQL.执行SQL. String sql = “insert into 表 values (?,?,?...)”;
  •  开发语言Java:面向对象.
  •  数据库:MySQL(关系型的数据库.)
  •  将Java中的实体类与数据库的关系表建立一个映射.就可以操作Java中对象,从而操作数据库.
Hibernate就是一个持久层的ORM的框架。
常见的持久层框架:
  • Hibernate:最流行的ORM框架,通过对象—关系映射配置,可以完全脱离底层SQL。
  • JPA:Java Persistence API. JPA通过JDK5.0注解或XML描述对象关系表的映射关系。(只有接口规范)
  • MyBatis:本是Apache的一个开源项目iBatis,支持普通的SQL查询,存储过程和高级映射的优秀持久层框架。
  • Apache DBUtils 、Spring JDBCTemplate
企业开发两种架构:
SSH:Struts2+Spring+Hibernate
SSI:SpringMVC+Spring+Ibatis

Hibernate版本:

Hibernate3.x版本和Hibernate4.x
企业中常用的还是Hibernate3.x

Hibernate日志记录

日志: 程序开发中的一些信息
常用信息输出:System.out.println(" ");
这种方式不好,原因如下:
如果输出的内容比较多,项目已经开发完毕,不想使用输出,需要输出每个类,将输出的代码注释。
日志:Hibernate中使用slf4j技术
slf4j:SLF4J,即简单门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。
  • 用于整合其他日志系统(在企业中常用的日志记录:log4J)
  • 是具体的日志记录方案

Log4J技术

开发中的日志操作
  • 开发阶段的调试信息
  • 运行时的日志记录(日志代码占代码总量的4%)
if (someCondition) {   
   System.out.println("some information.");
}
Hibernate中使用Log4J的步骤:
(1)导入Log4J的jar包apache-log4j-1.2.16(在Hibernate中使用时还需要导入slf4J的jar包)
在Hibernate中使用时需要单独下载SLF4J的jar包


(2)编写Property文件(log4J的配置信息)参考模板在如下位置
Hibernate_HOME/project/etc 示例中可以将log4j.properties文件拷贝出来进行修改放在项目中的classPath即src下

(3)在程序中获得logger对象,通过下列方法输出日志信息
  • public void debug(Object message);
  • public void info(Object message);
  • public void warn(Object message);
  • public void error(Object message);
利用信息级别确保日志信息在内容上和反映问题的严重程度上,是非常重要的。
  • fatal:非常严重的错误,导致系统终止。期望这类信息能立即显示在状态控制台上。
  • error:即普通错误,其它运行期错误或不是预期条件。期望这类信息能立即显示在状态控制台上。
  • warn:警告,使用了不赞成使用的API、非常拙劣的使用API,几乎就是错误,其它运行时不合需要和不合预期的状态但还没必要称为错误。期望这类信息能立即显示在状态控制台上。
  • info:普通信息。运行时产生有意义的事件。期望这类事件能立即显示在状态控制台上。
  • debug:系统流程中的细节信息。期望这类信息仅被写入log文件中。
  • trace:堆栈信息。期望这类信息仅被写入log文件中。
(4)配置文件(log4j.properties)
Log4J有三个主要部件:记录器(Loggers)、输出源(Appenders)、布局(Layouts)
组件简介:
记录器(loggers):用来配置日志输出级别,使用哪些输出源
  * 格式:记录器=级别,输出源1,输出源2...   
    如  log4j.rootLogger=info,stdout  info是日志级别,stdout是输出源名称
  * log4j提供日志级别 由高到低:fatal(致命错误)、error(普通错误)、warn(警告)、debug(调试)、trace(堆栈)
  * log4j记录日志时只会记录 配置级别以及更高级别的信息
输出源(appenders):在log4j中可以定义多个输出源(控制台、日志文件、邮件、数据库)
  * log4j.appender.输出源名称=实现类
  * log4j.appender.stdout=org.apache.log4j.ConsoleAppender  :控制台进行输出
  * log4j.appender.file=org.apache.log4j.FileAppender  :向文件进行输出
布局(Layouts) :在日志中都记录哪些信息
  * log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  :自定义布局
  * log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n  :自定义布局格式

示例如下:
log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern= %-4r [%t] %-5p %c %x - %m%n

配置时的注意事项:
注意1、log4j.properties被放置到ClassPath所指定的目录下。
注意2、log4j的日志记录的优先级分为FATAL、ERROR、WARN、INFO、DEBUG、TRACE或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来。

Log4J提供的输出源:
  • org.apache.log4j.ConsoleAppender(控制台)
  • org.apache.log4j.FileAppender(文件)
  • org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
  • org.apache.log4j.RollingFileAppender(文件到达指定大小时产生一个新文件)
  • org.apache.log4j.WriterAppender(将日志信息以流方式发送到任何地方)
Log4J提供的layout:
  • org.apache.log4j.HTMLLayout(以HTML表格形式布局)
  • org.apache.log4j.PatternLayout(可以灵活的自己指定布局模式)
  • org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
  • org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)
自定义布局的layout中的格式符:
%c:列出logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名称空间。假设当前logger的名字空间是"a.b.c"
  • %c  —> a.b.c
  • %c{2} —>b.c
  • %c{1} —>c
  • %20c(若名字空间长度小于20,则左边用空格填充)
  • %-20c(若名字空间小于20,则右边用空格填充)
  • %.30c(若名字空间长度超过30,截取多余字符)
  • %20.30c(若名字空间长度小于20,则左边用空格填充;若名字空间长度超过30,截取多余字符)
  • %-20.30c(若名字空间长度小于20,则右边用空格填充;若名字空间超过30,截取多余字符)
%C:列出调用logger的类的全名(包含包路径),假设当前类是"org.apache.xyz.SomeClass"
  • %C —>org.apache.xyz.SomeClass    %C{2}—>xyz.SomeClass
%d:显示日志记录时间,{<日期格式>}  使用ISO8601定义的日期格式
  • %d{yyyy/MM/dd HH:mm:ss,sss} —> 2005/10/12 22:23:30,117
  • %d{ABSOLUTE} —> 22:23:30,117
  • %d{DATE} —> 12 Oct 2005 22:23:30,117
  • %d{ISO8601} —> 2005-10-12 22:23:30,117
%F:显示调用logger的源文件名  %F —> MyClass.java
%l:输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
  • %l —> MyClass.main(MyClass.java:129)
%L:显示调用logger的代码行   %L—> 129
%m:显示输出消息  %m —> This is a message for debug
%M:显示调用logger的方法名  %M —> main
%n:当前平台下的换行符 Windows平台下表示rn   UNIX平台下表示n
%p:显示该条日志的优先级  %p —> INFO
%r:显示从程序启动到记录该条日志已经过去的毫秒数  %r —> 1215
%t:输出产生该日志事件的线程名  %t —> MyClass
%x:按NDC(Nested Diagnostic Context,线程堆栈)  假设某程序调用顺序是MyApp调用com.foo.Bar
       %c %x - %m%n   —>   MyApp - Call com.foo.Bar.
            com.foo.Bar - Log in Bar
              MyApp - Return to MyApp.
%X:按MDC(Mapped  Diagnostic  Context,线程映射表)输出日志。通常用于多个客户端连接同一台服务器,方便服务器区分是哪个客户端访问留下的日志    %X{5}  —> (记录代号为5的客户端记录)
%%:显示一个百分号   %% —> %

在Tomcat6下配置log4j的步骤
首先需要准备的文件为:
1.log4j.jar , 下载地址 :
http://www.apache.org/dist/logging/log4j/1.2.15/apache-log4j-1.2.15.zip
2.log4j配置文件:log4j.properties
注意:日志级别不能太低,如果配置为debug的话,输出的日志信息太多,导致tomcat启动非常的慢。 

获得logger 范例代码
package org.javaresearch.log4j;
import org.apache.log4j.*;
public class TestLog4J {   
static Logger log = Logger.getLogger(TestLog4J.class.getName());  
 public static void main(String args[]) {	    // logging的各种方法	  
  log.debug("Start of main()");  
 }
}
关于Log4J比较全面的配置
#应用于文件
log4j.appender.FILE=org.apache.log4j.FileAppender 
log4j.appender.FILE.File=C:\file.log 
log4j.appender.FILE.Append=false 
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern= [framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#应用于控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.Target=System.out 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

示例代码如下:
log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{2}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=d\:mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=info, stdout ,file
Log4JTest
package cn.test.log4j;

import org.apache.log4j.Logger;
import org.junit.Test;

/**
 * 日志记录的类:
 *
 */
public class Log4JTest {
	
	private Logger logger = Logger.getLogger(Log4JTest.class);
	
	@Test
	public void demo1(){
		logger.fatal("致命错误");
		logger.error("普通错误");
		logger.warn("警告信息");
		logger.info("普通信息");
		logger.debug("调试信息");
		logger.trace("堆栈信息");
	}
}

输出到日志文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值