码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate

时间:2015-09-06 23:13:13      阅读:573      评论:0      收藏:0      [点我收藏+]

标签:

1. Hibernate基础

1.1 Hibernate与JDBC的优缺点

Hibernate

   优点
      1、比较简单
      2、数据缓存:一级缓存    二级缓存   查询缓存
      3、移植性比较好
   缺点
      1、因为sql语句是hibernate内部生成的,所以程序员干预不了,不可控
      2、如果数据库特别大,不适合用hibernate

JDBC

   缺点
  1、查询代码特别繁琐
  2、重复性代码特别多,频繁的try,catch
  3、数据的缓存
  4、sql的移植性不好
   优点
     速度比较快
     把控性比较好

1.2 持久化类与数据库表的对应

技术分享

1.3 hibernate配置文件两种加载方式

技术分享

技术分享

1.4 映射文件

Person.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!-- 
		class用来描述一个持久化类
			name  类的全名
		 	table 可以不写  默认值和类名一样 
		 	catalog  数据库的名称  一般不写
	 -->
	<class name="cn.itcast.hibernate.sh.domain.Person">
		<!-- 
			标示属性  和数据库中的主键对应
				name  属性的名称
				column 列的名称
		 -->
		<id name="pid" column="pid" length="200" type="java.lang.Long">
			<!-- 
				主键的产生器
				  	就该告诉hibernate容器用什么样的方式产生主键
			 -->
			<generator class="increment"></generator>
		</id>
		
		<!-- 描述一般属性-->
		<property name="pname" column="pname" length="20" type="string"></property>	
		<property name="psex" column="psex" length="10" type="java.lang.String"></property>
	</class>
</hibernate-mapping>



1.5 配置文件


hibernate.cfg.xml

<?xml version=‘1.0‘ encoding=‘utf-8‘?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<!-- 
		一个session-factory只能连接一个数据库
	-->
<session-factory>
	<!-- 数据库的用户名 -->
	<property name="connection.username">root</property>

	<!-- 密码 -->
	<property name="connection.password">root</property>

	<!-- url -->
	<property name="connection.url">
		jdbc:mysql://localhost:3306/itcast_sh_hibernate
	</property>
	
	<!-- 
		作用:根据持久化类和映射文件生成表
		validate
		create-drop
		create
		update
	-->
	<property name="hbm2ddl.auto">update</property>
	
	<!-- 
		显示hibernate内部生成的sql语句
	-->
	<property name="show_sql">true</property>
	
	<!-- 引入映射文件 -->
	<mapping resource="cn/itcast/hibernate/sh/domain/Person.hbm.xml" />

</session-factory>
</hibernate-configuration>

1.6 hibernate的加载流程

技术分享

技术分享

技术分享

1.7 hibernater的原理

    简要概括:

    根据客户端(哪种操作)、持久化类(操作的对象)、映射文件(表中的结构)生成sql语句,在内部进行jdbc的curd操作。

1.8 curd操作


package cn.itcast.hibernate.sh.test;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Session;

import org.hibernate.Transaction;
import org.junit.Test;

import cn.itcast.hibernate.sh.domain.Person;
import cn.itcast.hibernate.sh.utils.HiberanteUtils;

public class PersonTest extends HiberanteUtils{
	
	/**
	 * 保存  save()
	 */
	@Test
	public void testSavePerson(){
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		
		Person person = new Person();
		person.setPname("上海第一期班长");
		person.setPsex("女");
		
		/**
		 * 【数必须持久化对象】person
		 */
		session.save(person);
		
		transaction.commit();
		session.close();
	}
	
	/**
	 * 查询所有记录   createQuery()方法
	 * session.createQuery("from Person").list();
	 */
	@Test
	public void testQueryPerson(){
		Session session = sessionFactory.openSession();
		List<Person> personList = session.createQuery("from Person").list();
		for(Person person:personList){
			System.out.println(person.getPname());
		}
		session.close();
	}
	
	/**
	 * 根据主键查询一行记录   get方法()方法
	 * (Person)session.get(Person.class, 1L);
	 */
	@Test
	public void testQueryPersonByID(){
		Session session = sessionFactory.openSession();
		/**
		 * 按照主键的方式查询数据库表中的记录
		 * 第二个参数的类型必须和持久化类中标示符的类型保持一致
		 */
		Person person = (Person)session.get(Person.class, 1L);  //【1L】
		System.out.println(person.getPname());
		session.close();
	}
	
	
	/**
	 * 删除数据  delete()
	 * hibernate内部会检查标示符,看标示符中的值在数据库相应的表中有没有对应的记录,如果有,则删除
	 */
	@Test
	public void testDeletePerson(){
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		/**
		 * 【删除方法一】
		 * 1、根据id把值从数据库中查找出来
		 * 2、把对象删除掉
		 */
		//Person person = (Person)session.get(Person.class, 1L);
		//session.delete(person);
		
		/**
		 * 【删除方法二,把主键为2的删除了】
		 * 1、新创建一个person对象
		 * 2、给person对象的标示符赋值
		 * 3、调用session.delete方法删除
		 */
		Person person = new Person();
		person.setPid(2L);  //通过主键就可以确定要删除的记录了,不用再set这行其他字段
		session.delete(person);
		
		transaction.commit();
		session.close();
	}
	
	/**
	 * 修改数据
	 */
	@Test
	public void testUpdatePerson(){
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		
		/**
		 * 【修改方法一,最常用】
		 * 1、根据id把持久化对象提取出来
		 * 2、进行修改
		 * 3、执行upate操作
		 */
		//Person person = (Person)session.get(Person.class, 1L);
		//person.setPsex("不详");
		
		/** 【修改方法二,】
		 * 注意:这种方法并不好
		 * person.setPid(1L);后,数据库中这一行的数据出主键外,全为null了。
		 * 如果修改了某个值,其他全要跟着修改
		 * 
		 * */
		Person person = new Person();
		person.setPid(1L);
		session.update(person);
		
		transaction.commit();
		session.close();
	}
}



1.9 不同的持久化对象,标识符必须得一样,否则报错



/**
	 * 不同的持久化对象,标识符必须得不一样
	 * 在hibernate中,不允许出现这种情况:两个持久化对象,但是标示符的值一样

	 */
	@Test
	public void testIdentity(){
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		
		Person person = (Person)session.get(Person.class, 1L);//person--1L
		Person person2 = new Person();
		person2.setPid(1L); // person2---1L
		
		
		session.update(person2);
		
		transaction.commit();
		session.close();
	}



技术分享







Hibernate

标签:

原文地址:http://my.oschina.net/ilaoda/blog/501920

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!