实现功能
配置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能大大增加效率。