当我们在学习hibernate必然会学习到增删查改,下面的是自己在学习过程涉及到的一些案例,所以张贴出来分享,也方便初学者学习。
hibernate与jdbc的关系,以及它们的【适合】的场合
jdbc:
1)如果项目中以面向关系的操作为主,可以使用jdbc
2)如果项目以少jar包运行,即轻便运行,可以使用jdbc
3)如果项目要求速度相对较快,可以使用jdbc
4)如果要将结果自动封装无要求的话,可以使用jdbc
5)如果项目要求省内存,可以使用jdbc
6)如果项目要求多查数据库,可以使用jdbc
hibernate:
1)如果项目中以面向对象的操作为主,可以使用hibernate
2)如果项目以多jar包运行,即重量运行,可以使用hibernate
3)如果项目要求速度相对一般,可以使用hibernate
4)如果要将结果自动封装有要求的话,可以hibernate
5)如果项目要求不省内存,可以使用jdbc
6)如果项目要求少查数据库,可以使用hibernate
c.u.r.d方法使用的细节
(A)session.save()
>>对象变成了持久化状态,位置session缓存中,有OID,可与数据库交互
>>根据映射文件的主健生成策略,由hibernate自动为PO对象分配id属性值,程序员需提交set和get方法
>>计划生成一个完成SQL语句
>>此时,并没有与数据库交互,只有事务提交后,才与数据库交互
(B)update()
>>持久状态对象和游离状态对象操作update()方法,变成持久状态对象
>>save() + update() = saveOrUpload(),即该方法包话save()和update()二种功能
>>当update()方法关联一个游离对象时,如果这时Session缓存中已经存在相同OID的持久化对象, 会抛出异常
结论:session中的PO对象,必须有唯一的OID值,决不能相同
>>当update()方法关联一个游离对象时,如果在数据库中不存在相应的记录,会抛出异常.
结论:session中的PO对象,一定要与表中记录一一对应
>>session一级缓存中的持久化对象一定一定要与表中记录一一对应,不能多,也能少
(C)get()和load()的区别
get是立即查找:
get()如果找到了,返回:非NULL值
get()如果没到了,返回:NULL值
load()是延迟查找:
load()如果找到了,返回:非NULL值
load()如果没到了,返回:非NULL值
get的非NULL值是:与数据库交互后,真真正正的实在值,真值
load的非NULL值是:没与数据库交互,是一个代理对象,假值
此时,别信id属性值,
只有当你访问一个非id属性值时,才与数据库进行交互
所以,load方法比get方法,较晚查询数据库
项目中,一定要注意load()和get()的区别,灵活运用
get():如果项目中,要立即查询表,使用get方法,因为get要查数据库,
load():如果项目中,只是要用引用变量,并不用非id属性值,此时可以使用load(),因为load()暂不查数据库
(D)delete()
>>临时状态对象,持久状态对象,游离状态对象都可调用delete方法
>>删除状态的对象不能返回,只能等待GC回收
>>临时状态对象调用delete是可以删除对应记录的,但很危险
先准备写一个工具类HibernateUtils:
package example.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
private static SessionFactory sessionFactory;
private static ThreadLocal<Session> threadLocal;
static{
//创建configure配置文件hibernate.properties
Configuration cfg=new Configuration();
//加载映射文件hibernate.cfg.xml
cfg.configure();
//创建sessionFactory工厂对象
sessionFactory=cfg.buildSessionFactory();
threadLocal=new ThreadLocal<Session>();
}
//获取session对象
public static Session getSession(){
Session session=threadLocal.get();
if(session==null){
session=sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
//关闭的session对象必须是上面已经获取的session对象
public static void closeSession(){
//获取当前线程session对象
Session session =threadLocal.get();
if(session!=null){
session.close();
//将线程与session对象分离
threadLocal.remove();
}
}
}
接下来熟悉增删查改:
package example.dao;
import java.util.Date;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import example.domain.Person;
import example.utils.HibernateUtils;
public class PersonDao4 {
/**
* 增加一个对象
*/
@Test
public void addPerson(){
Person person=new Person(113, "小美", "女", new Date());
Session session=null;
Transaction ts=null;
try{
//创建session对象
//session= sessionFactory.openSession();
session=HibernateUtils.getSession();
//开启事务
ts= session.getTransaction();
//开始事务
ts.begin();
//保存对象到数据库
session.save(person);
ts.commit();
}catch (Exception e) {
// TODO: handle exception
ts.rollback();
e.printStackTrace();
}finally{
//session.close();
HibernateUtils.closeSession();
}
}
/**
* 根据id查询person
*/
@Test
public void findPersonById(){//查询可以不用那个事务
Session session=HibernateUtils.getSession();
Transaction ts= session.getTransaction();
try{
ts.begin();
Person person= (Person) session.get(Person.class, 1);
System.out.println(person.getName()+","+person.getGender()+","+person.getBirthday());
ts.commit();
}catch (Exception e) {
// TODO: handle exception
ts.rollback();
e.printStackTrace();
}finally{
//session.close();
HibernateUtils.closeSession();
}
}
/**
* 更新person
*/
@Test
public void updatePerson(){//更新必须要事务
Session session=HibernateUtils.getSession();
Transaction ts= session.getTransaction();
try{
ts.begin();
Person person= (Person) session.get(Person.class, 1);
System.out.println(person.getName()+","+person.getGender()+","+person.getBirthday());
person.setName("小钱");
session.update(person);
ts.commit();
}catch (Exception e) {
// TODO: handle exception
ts.rollback();
e.printStackTrace();
}finally{
//session.close();
HibernateUtils.closeSession();
}
}
/**
* 根据id删除person
*/
@Test
public void deletePersonById(){//
Session session=HibernateUtils.getSession();
Transaction ts= session.getTransaction();
try{
ts.begin();
Person person= (Person) session.get(Person.class, 1);
System.out.println(person.getName()+","+person.getGender()+","+person.getBirthday());
session.delete(person);
ts.commit();
}catch (Exception e) {
// TODO: handle exception
ts.rollback();
e.printStackTrace();
}finally{
//session.close();
HibernateUtils.closeSession();
}
}
/**
* 批量增加person
*/
@Test
public void addPersonAll(){//批量增加
Session session=HibernateUtils.getSession();
Transaction ts= session.getTransaction();
try{
ts.begin();
for(int i=0;i<=101;i++){
Person person= new Person(i+5, "小肖", "男", new Date());
session.save(person);
if(i%25==0){
ts.commit();
session.clear();//清空一级缓存
ts.begin();
}
}
//System.out.println(person.getName()+","+person.getGender()+","+person.getBirthday());
ts.commit();
}catch (Exception e) {
// TODO: handle exception
ts.rollback();
e.printStackTrace();
}finally{
//session.close();
HibernateUtils.closeSession();
}
}
/**
* //批量查找
*/
@Test
public void findAllPerson(){
Session session=HibernateUtils.getSession();
Transaction ts= session.getTransaction();
try{
ts.begin();
//使用hql语句查询
String hql="from Person";//这里的person是类名不是表名
Query query= session.createQuery(hql);//基于hql创建查询对象
//执行查询,封装到list集合中
List<Person> list= query.list();
for(Person p:list){
System.out.println(p.getName()+","+p.getGender()+","+p.getBirthday());
}
ts.commit();
}catch (Exception e) {
// TODO: handle exception
ts.rollback();
e.printStackTrace();
}finally{
//session.close();
HibernateUtils.closeSession();
}
}
/**
* 批量更新
*/
@Test
public void updateAllPerson(){//
Session session=HibernateUtils.getSession();
Transaction ts= session.getTransaction();
try{
ts.begin();
//使用hql语句更新
String hql="update Person set gender='男'";//这里的person是类名不是表名,gender是属性名
Query query= session.createQuery(hql);//基于hql创建查询对象
int res=query.executeUpdate();
System.out.println("受影响的行数:"+res);
ts.commit();
}catch (Exception e) {
// TODO: handle exception
ts.rollback();
e.printStackTrace();
}finally{
//session.close();
HibernateUtils.closeSession();
}
}
/**
* //批量删除
*/
@Test
public void deletePerson(){
Session session=HibernateUtils.getSession();
Transaction ts= session.getTransaction();
try{
ts.begin();
//使用hql语句更新
String hql="delete from Person";
Query query= session.createQuery(hql);//基于hql创建查询对象
int res=query.executeUpdate();
System.out.println("受影响的行数:"+res);
ts.commit();
}catch (Exception e) {
// TODO: handle exception
ts.rollback();
e.printStackTrace();
}finally{
//session.close();
HibernateUtils.closeSession();
}
}
/**
* 根据name查找
*/
@Test
public void findPersonByName(){
Session session=HibernateUtils.getSession();
Transaction ts= session.getTransaction();
String name="小美";
try{
ts.begin();
//使用hql语句查询
String hql="from Person p where p.name=?";
Query query= session.createQuery(hql);//基于hql创建查询对象
query.setString(0, name);//注意在hibernate的占位符是从0开始
Person p= (Person) query.uniqueResult();
if(p!=null){
System.out.println(p.getName()+","+p.getGender()+","+p.getBirthday());
}
ts.commit();
}catch (Exception e) {
// TODO: handle exception
ts.rollback();
e.printStackTrace();
}finally{
//session.close();
HibernateUtils.closeSession();
}
}
}