您的位置:首页 > 其它

利用Hibernate3.6.10进行CRUD操作

2014-04-07 23:11 411 查看


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();

}

}
你看这里的增加操作,没写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);

}

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>
以下也没有写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();

}

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();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: