利用Hibernate3.6.10进行CRUD操作
2014-04-07 23:11
411 查看
你看这里的增加操作,没写hql语句,是通过对象进行设置值的,这就是hibernate的好处
@Test
publicvoid testaddPerson(){
Personp = new Person();
p.setName("陈星宇1");
p.setBirthday(newDate());
p.setGender("男性");
Sessionsession = HibernateUtil.getSession();
Transactiontx = session.beginTransaction();开启事务
session.save(p);//准备执行sql语句
System.out.println(p.getName());执行到这,控制台会打印insert语句,但是数据库不会有数据
tx.commit();提交事务
session.close();执行到这,数据库中才有数据,刷新数据库可以看到
System.out.println(p);
}
import java.io.Serializable;
//假设:没有重名的学生
public class Student implementsSerializable{
privateString firstName;//Primary key
privateString secondName;//Primary key
privateString gender;
publicString getFirstName() {
returnfirstName;
}
publicvoid setFirstName(String firstName) {
this.firstName= firstName;
}
publicString getSecondName() {
returnsecondName;
}
publicvoid setSecondName(String secondName) {
this.secondName= secondName;
}
publicString getGender() {
returngender;
}
publicvoid setGender(String gender) {
this.gender= gender;
}
}
配置文件student.hbm.xml
以下也没有写hql语句,使用get方法进行查询
//按照联合主键查询实体
@Test
publicvoid testQueryStudent(){
Sessionsession
= HibernateUtil.getSession();
//设置联合主键
Students1 = new Student();
s1.setFirstName("zhting");
s1.setSecondName("w");
Students = (Student) session.get(Student.class,s1);//联合主键:使用实体类自身作为条件
System.out.println(s);
session.close();
}
以上的刷出是指把数据更新到数据库,不刷出是不把数据更新(同步)到数据库
1.增加一条数据,需要加入事务
package com.itheima.util; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; //Hibenate工具类 public class HibernateUtil { private static SessionFactory sessionFactory; static{ Configuration cfg = new Configuration().configure(); sessionFactory = cfg.buildSessionFactory(); } public static Session getSession(){ return sessionFactory.openSession(); } public static void main(String[] args) { Session s = getSession(); s.close(); } } |
@Test
publicvoid testaddPerson(){
Personp = new Person();
p.setName("陈星宇1");
p.setBirthday(newDate());
p.setGender("男性");
Sessionsession = HibernateUtil.getSession();
Transactiontx = session.beginTransaction();开启事务
session.save(p);//准备执行sql语句
System.out.println(p.getName());执行到这,控制台会打印insert语句,但是数据库不会有数据
tx.commit();提交事务
session.close();执行到这,数据库中才有数据,刷新数据库可以看到
System.out.println(p);
}
2.按照联合主键查询实体
package com.itheima.domain;import java.io.Serializable;
//假设:没有重名的学生
public class Student implementsSerializable{
privateString firstName;//Primary key
privateString secondName;//Primary key
privateString gender;
publicString getFirstName() {
returnfirstName;
}
publicvoid setFirstName(String firstName) {
this.firstName= firstName;
}
publicString getSecondName() {
returnsecondName;
}
publicvoid setSecondName(String secondName) {
this.secondName= secondName;
}
publicString getGender() {
returngender;
}
publicvoid setGender(String gender) {
this.gender= gender;
}
}
配置文件student.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 package="com.itheima.domain"> <!-- 加入:mutable="false"等同所有的字段进行更新时,都被忽略 --> <class name="Student" table="STUDENT" > <!-- 定义联合主键 --> <composite-id> <key-property name="firstName" column="FIRST_NAME"></key-property> <key-property name="secondName" column="SECOND_NAME"></key-property> </composite-id> <!-- insert=false,插入数据时,忽略此字段 update="false",更新数据时,忽略此字段 --> <property name="gender" column="GENDER"></property> </class> </hibernate-mapping> |
//按照联合主键查询实体
@Test
publicvoid testQueryStudent(){
Sessionsession
= HibernateUtil.getSession();
//设置联合主键
Students1 = new Student();
s1.setFirstName("zhting");
s1.setSecondName("w");
Students = (Student) session.get(Student.class,s1);//联合主键:使用实体类自身作为条件
System.out.println(s);
session.close();
}
3.Hibernate中持久化对象的三种状态及他们之间的相互转换
4.hibernate的缓存
//Session的缓存:一级缓存 public class HibernateDemo3 { //证明缓存的存在 @Test public void testaddStudent(){ Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Person p1 = (Person) session.get(Person.class, 1);//OID一样 Person p2 = (Person) session.get(Person.class, 1);//OID一样.因为缓存中有该对象,直接取,不会再次去数据库查询 System.out.println(p1==p2);//true tx.commit(); session.close(); } //一级缓存的管理 /* * session.flush():刷新缓存(同步数据库)。缓存中数据还在 * session.clear():清空缓存。 * session.evict():清空指定的实体 */ @Test public void testSessionManager1(){ Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Person p1 = (Person) session.get(Person.class, 1);//得到持久对象,放入Session的缓存中 System.out.println(p1); // session.flush();//只是更新数据库.缓存中数据还在 // session.clear();//清空缓存 session.evict(p1);//从缓存中清除指定的实体 Person p2 = (Person) session.get(Person.class, 1); System.out.println(p2); tx.commit(); session.close(); } //快照: //commit时会刷新 @Test public void testSessionManager2(){ Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Person p1 = (Person) session.get(Person.class, 1);//得到持久对象,放入Session的缓存中 p1.setName("陈星宇2");//刷新数据库数据只能刷新持久胎实体 tx.commit();//此时进行同步数据库 session.close(); } @Test //手工flush会刷新 public void testSessionManager3(){ Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Person p1 = (Person) session.get(Person.class, 1);//得到持久对象,放入Session的缓存中 p1.setName("陈星宇");//刷新数据库数据只能刷新持久胎实体 session.flush();//同步数据库 tx.commit();//此时进行同步数据库 session.close(); } @Test //执行Query的查询时,也会自动把改变的实体类同步到数据库中 public void testSessionManager4(){ Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Person p1 = (Person) session.get(Person.class, 1);//得到持久对象,放入Session的缓存中 p1.setName("陈星宇1");//刷新数据库数据只能刷新持久态实体 Query q = session.createQuery("from Person");//一条强制性的sql语句 System.out.println(q.list().get(0)); session.flush();//同步数据库 tx.commit();//此时进行同步数据库 session.close(); } @Test //验证刷新模式 public void testSessionManager5(){ Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); // session.setFlushMode(FlushMode.COMMIT);//事务提交和手工flush时。查询时不会刷 // session.setFlushMode(FlushMode.MANUAL);//事务提交和手工flush时。查询时不会刷 Person p1 = (Person) session.get(Person.class, 1);//得到持久对象,放入Session的缓存中 p1.setName("陈星宇");//刷新数据库数据只能刷新持久胎实体 Query q = session.createQuery("from Person");//一条强制性的sql语句 System.out.println(q.list().get(0));//从缓存中取得 tx.commit();//此时进行同步数据库 session.flush();//同步数据库 session.close(); } //refresh:用数据库中的数据覆盖掉缓存中的数据 @Test public void testSessionManager6(){ Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Person p1 = (Person) session.get(Person.class, 1);//得到持久对象,放入Session的缓存中 p1.setName("陈星宇"); session.refresh(p1);//用数据库中的数据覆盖掉缓存中的数据 tx.commit();//此时进行同步数据库 session.close(); } } |
5.hibernate中Session接口常用的方法(CUD增删改)
//Session的常用方法 public class HibernateDemo1 { //如果实体类的主键是代理主键。手工设置的id是无效的 //save:瞬时--->持久 @Test public void test1(){ Person p = new Person(); p.setName("王东"); p.setBirthday(new Date()); p.setGender("女性"); Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); p.setId(100);//不管用的。 s.save(p);//计划执行一条插入语句 p.setId(10);//会报错。此时的p对象是持久态,不允许改ID的。 tx.commit();//真正执行。FlushMode.AUTO. s.close(); } //update:脱管--->持久 //如果只在脱管对象发生了变化再执行更新。<class name="com.itheima.domain.Person" table="PERSON" select-before-update="true"> @Test public void test2(){ Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); Person p = (Person)s.get(Person.class, 1);//持久态 s.evict(p);//脱管 p.setName("星宇"); s.update(p);//如果是一个脱管对象,不管有没有改变,都会执行update语句 tx.commit();//真正执行。FlushMode.AUTO. s.close(); } //<class name="com.itheima.domain.Person" table="PERSON"> //saveOrUpdate() //对象是瞬时态:OID为null,执行save。判断配置文件<id name="id" column="ID" unsaved-value="1"> //对象是脱管:OID有,执行update @Test public void test3(){ Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); //脱管-->持久:update // Person p = (Person)s.get(Person.class, 1);//持久态 // s.evict(p);//脱管 // p.setName("星宇"); // s.saveOrUpdate(p);//如果是一个脱管对象,不管有没有改变,都会执行update语句 //瞬时--->持久:save Person p = new Person(); p.setName("杨显彬"); p.setBirthday(new Date()); p.setGender("女性"); s.saveOrUpdate(p);//执行save tx.commit();//真正执行。FlushMode.AUTO. s.close(); } //<id name="id" column="ID" unsaved-value="1"> @Test public void test4(){ Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); Person p = (Person)s.get(Person.class, 1); s.evict(p); s.saveOrUpdate(p);//insert。<id name="id" column="ID" unsaved-value="1">如果id为1,框架会把它当做瞬时对象来对待 tx.commit();//真正执行。FlushMode.AUTO. s.close(); } //saveOrUpdate():如果操作的是一个持久态对象,则不会发生变化 @Test public void test5(){ Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); Person p = (Person)s.get(Person.class, 1); s.saveOrUpdate(p); tx.commit(); s.close(); } //get和load的区别: // 1、get立即检索;load是延迟检索(代理类) // 2、get如果获取id数据库中不存在的记录,返回null;load会抛出异常 @Test public void test6(){ Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); // Person p = (Person)s.get(Person.class, 100);//打印null Person p = (Person)s.load(Person.class, 100);//抛异常 System.out.println(p); tx.commit(); s.close(); } //delete:持久变为瞬时 @Test public void test7(){ Session s = HibernateUtil.getSession(); Transaction tx = s.beginTransaction(); Person p = (Person)s.load(Person.class, 1); s.delete(p);//计划执行删除语句 tx.commit();//真正执行 s.close(); } } |
相关文章推荐
- hibernate对数据库进行CRUD操作
- Spring和hibernate集成写API进行CRUD操作
- hibernate 逆向工程对数据库进行CRUD操作
- 【SSH三大框架】Hibernate基础第五篇:利用Hibernate完毕简单的CRUD操作
- SpringBoot入门-6(利用jpa连接hibernate,并进行生成表,对表的增加,删除,查询操作)
- 【框架】[Hibernate]利用Hibernate进行一对多的级联操作-Web实例
- 利用java的可序列化IO流仿数据库原理进行CRUD操作。
- 【SSH三大框架】Hibernate基础第五篇:利用Hibernate完成简单的CRUD操作
- 【SSH三大框架】Hibernate基础第五篇:利用Hibernate完毕简单的CRUD操作
- WinForm中利用DataGridView控件对数据进行批量操作
- SpringMVC案例1——对User表进行CRUD操作
- IE浏览器利用ActiveXObject对象对文件系统进行操作
- 利用FILE结构对文件进行操作
- JAVA读取XML文件并利用该文件对数据库进行配置操作
- 利用JNI进行对象操作
- hibernate使用annotation进行持久化操作(三)
- Hibernate对单表的CRUD操作
- 利用C#事务处理对数据库进行多重操作
- 利用JDK7的NIO2.0进行I/O读写和文件操作监控
- Hibernate框架对mysql数据库进行CRUD(增改改删)