Hibernate中持久化类

Hibernate中持久化类

一、编写规则

•    提供一个无参数 public访问控制符的构造器

•    提供一个标识属性,映射数据表主键字段

•    所有属性提供public访问控制符的 set  get 方法(javaBean)

•    标识属性应尽量使用基本数据类型的包装类型(int->Integer等)

•    不要用final修饰实体 (将无法生成代理对象进行优化)

 

二、持久化对象的唯一标识OID

Java按地址区分同一个类的不同对象.

关系数据库用主键区分同一条记录

Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系

结论: 对象的OID和数据库的表的主键对应。为保证OID的唯一性,应该让Hibernate来为OID付值

 

三、区分自然主键和代理主键

主键需要具备: 不为空/不能重复/不能改变

              自然主键:      在业务中,某个属性符合主键的三个要求.那么该属性可以作为主键列.

              代理主键:     在业务中,不存符合以上3个条件的属性,那么就增加一个没有意义的列.作为主键.

 

四、基本数据与包装类型

基本数据类型和包装类型对应hibernate的映射类型相同

基本类型无法表达null、数字类型的默认值为0。

包装类默认值是null。当对于默认值有业务意义的时候需要使用包装类。

 

五、类型对应

Java数据类型

Hibernate数据类型

标准SQL数据类型
(PS:对于不同的DB可能有所差异)

byte、java.lang.Byte

byte

TINYINT

short、java.lang.Short

short

SMALLINT

int、java.lang.Integer

integer

INGEGER

long、java.lang.Long

long

BIGINT

float、java.lang.Float

float

FLOAT

double、java.lang.Double

double

DOUBLE

java.math.BigDecimal

big_decimal

NUMERIC

char、java.lang.Character

character

CHAR(1)

boolean、java.lang.Boolean

boolean

BIT

java.lang.String

string

VARCHAR

boolean、java.lang.Boolean

yes_no

CHAR(1)('Y'或'N')

boolean、java.lang.Boolean

true_false

CHAR(1)('Y'或'N')

java.util.Date、java.sql.Date

date

DATE

java.util.Date、java.sql.Time

time

TIME

java.util.Date、java.sql.Timestamp

timestamp

TIMESTAMP

java.util.Calendar

calendar

TIMESTAMP

java.util.Calendar

calendar_date

DATE

byte[]

binary

VARBINARY、BLOB

java.lang.String

text

CLOB

java.io.Serializable

serializable

VARBINARY、BLOB

java.sql.Clob

clob

CLOB

java.sql.Blob

blob

BLOB

java.lang.Class

class

VARCHAR

java.util.Locale

locale

VARCHAR

java.util.TimeZone

timezone

VARCHAR

java.util.Currency

currency

VARCHAR

 

六、普通属性

User.hbm.xml:
<hibernate-mapping> 
			package 用于配置PO类所在包
				例如: package="com.hcx.d_hbm"
		<class> 配置 PO类 和 表 之间对应关系
			name:PO类全限定类名
				例如:name="com.hcx.d_hbm.Person"
				如果配置 package,name的取值可以是简单类名 name="Person"
			table : 数据库对应的表名
			dynamic-insert="false" 是否支持动态生成insert语句
			dynamic-update="false" 是否支持动态生成update语句
				如果设置true,hibernate底层将判断提供数据是否为null,如果为null,insert或update语句将没有此项。
		普通字段
			<property>
				name : PO类的属性
				column : 表中的列名,默认name的值相同
				type:表中列的类型。默认hibernate自己通过getter获得类型,一般情况不用设置
					取值1: hibernate类型
						string 字符串
						integer 整形
					取值2: java类型 (全限定类名)
						java.lang.String 字符串
					取值3:数据库类型
						varchar(长度) 字符串
						int 整形
						<property name="birthday">
					 		<column name="birthday" sql-type="datetime"></column>
					 	</property>
					 	javabean 一般使用类型 java.util.Date
					 	jdbc规范提供3中
					 		java类型				mysql类型
					 		java.sql.Date		date
<hibernate-mapping> 
			package 用于配置PO类所在包
				例如: package="com.hcx.d_hbm"
		<class> 配置 PO类 和 表 之间对应关系
			name:PO类全限定类名
				例如:name="com.hcx.d_hbm.Person"
				如果配置 package,name的取值可以是简单类名 name="Person"
			table : 数据库对应的表名
			dynamic-insert="false" 是否支持动态生成insert语句
			dynamic-update="false" 是否支持动态生成update语句
				如果设置true,hibernate底层将判断提供数据是否为null,如果为null,insert或update语句将没有此项。
		普通字段
			<property>
				name : PO类的属性
				column : 表中的列名,默认name的值相同
				type:表中列的类型。默认hibernate自己通过getter获得类型,一般情况不用设置
					取值1: hibernate类型
						string 字符串
						integer 整形
					取值2: java类型 (全限定类名)
						java.lang.String 字符串
					取值3:数据库类型
						varchar(长度) 字符串
						int 整形
						<property name="birthday">
					 		<column name="birthday" sql-type="datetime"></column>
					 	</property>
					 	javabean 一般使用类型 java.util.Date
					 	jdbc规范提供3中
					 		java类型				mysql类型
					 		java.sql.Date		date
					 		java.sql.time		time
					 		java.sql.timestamp	timestamp
					 		null				datetime
					 		
					 		以上三个类型都是java.util.Date子类
					 		
				length : 列的长度。默认值:255
				not-null : 是否为null
				unique : 是否唯一
				access:设置映射使用PO类属性或字段
					property : 使用PO类属性,必须提供setter、getter方法
					field : 使用PO类字段,一般很少使用。
				insert 生成insert语句时,是否使用当前字段。
				update 生成update语句时,是否使用当前字段。
					默认情况:hibernate生成insert或update语句,使用配置文件所有项
		注意:配置文件如果使用关键字,列名必须使用重音符	

 
case:
User.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!-- ORM元数据  表对象关系映射文件 
    	package : 配置该配置文件中类所在的包.  -->
 <hibernate-mapping package="com.hcx.a_hello" >
 	<!-- class: 配置实体与表的关系
 		name : 填写实体的完整类名
 		table: 与实体对应表的名称
 		dynamic-insert:动态插入 默认值是false
 						true=>如果字段值为null,不参与insert语句
 		 dynamic-update:动态更新  默认值"false"
 		 				true=> 没改动过的属性,将不会生成到update语句中
 	 -->
 	 <!-- ORM映射  实体与表 属性与列 -->
 	<class name="User" table="t_user"  > <!-- 把哪个class表映射到哪张表 -->
 		<!-- id: 配置实体与表中 id对应
 			name: user对象中标识主键的属性名称
 			column: 主键在表中的列名
 			length: 列的数据长度
 			unsaved-value(不常用): 指定主键为什么值时,当做null来处理.
			access(强烈推荐不要用):field 那么在操作属性时,会直接操作对应的字段而不是get/set方法
 		 -->
		<id name="id" column="id" length="255"   >
			<!-- generator:主键生成策略
				 	1.increment  数据库自己生成主键. 先从数据库中查询最大的ID值,将ID值加1作为新的主键
					2.identity  依赖于数据的主键自增功能
					3.sequence	序列,依赖于数据中的序列功能(Oracle).
					4.hilo(纯了解,永远用不到) : Hibernate自己实现序列的算法,自己生成主键. (hilo算法 )
					5.native 自动根据数据库判断,三选一. identity|sequence|hilo
					6.uuid  生成32位的不重复随机字符串当做主键
					7.assigned 自己指定主键值. 表的主键是自然主键时使用.
				 
			 -->
			<generator class="uuid"></generator>
		</id> 	
		<!-- property : 实体中属性与表中列的对应
			 name : 实体中属性名称
			 column : 表中列的名称
			 length : 数据长度
			 precision: 小数点后的精度
			 scale:	有效位数
			 insert(一般不用): 该属性是否加入insert语句.
			 update(一般不用): 该属性是否加入update语句.
			 not-null : 指定属性的约束是否使用 非空
			 unique : 指定属性的约束是否使用 唯一
		 -->
		 <!-- 
		 	type: 表达该属性的类型
		 	可以用三种方式指定属性
		 	java类型		 		 数据库类型指定			Hibernate类型指定
		 	java.lang.String	                   varchar			     string
		  -->
		<property name="name" column="name" update="true" type="string" ></property>
		<property name="password" column="password"></property>
		 <property name="sal" column="sal" precision="2" scale="3" ></property>
 	</class>
 </hibernate-mapping>
 
 
session_test:
package com.hcx.c_hbm;

import java.util.Arrays;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;

import com.hcx.a_hello.User;
import com.hcx.utils.HibernateUtils;
public class session_test {
	@Test
	//演示dynamic-insert 
	public void fun1(){
		org.hibernate.Session session = HibernateUtils.openSession();
		Transaction ts = session.beginTransaction();
		
		User u = new User();
		u.setName("zhangsan");
		//调用Session的save方法保存对象到数据库中
		session.save(u);
		
		ts.commit();
		//关闭资源
		session.close();
	}
	@Test
	//演示dynamic-update
	public void fun2(){
		org.hibernate.Session session = HibernateUtils.openSession();
		
		Transaction ts = session.beginTransaction();
		
		User u = (User) session.get(User.class, 1);
		
		u.setName("jerry");
		
		session.update(u);
		
		ts.commit();
		//关闭资源
		session.close();
	}
}
 


HibernateUtils:
package com.hcx.utils;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

//完成Hibernate工具类
//封装配置文件读取操作
//封装Sessionfactroy创建操作
//封装session获得操作
public class HibernateUtils {

	private static SessionFactory sf;
	
	static{
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		sf = conf.buildSessionFactory();
		//
		Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
			
			@Override
			public void run() {
				System.out.println("虚拟机关闭!释放资源");
				sf.close();
			}
		}));
		
	}
	
	
	public static org.hibernate.Session  openSession(){
				
				//3 获得session
				Session session = sf.openSession();
				
				return session;
	}
	
	public static org.hibernate.Session  getCurrentSession(){
		//3 获得session
		Session session = sf.getCurrentSession();
		
		return session;
}
	
	public static void main(String[] args) {
		System.out.println(openSession());
	}
}


 

七、主键

主键 
			<id>配置主键
				name:属性名称
				access="" 设置使用属性还是字段
				column=""  表的列名
				length=""  长度
				type="" 类型
			<generator> class属性用于设置主键生成策略
				1.increment 由hibernate自己维护自动增长
					底层通过先查询max值,再+1策略
					不建议使用,存在线程并发问题
				2.identity hibernate底层采用数据库本身自动增长列
					例如:mysql auto_increment
				3.sequence hibernate底层采用数据库序列
					例如:oracle 提供序列
				4.hilo 
					
		        	</generator>
				5.native 根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个。【】
				##以上策略使用整形,long, short 或者 int 类型
				6.uuid 采用字符串唯一值【】
				##以上策略 代理主键,有hibernate维护。
				7.assigned 自然主键,由程序自己维护。【】

 
 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值