Hibernate(第一节)

Hibernate

第一个案例

1、hibernate中文:冬眠
2、持久化:数据从瞬时状态转化为持久状态
3、Hibernate:是一个轻量级的持久化框架。没有侵入性。是一个orm映射框架。简化了jdbc操作。极大了提高了开发效率。提供了缓存机制。强大的查询机制。支持多种数据库(数据库移植)。

映射规则:将类名映射数据库的表名
将类的属性名映射为表的字段名
将类的属性类型映射为表的字段的数据类型
将对象的属性映射为表的记录
在这里插入图片描述
a)新建java项目
b)导入相关jar包
antlr-2.7.7.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-4.0.5.Final.jar
hibernate-core-4.3.10.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
jandex-1.1.0.Final.jar
javassist-3.18.1-GA.jar
jboss-logging-3.1.3.GA.jar
jboss-logging-annotations-1.2.0.Beta1.jar
jboss-transaction-api_1.2_spec-1.0.0.Final.jar
mysql-connector-java-5.1.20-bin.jar
c)编写hibernate.cfg.xml文件

<hibernate-configuration>
	<session-factory>
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="connection.url">jdbc:mysql://localhost:3306/hibernate4</property>
		<property name="connection.username">root</property>
		<property name="connection.password">1234</property>
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
	</session-factory>
</hibernate-configuration>

d)编写实体类(pojo)

public class User {
	private int id;
	private String name;
	private int age;
	public User() {
	}
}

e)编写实体类的映射文件(*.,hbm.xml)—将映射文件加入到hibernate.cfg.xml

<hibernate-mapping
	package="cn.sxt.pojo">
	<class name="User" table="t_user">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<property name="age"/>
	</class>
</hibernate-mapping>

f)编写测试类

public class Test {
	public static void main(String[] args) {
		//读取src下hibernate.cfg.xml
		Configuration cfg = new Configuration().configure();
		//获取注册对象4.3的创建办法
		ServiceRegistry registry = new StandardServiceRegistryBuilder()
									.applySettings(cfg.getProperties())
									.build();
		SessionFactory factory = cfg.buildSessionFactory(registry);
		Session session = factory.openSession();
		//保存数据
		Transaction tx = session.beginTransaction();
		User u = new User("张三",22);
		session.save(u);
		tx.commit();
		session.close();
	}
}

配置文件讲解

1、hibernate.cfg.xml配置文件

<hibernate-configuration>
	<!-- session工厂的配置 -->
	<session-factory>
		<!-- jdbc配置 -->
		<property name="connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<property name="connection.url">
			<!-- url的两种配置方式 -->
			<!-- jdbc:mysql://localhost:3306/hibernate4-->
			jdbc:mysql:///hibernate4
		</property>
		<property name="connection.username">root</property>
		<property name="connection.password">root</property>
		<!-- 数据库方言
			hibernate支持多种数据库,通过设置方言hibernate才知道应该
			生成对应数据库的sql语句:hibernate支持的数据库的方言hibernate.properties文件中都有
		 -->
		<property name="dialect">
			org.hibernate.dialect.MySQL5Dialect
		</property>
		<!-- 打印hibernate生成的sql语句 -->
		<property name="show_sql">true</property>
		<!-- 格式化打印的sql语句 -->
		<property name="format_sql">true</property>
		<!-- 根据不同值,进行数据表表的操作
			create  每次执行 都删除原有表,然后创建新表
			create-drop 执行前创建表,执行后删除表
			update 如果有则不改变表,如果没有则创建
		 -->
		<property name="hbm2ddl.auto">update</property>
		<!-- 将所有映射文件添加到这里 -->
		<mapping resource="cn/sxt/pojo/User.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

2、*.hbm.xml映射文件讲解

<!-- 类的映射文件信息 -->
<!-- package指定类的包名 可以不配置 如果不配置 那么在配置class的name时需要指定该类所在包-->
<hibernate-mapping>
	<!-- class配置类  name指类名  table指定表名  如果不写,默认类名为表名-->
	<class name="cn.sxt.pojo.User" table="t_user">
		<!-- id主键的配置 name配置类的属性名
		     column数据库字段名 不写和属性名一致
		     type 指定属性的类型
		     length指定字段的长度
		-->
		<id name="id" column="id">
			<!-- 主键的生成策略
				increment 
					用于为long, short或者int类型生成 唯一标识。只有在没有其他进程往
				同一张表中插入数据时才能使用。 在集群下不要使用。 
				identity 
					对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL
				的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。 
				native -(如果是mysql自增,那么native和identity是一样)
					根据底层数据库的能力选择identity, sequence 或者hilo中的一个。 
				sequence 
					在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 
					而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。 
				<generator class="sequence">
					<param name="sequence">user_seq</param>
				</generator>
				assigned 
					让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时
					的默认生成策略。
			 -->
			<generator class="identity">
			</generator>
		</id>
		<!-- property是配置类的属性  name指属性名 -->
		<property name="name" length="40"/>
		<property name="age" />
	</class>
</hibernate-mapping>

HelloWorld的代码分析:
1、Test.java

public static void main(String[] args) {
		//读取src下hibernate.cfg.xml 如果不为configure指明参数 默认读取hibernate.cfg.xml
		Configuration cfg = new Configuration().configure();
		//3.x版本不需要ServiceRegistry
		//4.0 ServiceRegistryBuilder
		//获取注册对象4.3的创建办法
		ServiceRegistry registry = new StandardServiceRegistryBuilder()
									.applySettings(cfg.getProperties())
									.build();
		//SessionFactory是一个重量级对象 session的工厂 生命周期是进程级别的 支持集群 线程安全的
		SessionFactory factory = cfg.buildSessionFactory(registry);
		/*Session (org.hibernate.Session) 
			表示应用程序与持久储存层之间交互操作的一个单线程对象,
			此对象生存期很短。 其隐藏了JDBC连接,也是Transaction的工厂。
			 其会持有一个针对持久化对象的必选(第一级)缓存,在遍历对象图或者根据持久化标识查找对象时会用到
		   session支持数据库操作
		 * */
		Session session = null;
		//事务对象
		Transaction tx =null;
		try{
			session = factory.openSession();
			tx = session.beginTransaction();
			User u = new User("小红",22);
			//保存数据
			session.save(u);
			//提交事务
			tx.commit();
		}catch(Exception e){
			if(tx!=null)
			//回滚事务
			tx.rollback();
		}finally{
			if(session!=null)
				session.close();
		}
		factory.close();
	}

2、封装util

public class HibernateUtil {
	private static Configuration cfg=null;
	private static ServiceRegistry registry=null;
	private static SessionFactory factory=null;
	static{
		cfg = new Configuration().configure();
		registry = new StandardServiceRegistryBuilder()
					.applySettings(cfg.getProperties())
					.build();
		factory = cfg.buildSessionFactory(registry);
	}
	public static Session getSession(){
		return factory.openSession();
	}
}

3、常用操作

public class HibernateTest {
	//向数据库添加数据
	@Test
	public void testSave(){
		Session session = null;
		Transaction tx = null;
		try{
			session = HibernateUtil.getSession();
			//获取事务对象
			tx = session.getTransaction();
			//开启事务
			tx.begin();
			
			User u = new User("张学友",55);
			
			session.save(u);
			
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
			if(tx!=null)
				tx.rollback();
		}finally{
			if(session!=null)
				session.close();
		}
	}
	//获取数据
	@Test
	public void testGetById(){
		Session session = null;
		Transaction tx = null;
		try{
			session = HibernateUtil.getSession();
			//获取事务对象
			tx = session.getTransaction();
			//开启事务
			tx.begin();
			//获取对象   第一参数 是对象的类型  第二个参数是 主键值
			//User u = (User)session.get(User.class, 2);
			User u = (User)session.load(User.class, 2);
			System.out.println(u);
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
			if(tx!=null)
				tx.rollback();
		}finally{
			if(session!=null)
				session.close();
		}
	}
	//获取所有对象
	@Test
	public void testGetAll(){
		Session session = null;
		Transaction tx = null;
		try{
			session = HibernateUtil.getSession();
			//获取事务对象
			tx = session.getTransaction();
			//开启事务
			tx.begin();
			//查询所有
			List<User> list = session.createCriteria(User.class).list();
			for(User u:list){
				System.out.println(u);
			}
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
			if(tx!=null)
				tx.rollback();
		}finally{
			if(session!=null)
				session.close();
		}
	}
	//修改数据
	@Test
	public void testUpdate(){
		Session session = null;
		Transaction tx = null;
		try{
			session = HibernateUtil.getSession();
			//获取事务对象
			tx = session.getTransaction();
			//开启事务
			tx.begin();
			//获取对象   第一参数 是对象的类型  第二个参数是 主键值
			//User u = (User)session.get(User.class, 2);
			User u = (User)session.load(User.class, 2);
			u.setAge(60);
			//修改数据
			session.update(u);
			System.out.println(u);
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
			if(tx!=null)
				tx.rollback();
		}finally{
			if(session!=null)
				session.close();
		}
	}
	@Test
	public void testDelete(){
		Session session = null;
		Transaction tx = null;
		try{
			session = HibernateUtil.getSession();
			//获取事务对象
			tx = session.getTransaction();
			//开启事务
			tx.begin();
			//获取对象   第一参数 是对象的类型  第二个参数是 主键值
			//User u = (User)session.get(User.class, 2);
			User u = (User)session.load(User.class, 2);
			//删除对象
			session.delete(u);
			System.out.println(u);
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
			if(tx!=null)
				tx.rollback();
		}finally{
			if(session!=null)
				session.close();
		}
	}
}

hibernate对象生命周期

在这里插入图片描述
2、对象的3种状态:
a)临时状态/瞬时状态
该对象是新创建的;一个持久化状态的对象被删除;一个游离状态的数据被删除
b)持久化状态
对象从数据库中查询出来时,临时状态的数据被保存时,游离状态的数据被更新/锁定
c)游离状态
持久化状态的数据被(session)清理

3、对象生命周期案例一

@Test
	public void testSession(){
		Session session = null;
		//瞬时状态
		User u = new User("西毒",70);
		try{
			session = HibernateUtil.getSession();
			session.beginTransaction();
			//持久状态----做脏数据检查  将session数据和数据库同步
			session.save(u);
			u.setAge(80);
			//session.update(u);
			session.getTransaction().commit();
		}catch(Exception e){
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally{
			if(session!=null){
				
				session.close();
			}
		}
		//对象u是游离状态
		System.out.println("======"+u);
		
		try{
			session = HibernateUtil.getSession();
			session.beginTransaction();
			//删除
			session.delete(u);
			session.getTransaction().commit();
		}catch(Exception e){
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally{
			if(session!=null){
				
				session.close();
			}
		}
		//瞬时状态
		System.out.println("======"+u);
	}

4、对象生命周期案例二

@Test
	public void testGet(){
		Session session = null;
		User u =null;
		try{
			session = HibernateUtil.getSession();
			session.beginTransaction();
			//持久状态
			/*
			 * get 查询数据如果数据不存在则返回null
			 * load查询数据如果数据不存在则抛出异常
			 * */
			u = (User)session.get(User.class,4);
			//u = (User)session.load(User.class, 50);
			//瞬时状态
			session.delete(u);
			session.getTransaction().commit();
		}catch(Exception e){
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally{
			if(session!=null){
				
				session.close();
			}
		}
		System.out.println("===="+u);
		try{
			session = HibernateUtil.getSession();
			session.beginTransaction();
			//持久状态  save直接添加数据发出一条insert语句
			session.save(u);
			//saveOrUpdate 判断保存的对象是否有id,如果有则发出update语句
			//如果没有则发出insert语句
			//session.saveOrUpdate(u);
			session.getTransaction().commit();
		}catch(Exception e){
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally{
			if(session!=null){
				
				session.close();
			}
		}
	}
	@Test
	public void testDelete(){
		Session session = null;
		User u =null;
		try{
			session = HibernateUtil.getSession();
			session.beginTransaction();
			u = new User();
			u.setId(7);
			session.delete(u);
			session.getTransaction().commit();
		}catch(Exception e){
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally{
			if(session!=null){
				
				session.close();
			}
		}
	}
	@Test
	public void testUpdate(){
		Session session = null;
		User u =null;
		try{
			session = HibernateUtil.getSession();
			session.beginTransaction();
			u = new User();
			u.setId(3);
			u.setName("南帝");
			u.setAge(66);
			session.update(u);
			session.getTransaction().commit();
		}catch(Exception e){
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally{
			if(session!=null){
				
				session.close();
			}
		}
	}

5、总结:
临时状态:内存有,数据库没有
持久状态:内存有,session有,数据库有
游离状态:内存有,数据有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值