hibernate.cfg.xml常用配置
<property name="show_sql">true</property>
含义:是否把Hibernate运行时的SQL语句输出到控制台,编码阶段便于测试
<property name="format_sql">true</property>
含义:输出到控制台的SQL语句是否进行排版,便于阅读.
<property name="hbm2ddl.auto">create</property>
含义:生成表结构的一种策略.可以帮助由java代码生成数据库脚本,进而生成具体的表结构.
一共有四中策略: create/update/create-drop/validate
常用的是前两个,create和update
create: 每次生成新的表结构,如果原来的表存在,那就先删掉旧表,再添加新表,再添加记录
calidate:在原有的表的基础之上,进行更新
create-drop: 先创建在删除
validate :对原有的表结构进行验证,如果原有的表与现有的表不同,不会创建表结构
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
含义: 配置Hibernate数据库方言,Hibernate可针对特殊的数据库进行优化
hibernate.default_schema :默认的数据库的前缀
Hibernate 大致的执行流程....
1.首先创建一个配置对象(Configuration对象),这个配置对象的作用就是用来读取配置文档(就是hibernate.cfg.xml),
2.获得这个配置对象的目的,就是可以用它来创建SessionFactory对象.
3.创建SessionFactory对象的时候,就会读取相应的所需要加载的对象关系映射文件.
4.获得SessionFactory对象之后,就可以获得Session对象.(Session对象,就类似于JDBC中的Connection..)
5.获得了一个Session对象,就获得一个数据库链接对象
6.然后就可以愉快地执行,session对象所对应的方法..比如 save/delete/update/get(增删改查)..
7.这里要注意,执行某一个session方法之前,要先开启一个事务,就是说,这些方法都封装在事务当中.
8.再执行完session的方法之后,要先提交事务,然后再关闭session链接...
Session简介:
hibernate不建议直接使用JDBC的Connection操作数据库..而是通过使用session对象操作数据库
可以理解session就是操作数据的对象
so,在使用hibernate操纵数据库之前,就必须先获得一个session实例
session与JDBC中的connection,可以理解为是多对一的关系,
每一个session都有一个与之对应的connection,
一个connection不同时刻可以供多个session使用
把对象保存到关系型数据库中需要调用session的各种方法,
如save(),update(),delete(),createQuery()等
transaction简介
hibernate对数据的操作都是封装在事务中的,并且默认是非自动提交的方式,
所以用session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正的保存在数据库中.
不开启事务,就不能将对象保存到数据库中
Sessioin详解..
如何获得Session对象?
1.openSession()方法
2.getCurrentSession()方法
这两个方法都是来自SessionFactory
注:如果使用第二种方法,需要在hibernate.cfg.xml文档中进行配置:
如果是本地事务(JDBC事务)
<property name="hibernate.current_session_context_class">thread</property>
如果是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>(jta事务,此处不表)
用两种方式来创建Session对象
openSession()方法和getCurrentSession()方法 写一个小栗子...
结构图:
实体类:
package com.hibernate.entity;
import java.util.Date;
public class Students {
private int sid;
private String sname;
private String gender;
private Date birthday;
private String address;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Students [address=" + address + ", birthday=" + birthday
+ ", gender=" + gender + ", sid=" + sid + ", sname=" + sname
+ "]";
}
public Students(int sid, String sname, String gender, Date birthday,
String address) {
// super();
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.birthday = birthday;
this.address = address;
}
public Students() {
// super();
}
}
<!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">1234</property> <!-- 数据库密码 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property><!-- 数据库驱动 -->
<!-- 数据库地址 -->
<property name="connection.url">jdbc:mysql://localhost:3306/test?user=root&password=1234&useUnicode=true&characterEncoding=UTF-8</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- mysql 数据库方言 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.current_session_context_class">thread</property><!-- <span style="font-size:14px;">getCurrentSession()需要配置的</span> -->
<mapping resource="com/hibernate/entity/Students.hbm.xml"/>
</session-factory>
</hibernate-configuration>
关系映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 学生的对象关系映射 -->
<hibernate-mapping>
<class name="com.hibernate.entity.Students" ><!-- 此处的类名要写完整,包名点类名/table 指定表名 -->
<id name="sid" type="int">
<column name="SID"/>
<generator class="assigned"/>
</id>
<property name="sname" type="java.lang.String">
<column name="SNAME"></column>
</property>
<property name="gender" type="java.lang.String">
<column name="GENDER"/>
</property>
<property name="birthday" type="java.util.Date">
<column name="BIRTHDAY"/>
</property>
<property name="address" type="java.lang.String">
<column name="ADDRESS"></column>
</property>
</class>
</hibernate-mapping>
测试方法
package com.hibernate.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;
public class SessionTest {
@Test
public void testOpenSession(){
//获得配置对象
Configuration config = new Configuration().configure();
//获得服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//获得SessionFactory对象
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
//获得Session对象
Session session = sessionFactory.openSession();
if(session != null){
System.out.println("session创建成功");
}else{
System.out.println("session创建失败");
}
}
@Test
public void testGetCurrentSession(){
//获得配置对象
Configuration config = new Configuration().configure();
//获得服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//获得SessionFactory对象
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
//获得Session对象
Session session = sessionFactory.getCurrentSession();
if(session != null){
System.out.println("session创建成功");
}else{
System.out.println("session创建失败");
}
}
}
测试结果
openSession()方法 和 getCurrentSession()方法的区别
1.getCurrentSession在事务提交或者是回滚之后会自动关闭,而openSession需要你手动关闭.
如果使用openSession而没有手动关闭,多次之后就会导致连接池溢出
2.openSession每次创建都是新的session对象,getCurrentSession使用现有的session对象
hbm配置文件常用设置
<class
name="ClassName"对象关系映射,映射的哪个类
table="tableName"表名,将这个类,映射至数据库的哪张表..
batch-size="N"抓取策略,一次能抓取多少条记录
where="condition"抓取条件
entity-name="EntityName"同一个类,支持映射成多个表(用的比较少..一般都是一个对一个)
>
<id//id表示 表的主键,用id标签括起来的,是充当主键功能的..
name="propertyName"要映射的属性
type="typename"数据类型
column="column_name"数据库中映射的哪个字段的名字
length="length"长度
<generator class="genderatorClass"> 子标签 主键生成策略
>
主键生成策略:
native :适用于代理主键,根据底层数据库对自动生成标识符的方式,自动选择identity,sequence,或hilo
assigned:适用于自然主键,使用另一个相关联的对象的标识符
来自慕课网学习..