1、是在src下创建的Hibernate Configuration File(cfg.xml)
有什么参数不清楚可以去下载的那个hibernate的jar的压缩包里面的project/etc/hibernate.properties中查看
2、常用参数有
连接数据库基本信息
(1)connection.username:数据库用户名
(2)connection.password:数据库密码
(3)connection.driver_class:数据库驱动
(4)connection.url:数据库地址
Hibernate基本信息
(5)dialect:hibernate使用的数据库方言
(6)show_sql:显示sql
(7)format_sql:格式化sql
(8)hbm2ddl.auto:生成数据表的策略
(9)connection.isolation:hibernate事务隔离级别
(10)hibernate.use_identifier_rollback:调用session.delete()时,OID是否要变成null(变成临时对象)
(11)hibernate.jdbc.fetch_size:设定 JDBC 的 Statement 读取数据的时候每次从数据库中取出的记录条数
(12)hibernate.jdbc.batch_size:设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小
C3P0 数据库连接池
(13)hibernate.c3p0.max_size:数据库连接池的最大连接数
(14)hibernate.c3p0.min_size:数据库连接池的最小连接数
(15)hibernate.c3p0.timeout:以毫秒为单位,数据库连接池中连接对象在多长时间没有使用过后,就应该被销毁
(16)hibernate.c3p0.max_statements:缓存 Statement 对象的数量
(17)hibernate.c3p0.idle_test_period:以毫秒为单位,表示连接池检测线程多长时间检测一次池内的所有链接对象是否超时
(18)hibernate.c3p0.acquire_increment:当数据库连接池中的连接耗尽时, 同一时刻一次性从服务器获取多少个数据库连接
指定关联映射文件用的标签
(19)mapping:用于指定关联的 *.hbm.xml文件,用resource关键字来指定hbm.xml文件地址
3、junit调试的时候要用hamcrest-all-1.3.jar、junit.jar两个jar包
4、hbm2ddl.auto中四个值(create 、 update 、 create-drop 、 validate)的用法
①create:每次都生成新的数据表,旧的数据表就会没了
②create-drop:每次都生成新的数据表,当SessionFactory.close()执行,这个表就会删除
③update:数据表或列存在就更新或插入数据,不存在就新建
④validate:和数据库的表对比,如果hbm.xml文件的列在数据表中不存在,则抛出异常并不改变表
5、隔离事务级别
(1)对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致以下问题:
① 脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的
② 不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了
③ 幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行
(2)对应级别
①级别值 1 ->READ UNCOMMITED(读未提交的数据)
②级别值 2 ->READ COMMITED(读已经提交的数据)
③级别值 4 ->REPEATABLE READ(重复读某个字段,持续期间,该字段不能被更新)
④级别值 8 ->SERIALIZEABLE(读数据表的某一行,持续期间,该表不能执行插入、更新、删除操作)
(3)数据库支持:Oracle支持2、8两个级别,MySQL四种都支持,一般配置用2就好了
6、hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置连接数据库基本信息 -->
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- localhost是地址,如果用默认可以不写localhost,hebernateTEST是数据库名 -->
<property name="connection.url">jdbc:mysql://localhost/hebernateTEST</property>
<!-- 配置hibernate基本信息
1、配置hibernate使用数据库的方言dialect(区分是什么数据库,区分什么版本用)
2、dialect属性值应该写东西,可以去下载的那个hibernate的jar的压缩包里面的project/etc/hibernate.properties中查看
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 执行操作室是否在控制台打印sql -->
<property name="show_sql">true</property>
<!-- 是否对sql格式化 -->
<property name="format_sql">true</property>
<!-- 指定自动生成数据表的策略 -->
<!--
1、执行程序的时候hibernate自动在数据库生成数据表
2、hbm2ddl.auto有四个create 、 update 、 create-drop 、 validate
①create:每次都生成新的数据表,旧的数据表就会没了
②create-drop:每次都生成新的数据表,当SessionFactory.close()执行,这个表就会删除
③update:数据表或列存在就更新或插入数据,不存在就新建
④validate:和数据库的表对比,如果hbm.xml文件的列在数据表中不存在,则抛出异常并不改变表
-->
<property name="hbm2ddl.auto">update</property>
<!-- 设置 Hibernate 的事务隔离级别 -->
<property name="connection.isolation">2</property>
<!-- 设置调用delete()时,OID变成null -->
<property name="hibernate.use_identifier_rollback">true</property>
<!--
C3P0 数据库连接池
1、需要的jar:
c3p0-0.9.2.1.jar、hibernate-c3p0-4.2.4.Final.jar、mchange-commons-java-0.2.3.4.jar
2、加入配置到hibernate.cfg.xml
hibernate.c3p0.max_size: 数据库连接池的最大连接数
hibernate.c3p0.min_size: 数据库连接池的最小连接数
hibernate.c3p0.timeout: 以毫秒为单位,数据库连接池中连接对象在多长时间没有使用过后,就应该被销毁
hibernate.c3p0.max_statements: 缓存 Statement 对象的数量
hibernate.c3p0.idle_test_period: 以毫秒为单位
表示连接池检测线程多长时间检测一次池内的所有链接对象是否超时
连接池本身不会把自己从连接池中移除
专门有一个线程按照一定的时间间隔来做这件事,这个线程通过比较连接对象最后一次被使用时间和当前时间的时间差来和 timeout 做对比,进而决定是否销毁这个连接对象。
hibernate.c3p0.acquire_increment: 当数据库连接池中的连接耗尽时, 同一时刻一次性从服务器获取多少个数据库连接
-->
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">2000</property>
<property name="hibernate.c3p0.max_statements">10</property>
<property name="hibernate.c3p0.idle_test_period">2000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<!--
设定JDBC的statement读取数据的时候,每次从数据库中读取出来的记录条数
1、hibernate.jdbc.fetch_size:实质是调用 Statement.setFetchSize() 方法设定 JDBC 的 Statement 读取数据的时候每次从数据库中取出的记录条数
(1)hibernate.jdbc.fetch_size越大,读取数据库越少,整体速度越快
(2)当hibernate.jdbc.fetch_size等于50时,性能是平常一倍,当100时,性能会再提升20%,hibernate.jdbc.fetch_size大于100时,变化不大,所以推荐100
(3)不是所有数据库都支持hibernate.jdbc.fetch_size,如:mysql
2、hibernate.jdbc.batch_size:设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小
(1)类似于缓冲区
(2)hibernate.jdbc.batch_size越大,sql操作次数越少,速度越快
(3)hibernate.jdbc.batch_size等于50时,效率最高(Oracle用30最好)
3、以下配置,对于mysql是无效的,但是不报错,对于Oracle是有效的
-->
<property name="hibernate.jdbc.fetch_size">100</property>
<property name="hibernate.jdbc.batch_size">50</property>
<!-- 指定关联的 *.hbm.xml文件(目录结构) 每个.hbm.xml对应一个数据表-->
<mapping resource="com/demo/sshtest/Info.hbm.xml"/>
</session-factory>
</hibernate-configuration>
详细的东西都写注释里面了,跟上面五点的东西其实差不多
7、Info.java 持久化类
package com.demo.sshtest;
public class Info {
public Integer id;
public String name;
public String pswd;
public String description;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPswd() {
return pswd;
}
public void setPswd(String pswd) {
this.pswd = pswd;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Info(){}
public Info(String name, String pswd, String description) {
super();
this.name = name;
this.pswd = pswd;
this.description = description;
}
public Info(Integer id,String name, String pswd, String description) {
super();
this.id = id;
this.name = name;
this.pswd = pswd;
this.description = description;
}
@Override
public String toString() {
return "Info [id=" + id + ", name=" + name + ", pswd=" + pswd + ", description=" + description + "]";
}
}
8、Info.hbm.xml 映射关系文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-4-4 16:22:30 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.demo.sshtest.Info" table="INFO">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="pswd" type="java.lang.String">
<column name="PSWD" />
</property>
<property name="description" type="java.lang.String">
<column name="DESCRIPTION" />
</property>
</class>
</hibernate-mapping>
9、TestHibernateCfgConfig.java 测试类
package com.demo.sshtest;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.jdbc.Work;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class TestHibernateCfgConfig {
public SessionFactory sessionFactory;
public Session session;
public Transaction transaction;
//这里用@xxxx的junit调试的时候 要把hamcrest-all-1.3.jar、junit.jar加载上 不然会报错
@Before
public void init(){
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
session = sessionFactory.openSession();
transaction = session.beginTransaction();
System.out.println("init");
}
@After
public void destory(){
transaction.commit();
session.close();
sessionFactory.close();
System.out.println("destory");
}
@Test
public void Dowork(){
//通过调用doWork()方法,就能调用jre中原生的jdbc接口
System.out.println("dowork");
session.doWork(new Work() {
@Override
public void execute(Connection con) throws SQLException {
System.out.println(con);
String sql = "select * from info where id=6";
Statement stmt = null;
ResultSet rs = null;
PreparedStatement pstmt;
try{
stmt = con.createStatement();
//传入类似sql="select * from test"
pstmt=con.prepareStatement(sql);
rs=pstmt.executeQuery();
while (rs.next()) {
System.out.println("打印resultset里面的参数值:");
System.out.println("id:"+rs.getInt("id"));
System.out.println("name:"+rs.getString("name"));
System.out.println("pswd:"+rs.getString("pswd"));
System.out.println("description:"+rs.getString("description"));
}
rs.close();
}catch (Exception e){
System.out.println("数据查询失败!");
e.printStackTrace();
}
try{
if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
}catch(Exception e) {
e.printStackTrace();
}
}
});
}
}
这里调试用了junit来调试,所以要把hamcrest-all-1.3.jar、junit.jar两个jar都加上,在测试中使用session.doWork()来做一个运行sql查询数据库的操作,从中能发现,用mysql的时候,hibernate.cfg.xml中配的hibernate.jdbc.fetch_size和hibernate.jdbc.batch_size是没有作用的
10、项目目录
11、运行效果:这里就不上图了,无非就是Dowork()方法里面查询到数据,然后打印出来而已
12、demo(其实不下载都可以,直接复制文章中的代码就好了)
https://download.csdn.net/download/qq_22778717/10338369
13、数据库
- 数据库名:hebernatetest
- 数据表名:info
- 数据字段:id(Integer)、name(varchar)、pswd(varchar)、description(varchar)