用hibernate写一些简单的数据库的Java应用。主要是温习一下。之前弄过的一些都忘了。发现还是得记下来,不然很快就忘。

1. Eclipse版本,用Juno, J2EE版本。最好下载zip版本的,直接解压就运行。

2. JDK安装,到Oracle上搜索jdk, 然后下载。安装JDK后,设置JAVA_HOME,指到JDK安装目录,将%JAVA_HOME%\bin放到PATH变量的最前面。

3. Maven。到Eclipse marketplace上搜索maven, 会有一个Maven Integration for Eclipse (Juno or newer), by Eclipse.org, 安装它。它里面有maven。

4. Jboss tools. 到Eclipse marketplace上搜索jboss tools,会有一个jboss tools (Juno), by Red hat Inc. 安装它。它里面有hibernate tools, 当然也有别的工具。暂时是只用hibernate tools。

5. 根据数据库来生成hibernate的类文件或者hbm.xml,cfg.xml等。

Windows->Open Perspectives->Other, 然后选hibernate perspective,然后鼠标右键点击左边的hibernate Configurations窗口,出来一个弹出菜单,选Add Configuration。如图:

之后出现这个窗口:

如果没有配置数据库连接就New一个,如果已经有的话就选择一个。Configuration file没有的话就Setup一个。

在这个hibernate视图里有一个Hibernate Code Generation 按钮。如图:

当然了,在Run菜单里也有一个。Run-> Hibernate Code Generation->Hibernate Code Generation Config。如图:

之后是这样的配置窗口:

在Console configuration那里选择之前建立的Console configuration。再输入package name等。点击Exporters Tab.

如果你想用Entity class加*.hbm.xml文件的方式,那就去掉Generate EJB3 annotation的钩,并勾上hbm.xml和cfg.xml的选项。现在这样的选择是采用,有EJB3 annotation的class和cfg.xml就可以了。相对比较简洁和漂亮。所以就这样了。

这个Hibernate code generation的配置建立好了。随后运行它。然后就在我们刚指定的路径里产生了多个java文件。

这是其中一个类:

看到没有,Id字段有EJB3的annotation. 其他的字段也有。

之后我们要将pom.xml文件准备好。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mymaven</groupId>
<artifactId>mymaven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.5.4-Final</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.5.4-Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.5.4-Final</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.2-GA</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
</dependencies>
</project>

这里得说javassist必须得要。hibernate需要这个库。要不就会出错。那个错误是说不能初始化PojoTuplizer的实例。找了本人好久啊。别的库也都是要的。
既然用了logback,就要一个logback.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="c:/log" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志输出编码 -->
<Encoding>UTF-8</Encoding>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Encoding>UTF-8</Encoding>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/myApp.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.type" level="TRACE" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" /> <!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root> <!--日志异步到数据库 -->
<!-- <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
<driverClass>com.mysql.jdbc.Driver</driverClass>
<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>
<user>root</user>
<password>root</password>
</dataSource>
</connectionSource>
</appender> -->
</configuration>

这里说明一下。在别的网络文章能找到别的配置项,却没有这个:

<logger name="org.hibernate.type" level="TRACE" />

加上这个才真正能让SQL 中的参数被打印出来。仅有其余的设置没有用。

这里有一些log:

2014-06-23 21:47:01.748 [main] INFO  org.hibernate.impl.SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured
2014-06-23 21:47:01.787 [main] DEBUG org.hibernate.SQL -
    select
        category0_.CategoryId as CategoryId5_0_,
        category0_.CategoryName as Category2_5_0_,
        category0_.ParentCategoryId as ParentCa3_5_0_,
        category0_.ShortName as ShortName5_0_
    from
        mikelij.category category0_
    where
        category0_.CategoryId=?
Hibernate:
    select
        category0_.CategoryId as CategoryId5_0_,
        category0_.CategoryName as Category2_5_0_,
        category0_.ParentCategoryId as ParentCa3_5_0_,
        category0_.ShortName as ShortName5_0_
    from
        mikelij.category category0_
    where
        category0_.CategoryId=?
2014-06-23 21:47:01.800 [main] TRACE org.hibernate.type.IntegerType - binding '5' to parameter: 1
2014-06-23 21:47:01.806 [main] TRACE org.hibernate.type.StringType - returning '情感' as column: Category2_5_0_
2014-06-23 21:47:01.806 [main] TRACE org.hibernate.type.IntegerType - returning '5' as column: ParentCa3_5_0_
2014-06-23 21:47:01.806 [main] TRACE org.hibernate.type.StringType - returning 'qinggan' as column: ShortName5_0_
2014-06-23 21:47:01.809 [main] INFO  org.nf.myfirst - Found
2014-06-23 21:47:01.816 [main] INFO  org.nf.myfirst - End

看到没有:binding '5' to parameter: 1, 这是SQL的输入参数。后面几个是返回的字段值。

<?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>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="connection.release_mode">on_close</property>
<property name="transaction.auto_close_session">false</property>
<property name="connection.autocommit">false</property>
<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">dddd</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mikelij</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.search.autoregister_listeners">false</property>
<property name="hibernate.current_session_context_class">thread</property>
<mapping class="org.nf.model.Sensitivekeyword" />
<mapping class="org.nf.model.Comment" />
<mapping class="org.nf.model.Group" />
<mapping class="org.nf.model.Post" />
<mapping class="org.nf.model.User" />
<mapping class="org.nf.model.Category" />
<mapping class="org.nf.model.Message" />
</session-factory>
</hibernate-configuration>

这里的说明比较多。首先mapping 都是用mapping class来配置hibernate的。如果是hbm.xml,那么就是用的mapping 文件来做的。
另外这句<property name="hibernate.current_session_context_class">thread</property>是为了Java application准备的。它没有JNDI环境。不象有Tomcat那样的容器,默认提供了一个JNDI环境。所以Java application,这个context的class就得这个设置。不过,如果是Spring,就得用Spring提供的Context class。

<property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="connection.release_mode">on_close</property>
        <property name="transaction.auto_close_session">false</property>
        <property name="connection.autocommit">false</property>

这几句是为了显示sql和格式化sql。另外是为了让Session不自动close。不自动提交。

现在这里是Java代码:

package org.nf;
import org.hibernate.*;
import org.hibernate.cfg.*;
import org.nf.model.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class myfirst { /**
* @param args
*/
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(myfirst.class);
logger.info("Start");
Configuration config = new AnnotationConfiguration();
config.configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
Category category = (Category) session.get(Category.class, 5);
if (category.getCategoryName() != "")
logger.info("Found");
transaction.commit();
session.close();
logger.info("End");
} }

因为用的是Annotation,所以用的是AnnotationConfiguration类。factory的openSession和openCurrentSession方法有一个区别。openCurrentSession得到的Session会被Transaction.Commit自动关闭Session。而openSession得到的Session不会因为Transaction.Commit而自动关闭。所以可以建立另外一个Transaction。连接还是同一个。没有关闭过。这个有什么用吗?当然有用,当有大批量数据操作的时候,可以提交一部分到数据库去处理,然后继续后续的数据处理。这样可以提高整个大批量数据的数据处理速度。

logback.xml和hibernate.cfg.xml都是属于资源文件。在maven中,默认把这类字段文件放到src/main/resources目录下最好:

如果是测试工程的资源文件,可以放在src/test/resources目录下。

备忘:hibernate, logback, slf4j实际应用一例的更多相关文章

  1. SpringBoot日志logback-spring.xml分环境log4j logback slf4j区别 springboot日志设置

    转载. https://blog.csdn.net/qianyiyiding/article/details/76565810 springboot按照profile进行打印日志log4j logba ...

  2. SpringBoot系列(十三)统一日志处理,logback+slf4j AOP+自定义注解,走起!

    往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)we ...

  3. GIS部分理论知识备忘随笔

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...

  4. python序列,字典备忘

    初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...

  5. Vi命令备忘

    备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...

  6. ExtJs4常用配置方法备忘

    viewport布局常用属性 new Ext.Viewport({ layout: "border", renderTo: Ext.getBody(), defaults: { b ...

  7. [备忘] Automatically reset Windows Update components

    这两天遇到Windows 10的更新问题,官方有一个小工具,可以用来修复Windows Update的问题,备忘如下 https://support.microsoft.com/en-us/kb/97 ...

  8. ECMAScript 5(ES5)中bind方法简介备忘

    一直以来对和this有关的东西模糊不清,譬如call.apply等等.这次看到一个和bind有关的笔试题,故记此文以备忘. bind和call以及apply一样,都是可以改变上下文的this指向的.不 ...

  9. MFC通过txt查找文件并进行复制-备忘

    MFC基于对话框的Demo txt中每行一个23位的卡号. 文件夹中包含以卡号命名的图像文件.(fpt或者bmp文件) 要求遍历文件夹,找到txt中卡号所对应的图像文件,并复制出来. VC6.0写的. ...

随机推荐

  1. sed入门详解教程

    sed是一个比较古老的,功能十分强大的用于文本处理的流编辑器,加上正则表达式的支持,可以进行大量的复杂的文本编辑操作.sed本身是一个非常复杂的工具,有专门的书籍讲解sed的具体用法,但是个人觉得没有 ...

  2. linux基础-基本命令的讲解(1-7单元)

    基本命令的讲解 主要内容介绍 1.LINUX操作系统安装及初始化配置(熟悉):2.LINUX操作系统目录组成结构及文件级增删改查操作(重点):3.LINUX操作系统用户.权限管理(重点):4.开源软件 ...

  3. libsvm Minist Hog 手写体识别

    统计手写数字集的HOG特征 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ 这篇文章是模式识别的小作业,利用sv ...

  4. AngularJS Filters

    过滤器可以使用一个管道字符(|)添加到表达式和指令中. AngularJS 过滤器 AngularJS 过滤器可用于转换数据: 过滤器 描述 currency 格式化数字为货币格式. filter 从 ...

  5. UESTC 764 失落的圣诞节 --RMQ/线段树

    题意:n种物品,每种物品对不同的人都有不同的价值,有三个人选,第一个为普通学生,第二个是集,第三个是祈,集和祈可以选一样的,并且还会获得加分,集和祈选的普通学生都不能选,问三个人怎样选才能使总分最高. ...

  6. NYOJ-756重建二叉树

    重建二叉树 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于 ...

  7. 第一天接触Orchard

    第一天接触Orchard 为什么要研究Orchard 呢? 楼主是因为要研究下最新的ASP.NET技术, Orchard 用的人多,历史也比较久,算是老牌了 再就是中文资料比较多,Orchard 有中 ...

  8. [No00004B]Windows 下面为Python3.5安装NoteBook

    python3.5安装NoteBook,网上搜了一下教程,几乎很多转帖,或者是2.x版本的,很少有直接可以用的.自己琢磨了一下午,终于搞定了,现在贴出来.希望大家以后转帖什么的都先测试一下,互联网时代 ...

  9. [No00000C]Word快捷键大全 Word2013/2010/2007/2003常用快捷键大全

    Word对于我们办公来说,是不可缺少的办公软件,因为没有它我们可能无法进行许多任务.所以现在的文员和办公室工作的人,最基础的就是会熟悉的使用Office办公软件.在此,为提高大家Word使用水平,特为 ...

  10. Eclipse 搜索插件 instasearch

    http://marketplace.eclipse.org/content/instasearch