hibernate进阶操作

时间:2022-06-17
本文章向大家介绍hibernate进阶操作,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

实现功能

配置hibernate.cfg.xml配置文件 1.连接数据库 2.数据库方言 3.控制台是否显示sql语句 4.给控制台sql语句添加格式

配置hbm.xml映射文件的位置

<session-factory>
        <!--连接数据库,不可缺少-->
        <property name="connection.url">jdbc:mysql://localhost:3306/qingyun</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>
        <!--myisam 不支持事务 支持全文索引
        innodb 支持事务   不支持全文索引-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <!--
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLMyISAMDialect</property>
        -->
        <!--创建临时表-->
        <!-- <property name="hibernate.hbm2ddl.auto">create-drop</property>-->
        <!--通过配置文件创建对应的表结构-->
        <!--<property name="hibernate.hbm2ddl.auto">create</property>-->
        <!--通过配置文件更新表结构-->
        <!--<property name="hibernate.hbm2ddl.auto">update</property>-->
        <!--在执行操作之前验证表结构和类结构是否一致-->
        <property name="hibernate.hbm2ddl.auto">validate</property>
        <!--显示sql-->
        <property name="hibernate.show_sql">true</property>
        <!--美化sql,格式化sql语句-->
        <property name="hibernate.format_sql">true</property>
        <mapping resource="Course.hbm.xml"/>
        <mapping resource="Employee.hbm.xml"/>
        <mapping resource="Grade.hbm.xml"/>
        <mapping resource="Record.hbm.xml"/>
        <mapping resource="User.hbm.xml"/>
        <mapping resource="Score1.hbm.xml"></mapping>
    </session-factory>

类名.hbm.xml 映射文件   
<hibernate-mapping package="com.qy.domain">
    <!--name:类的全限定名  table:当前类对应的表名   schema:当前表所在的数据库名 -->
    <class name="User" table="user" schema="qingyun" dynamic-insert="true" dynamic-update="true">
        <!--id:主键   name:实体类中属性名   column:表中列名  -->
        <id name="id" column="id">
            <!--
              increment 使用hibernate生成主键
             select max(id) from user 先查询得到最大值
             在最大值基础上加1,插入新的记录
            -->
            <!--<generator class="increment"></generator>-->
            <!--
            使用mysql生成主键
            -->
            <generator class="native"></generator>
        </id>
        <!--property 普通属性和列的对应 -->
        <property name="username" column="username" type="java.lang.String"/>
        <property name="address" column="address" type="java.lang.String"/>
        <property name="age" column="age" type="java.lang.Integer"/>
    </class>
</hibernate-mapping>


<hibernate-mapping>
    <!--name:类的全限定名  table:当前类对应的表名   schema:当前表所在的数据库名 -->
    <class name="com.qy.domain.Score1" table="score1" schema="qingyun">
        <!--id:主键   name:实体类中属性名   column:表中列名  -->
        <!--联合主键   组合主键 -->
       <composite-id>
           <key-property name="stuId" column="stu_id"></key-property>
           <key-property name="courseId" column="course_id"></key-property>
       </composite-id>
        <!--property 普通属性和列的对应 -->
        <property name="score" column="score"/>
    </class>
</hibernate-mapping>

下面两个是我的两个配置文件 1.hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!--连接数据库,不可缺少-->
        <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>
        <!--配置自动提交,一般不会用-->
        <!--<property name="connection.autocommit">true</property>-->
        <!--
        myisam 不支持事务 支持全文索引
        innodb 支持事务   不支持全文索引
        -->
        <!--数据库表示什么引擎,它就是什么引擎-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
       <!-- <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLMyISAMDialect</property>-->
        <!--创建临时表-->
        <!--
        数据库里面没有表,代码里面给它对应了一个对象,通过配置文件创建表,这个可以先创建一个临时表,等tomcat
        关闭之前,临时表就会被删除
        -->
        <!--<property name="hibernate.hbm2ddl.auto">create-drop</property>-->
        <!--通过配置文件创建对应的表结构-->
        <!--这个不会删除表结构-->
        <!--<property name="hibernate.hbm2ddl.auto">create</property>-->
        <!--通过配置文件更新表结构-->
        <!--可以更新表的结构,加上属性,或者,添加主键-->
        <property name="hibernate.hmb2ddl.auto">update</property>
       <!--在执行操作之前验证表结构和类结构是否一致-->
        <!--<property name="hibernate.hbm2ddl.auto">validate</property>-->
        <!--显示sql-->
        <property name="hibernate.show_sql">true</property>
        <!--美化sql,格式化sql语句-->
        <property name="hibernate.format_sql">true</property>

        <mapping resource="PersonEntity.hbm.xml"/>
        <mapping resource="ProductEntity.hbm.xml"/>
        <mapping resource="UserEntity.hbm.xml"/>
        <mapping resource="ScoreEntity.hbm.xml"></mapping>
        <!-- <property name="connection.username"/> -->

        <!-- <property name="connection.password"/> -->

        <!-- DB schema will be updated if needed -->
        <!-- <property name="hbm2ddl.auto">update</property> -->
    </session-factory>
</hibernate-configuration>

2.日志文件 log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <!--         这个输出控制台的配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss a} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
       <!--         文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 -->
        <!--         append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true -->
        <File name="log" fileName="log/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>
        <!-- 		 添加过滤器ThresholdFilter,可以有选择的输出某个级别以上的类别  onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否则直接拒绝  -->
        <File name="ERROR" fileName="logs/error.log">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

        <!-- 这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFile" fileName="logs/app.log"
                     filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <SizeBasedTriggeringPolicy size="2MB"/>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <!-- 打印hibernate的info日志 -->
        <Logger name="org.hibernate" level="info" additivity="false">
            <AppenderRef ref="Console" />
        </Logger>
        <!-- 打印sql语句 -->
        <Logger name="org.hibernate.SQL" level="info" additivity="false">
            <AppenderRef ref="Console" />
            <AppenderRef ref="File" />
        </Logger>
        <!-- 查询出来的结果集提取,如果嫌这个日志太多可以关掉 -->
        <Logger name="org.hibernate.type.descriptor.sql" level="info" additivity="false">
            <AppenderRef ref="Console" />
            <AppenderRef ref="File" />
        </Logger>
        <!-- Log custom packages -->
        <Logger name="com.boraji.tutorial.hibernate" level="debug" additivity="false">
            <AppenderRef ref="Console" />
            <AppenderRef ref="File" />
        </Logger>
        <Root level="error">
            <appender-ref ref="Console"/>
            <AppenderRef ref="RollingFile" />
            <appender-ref ref="ERROR" />
            <appender-ref ref="log"/>
        </Root>
    </Loggers>
</Configuration>

hibernate对象的状态及对象的声明周期

临时状态/瞬时态(transient):刚刚用new语句创建,没有被持久化,不处于session中。 特点:没有oid,不在session当中 持久化状态(persistent):已经被持久化,加入到session的缓存中。 特点:有oid,在session当中 脱管态/游离状态(detached):已经被持久化,但不处于session中。 特点:有oid,不在session当中 删除状态(removed):对象有关联的ID,并且在Session管理下,但是已经计划被删除。 特点:有oid,在session当中,最终的效果是被删除

对图的理解

1.new User() ------------》 临时状态/瞬时状态-------》gc 2.瞬时 ----------> save saveorUpdate persist----------->持久化 persist 3.持久化状态 -------> delete----->删除状态 ---------》gc 或者 —save-------》持久化状态 4.持久化状态--------> clear close evict --------------》游离状态-----》gc 5.Get / load / query / list ----------------> 持久化状态 gc就是jvm里面的垃圾回收机制

Get、load方法的区别

使用get查询时,直接通过SQL语句获取数据,每次get都会从数据库中查找一次。使用load时,先把查询的数据放在缓存中,等使用数据时才会从数据库中拿出数据。Load能大大增加效率。