hibernate Day2 案例代码

1、编写实体类Person

package com.icss.pojo;

public class Person {
	private int uid;
	private String uname;
	private String pword;
	private String addr;

	public int getUid() {
		return uid;
	}

	public void setUid(int uid) {
		this.uid = uid;
	}

	public String getUname() {
		return uname;
	}

	public void setUname(String uname) {
		this.uname = uname;
	}

	public String getPword() {
		return pword;
	}

	public void setPword(String pword) {
		this.pword = pword;
	}

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}

	@Override
	public String toString() {
		return "Person [uid=" + uid + ", uname=" + uname + ", pword=" + pword
				+ ", addr=" + addr + "]";
	}

}

  2、编写person.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">
<hibernate-mapping>
	<class name="com.icss.pojo.Person" table="t_person">
		<id name="uid" column="uid">
			<generator class="native"></generator>
		</id>
		<property name="uname" column="uname"></property>
		<property name="pword" column="pword"></property>
		<property name="addr" column="addr"></property>
	</class>
</hibernate-mapping>	

  3、编写hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>

	<session-factory>
		<!-- 配置数据库信息 必须配置 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_day01?useUnicode=true&characterEncoding=utf8</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		<!-- 配置数据库方言,就是针对不同的数据库有不同的sql标准 -->
		<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
		<!--下列是Database Explore绑定数据库连接时候定义的数据源名称吧 无关紧要的一个东西,其实就是 Diver name -->
		<property name="myeclipse.connection.profile">mysql</property>

		<!-- 配置hibernate信息 可选 -->
		<!-- 输出底层sql语句 -->
		<property name="show_sql">true</property>
		<!-- 输出底层sql语句并格式化 -->
		<property name="format_sql">true</property>
		<!-- 使得hibernate帮助我们创建表,因为表不会自己创建,需要我们进行配置使其自动创建 -->
		<property name="hibernate.hbm2ddl.auto">update</property>
		<!-- 把映射文件加载过来 -->
		<mapping resource="com/icss/pojo/person.hbm.xml" />
	</session-factory>

</hibernate-configuration>

  4、编写工具类

package com.icss.util;

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

public class HibernateUtils {
	private static SessionFactory sf = null;

	private HibernateUtils() {
		// TODO Auto-generated constructor stub
	}
	
	public static SessionFactory getSessionFactory(){
		if(sf==null){
			Configuration cfg=new Configuration().configure();
			sf=cfg.buildSessionFactory();
		}
		return sf;
	}
}  

       5、编写hibernate的增删改查     测试

package com.icss.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Ignore;
import org.junit.Test;

import com.icss.pojo.Person;
import com.icss.util.HibernateUtils;

public class HibernateCRUDCache {
/**
 * CRUD操作
 * 先解决中文问题,在配置数据连接时,指定编码类型,注意&即
 * <property name="hibernate.connection.url">
 * 		jdbc:mysql://localhost:3306/hibernate_day01?useUnicode=true&characterEncoding=utf8
 * </property>
 */

	@Test
	public void test1() {
		Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
		SessionFactory sf=cfg.buildSessionFactory();
		Session ss = sf.openSession();
		//开启事务
		Transaction tx = ss.beginTransaction();
 
		/**
		 * 添加      
		 * Person p=new Person('zs','123','shanghai');
		 * ss.save(p);
		 * 添加时,若是设置了已经存在的id,则save会自动处理id问题,是添加一条记录(id自增)
		 */
		
		/** 
		 * 查询
		 * 通过反射机制       指定使用具体的类和主键来找到对应的数据记录
		 * Person object = (Person)ss.get(Person.class, 10);
		 * System.out.println(object); 
		 */
		
		/**
		 * 修改
		 * 先查询指定要修改的对象,然后再修改
		 * 修改过程中,到person表中,根据id找到指定对象,然后执行update语句完成修改
		 *   Person p=(Person)ss.get(Person.class,13);
		 *   p.setUname("李四");
		 *   ss.update(p);
		 *   若修改时,id不是查询出来的,自己指定的,则要给出准确的id,且修改时,所有属性均要设置,否则为null
		 */
		
		/**
		 * 删除
		 * 先查询指定要修改的对象,然后再删除
		 * Person p = (Person)ss.get(Person.class,10);
		 * ss.delete(p);
		 */
		
		//一级缓存验证
		/**
  		System.out.println("--------------------");
		Person p = (Person)ss.get(Person.class,11);
		System.out.println(p);
		System.out.println("--------------------");
		Person p2 = (Person)ss.get(Person.class,11);
		System.out.println(p2);
		*/
		
		//一级缓存特性
		Person p = (Person)ss.get(Person.class,11);
		p.setUname("张三");
		p.setPword("000");
		p.setAddr("上海");
		
		tx.commit();
		
		ss.close();
		sf.close();
	}
}
/**
 * 实体类对象状态(概念)    有三种
 * 瞬时态:对象里没有id,对象与session没有关联,一般是添加操作
 * Person p=new Person('zs','123','shanghai');
 * ss.save(p);
 * 
 * 持久态:对象有id,对象与session有关联    查询操作
 * Person p = (Person)ss.get(Person.class,10);
 * 
 * 托管态:对象有id,但对象与session没有关联   自己创建的对象
 *       瞬时态与托管态的区别:瞬时态未指定id值,托管态指定了id,但都是自己创建对象
 *       注意:对自己创建的对象的指定id值时,save是添加操作,而saveOrUpdates是修改操作!
 *       
 * 在瞬时状态,saveOrUpdate是做insert操作
 * 在持久状态,saveOrUpdate是做update操作
 * 在托管状态,saveOrUpdate是做update操作
 */

         6、编写hibernate的事务     测试  

package com.icss.test;

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

import com.icss.pojo.Person;
import com.icss.util.HibernateUtils;

public class HibernateTransaction {

	@Test
	public void test1() {
		SessionFactory sf = null;
		Session ss = null;
		Transaction tx = null;
		try {
			sf = HibernateUtils.getSessionFactory();
			// 使用sessionFactory创建Session对象
			ss = sf.openSession();
			// 开启事务
			tx = ss.beginTransaction();
			// 添加功能
			Person p = new Person();
			p.setUname("王五");
			p.setPword("111");
			p.setAddr("黄埔");
			// 调用session对象的实现方法,完成添加
			ss.save(p);
			// 模拟一个异常
			int x = 10 / 0;
			// 提交事务
			tx.commit();
		} catch (Exception e) {
			// 输出异常信息
			//e.printStackTrace();
			// 有异常,则回滚事务
			/**
			 * 一直事务回滚失败的原因是数据库的原因,
			 * mysql数据库只有InnoDB引擎支持事务;
			 * 默认引擎是MyISAM,不支持事务,
			 * 所以,需要设置数据库的表结构为InnoDB;
			 * 即alter table 表名 ENGINE=InnoDB;
			 * 同时,将方言设置为MySQLInnoDBDialect
			 */
			if (tx != null) {
				ss.clear();
				tx.rollback(); 
				System.out.println("事务回滚!");
			}
		} finally {
			// 关闭资源
			if (ss != null && ss.isOpen()) {
				ss.close();
			}
			if (sf != null && !sf.isClosed()) {
				sf.close();
			}
		}
	}
}

  

原文地址:https://www.cnblogs.com/1020182600HENG/p/7424274.html