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(); } } } }
时间: 2024-10-07 07:42:02