Hibernate 学习代码/笔记 (二)

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();
	}
}


hibernate.cfg.xml配置文件

<!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:适用于自然主键,使用另一个相关联的对象的标识符

来自慕课网学习..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值