zoukankan      html  css  js  c++  java
  • 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();
    			}
    		}
    	}
    }
    

      

  • 相关阅读:
    TableDriven method code complete reading notes
    Fundamental data type Code complete reading notes(12)
    利用消息机制实现.NET AOP(面向方面编程)--利用RealProxy和消息接收器实现多截获
    Organizing straightline code Code complete reading notes(14)
    Statements Code complete reading notes
    The softwarequanlity landscape Code complete reading notes
    支持ViewState和ControlState压缩的页面基类(ASP.NET2.0)
    XPath遇上命名空间
    怎样让WinForms下DataGrid可以像ASP.NET下的DataGrid一样使用自定义的模板列
    检验密码强度的JS类
  • 原文地址:https://www.cnblogs.com/1020182600HENG/p/7424274.html
Copyright © 2011-2022 走看看