java框架篇---hibernate之CRUD操作
CRUD是指在做计算处理时的增加(Create)、读取(Retrieve)(重新得到数据)、更新(Update)和删除(Delete)几个单词的首字母简写.
下面列举实例来讲解这几个操作:
实体类:
package com.oumyye.model; public class Student { private long id; private String name; private Class c; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Class getC() { return c; } public void setC(Class c) { this.c = c; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + "]"; } }
package com.oumyye.model; import java.util.HashSet; import java.util.Set; public class Class { private long id; private String name; private Set<Student> students=new HashSet<Student>(); public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Student> getStudents() { return students; } public void setStudents(Set<Student> students) { this.students = students; } }
映射文件:
Student.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.oumyye.model"> <class name="Student" table="t_student"> <id column="stuId" name="id"> <generator class="native"/> </id> <property column="stuName" generated="never" lazy="false" name="name"/> <many-to-one cascade="save-update" class="com.oumyye.model.Class" column="classId" name="c"/> </class> </hibernate-mapping>
Class.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.oumyye.model"> <class name="Class" table="t_class"> <id column="classId" name="id"> <generator class="native"/> </id> <property column="className" generated="never" lazy="false" name="name"/> <set cascade="delete" inverse="true" name="students" sort="unsorted"> <key column="classId"/> <one-to-many class="com.oumyye.model.Student"/> </set> </class> </hibernate-mapping>
工具类:可以有myeclipse生成
package com.oumyye.util; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.AnnotationConfiguration; /** * Configures and provides access to Hibernate sessions, tied to the * current thread of execution. Follows the Thread Local Session * pattern, see {@link http://hibernate.org/42.html }. */ public class HibernateSessionFactory { /** * Location of hibernate.cfg.xml file. * Location should be on the classpath as Hibernate uses * #resourceAsStream style lookup for its configuration file. * The default classpath location of the hibernate config file is * in the default package. Use #setConfigFile() to update * the location of the configuration file for the current session. */ private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); private static org.hibernate.SessionFactory sessionFactory; private static Configuration configuration = new AnnotationConfiguration(); private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml"; private static String configFile = CONFIG_FILE_LOCATION; static { try { configuration.configure(configFile); sessionFactory = configuration.buildSessionFactory(); } catch (Exception e) { System.err.println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } private HibernateSessionFactory() { } /** * Returns the ThreadLocal Session instance. Lazy initialize * the <code>SessionFactory</code> if needed. * * @return Session * @throws HibernateException */ public static Session getSession() throws HibernateException { Session session = (Session) threadLocal.get(); if (session == null || !session.isOpen()) { if (sessionFactory == null) { rebuildSessionFactory(); } session = (sessionFactory != null) ? sessionFactory.openSession() : null; threadLocal.set(session); } return session; } /** * Rebuild hibernate session factory * */ public static void rebuildSessionFactory() { try { configuration.configure(configFile); sessionFactory = configuration.buildSessionFactory(); } catch (Exception e) { System.err.println("%%%% Error Creating SessionFactory %%%%"); e.printStackTrace(); } } /** * Close the single hibernate session instance. * * @throws HibernateException */ public static void closeSession() throws HibernateException { Session session = (Session) threadLocal.get(); threadLocal.set(null); if (session != null) { session.close(); } } /** * return session factory * */ public static org.hibernate.SessionFactory getSessionFactory() { return sessionFactory; } /** * return session factory * * session factory will be rebuilded in the next call */ public static void setConfigFile(String configFile) { HibernateSessionFactory.configFile = configFile; sessionFactory = null; } /** * return hibernate configuration * */ public static Configuration getConfiguration() { return configuration; } }
配置文件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"> <hibernate-configuration> <session-factory> <!--数据库连接设置 --> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="connection.url"> jdbc:mysql://localhost:3306/mytest </property> <property name="connection.username">root</property> <property name="connection.password">root</property> <!-- 方言 --> <property name="dialect"> org.hibernate.dialect.MySQL5Dialect </property> <!-- 控制台显示SQL --> <property name="show_sql">true</property> <!-- 自动更新表结构 --> <property name="hbm2ddl.auto">update</property> <mapping resource="com/oumyye/model/Class.hbm.xml" /> <mapping resource="com/oumyye/model/Student.hbm.xml" /> </session-factory> </hibernate-configuration>
测试类
package com.oumyye.service; import java.util.Iterator; import java.util.Set; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.oumyye.model.Class; import com.oumyye.model.Student; import com.oumyye.util.HibernateSessionFactory; public class StudentTest { private SessionFactory sessionFactory=HibernateSessionFactory.getSessionFactory(); private Session session; @Before public void setUp() throws Exception { session=sessionFactory.openSession(); // 生成一个session session.beginTransaction(); // 开启事务 } @After public void tearDown() throws Exception { session.getTransaction().commit(); // 提交事务 session.close(); // 关闭session } @Test public void testSaveClassAndStudent() { Class c=new Class(); c.setName("08计本"); Student s1=new Student(); s1.setName("张三"); s1.setC(c); Student s2=new Student(); s2.setName("李四"); s2.setC(c); session.save(s1); session.save(s2); } @Test public void testLoadClass(){ // Class c=(Class)session.load(Class.class, Long.valueOf(2)); Class c=(Class)session.load(Class.class, Long.valueOf(1)); System.out.println(c.getStudents()); } @Test public void testGetClass(){ // Class c=(Class)session.get(Class.class, Long.valueOf(2)); Class c=(Class)session.get(Class.class, Long.valueOf(1)); System.out.println(c.getStudents()); } @Test public void testUpdateClass(){ Session session1=sessionFactory.openSession(); session1.beginTransaction(); Class c=(Class)session1.get(Class.class, Long.valueOf(1)); session1.getTransaction().commit(); // 提交事务 session1.close(); Session session2=sessionFactory.openSession(); session2.beginTransaction(); c.setName("08计算机本科2"); session2.update(c); session2.getTransaction().commit(); // 提交事务 session2.close(); } <!--更新--> @Test public void testSaveOrUpdateClass(){ Session session1=sessionFactory.openSession(); session1.beginTransaction(); Class c=(Class)session1.get(Class.class, Long.valueOf(1)); session1.getTransaction().commit(); // 提交事务 session1.close(); Session session2=sessionFactory.openSession(); session2.beginTransaction(); c.setName("08计算机本科3"); Class c2=new Class(); c2.setName("09计算机本科3"); session2.saveOrUpdate(c); session2.saveOrUpdate(c2); session2.getTransaction().commit(); // 提交事务 session2.close(); } @Test public void testMergeClass(){ Session session1=sessionFactory.openSession(); session1.beginTransaction(); Class c=(Class)session1.get(Class.class, Long.valueOf(1)); session1.getTransaction().commit(); // 提交事务 session1.close(); Session session2=sessionFactory.openSession(); session2.beginTransaction(); Class c2=(Class)session2.get(Class.class, Long.valueOf(1)); c.setName("08计算机本科4"); session2.merge(c); session2.getTransaction().commit(); // 提交事务 session2.close(); } <!--删除--> @Test public void testDeleteStudent(){ Student student=(Student)session.load(Student.class, Long.valueOf(1)); session.delete(student); } }
Session的入门常用方法
- Query query = session.createQuery(hql):利用hql查询语句查询;
- Criteria critera = session.createCriteria(Class clazz);
- (3)Transaction tx = session.beginTransaction(); //开始事务;tx.commit()提交事务;
- session.close();//关闭Session,此后被session管理的持久化对象变为脱管状态;
- session.save(Object obj); //添加
- session.update(Object obj); //更新
- session.delete(Object obj); //删除
- Object obj = session.get(Class clazz,Serialiazble id); //根据主键查找记录并返回;
- Object obj = session.load(Class clazz,Serializable id); //和get方法效果一样,但是是懒加载,即在不使用他之前他不会返回对象;
博客地址: | http://www.cnblogs.com/oumyye/ |
博客版权: | 本文以学习、研究和分享为主,欢迎转载,转载请务必注明出处,谢谢合作。 如果文中有不妥或者错误的地方请指出。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! |