public void insert(Fruit fruit){
Configuration config=new Configuration();
config.configure();//读配置文件
SessionFactory sf=config.buildSessionFactory();//得到工厂
Session session=sf.openSession();//得到session
Transaction tt=session.beginTransaction();//检查事务开启
session.save(fruit);//存储insert
tt.commit();//提交
session.close();//关闭资源
}
}
写测试类: 插入一个对象到数据库中
/**
* 知识点:
* hibernate基础:练习语法部分API和简单的映射关系
* 程序目标:
* 使用hibernate方法将对象进行持久化
* 实现数据库的增删改查
* API:
* 1.Configuration:这个类负责读取XML文档(映射配置文件)
* configure():读xml
* buildSessionFactory():创建一个生产session对象的工厂,其实是再次检查
* 因为hibernate和jdbc不一样,jdbc是如果不手动设置开启事务,那它
* 就是马上执行sql的,hibernate的不会马上执行,是事务提交后执行
* 默认情况下就是打开事务的状态,这里只是再检查以下
* 2.SessionFactory:负责生产session对象
* openSession():创建一个session
* 3.Session类:这个是主要的类,负责增删改查,开启事务等
* beginTransaction():产生一个事务对象(Transaction)
* save():增加相当于操作sql中的insert语句
* 4.Transaction类:负责管理事务的
* commit():提交一个事务
*
*/
package Yuchen.fristHbn.client;
import Yuchen.fristHbn.business.Biz.FruitManager;
import Yuchen.fristHbn.business.entity.Fruit;
public class Test {
public static void test1(){
Fruit fruit=new Fruit("lisi","hello",100);
// fruit.setName("zhangsan");
// fruit.setComments("hello");
// fruit.setPrice(100);
FruitManager fm=new FruitManager();
fm.insert(fruit);
}
public static void main(String[] args) {
// TODO 自动生成方法存根
Test t=new Test();
t.test1();
}
}
hibernate API(一):
Configuration: 读取配置文件信息用来初始化的
SessionFactory: 重量级对象,特点:消耗资源大,线程是安全,所以可以被共享
上面两个对象只实例化一个就行了,都是用于初始化的
Session: 线程是不安全的,所以要避免多个线程共享它,是轻量级的对象,使用后关闭
Session对象的状态:
顺态: 还没有被持久化,也就是说数据库中没有该对象的记录,并且Session中的缓冲区里没有这个对象的引用
持久态: 在数据库中有该对象的记录,并且在session中的缓冲区里有这个对象的引用,和顺态正好相反
游离态: 在数据库中有记录,但是不在session的缓冲区里
对象状态的转换:
做一个工具类,将hibernate中重复的代码包装起来:
package Yuchen.fristHbn.util;
//生产session对象的工具类
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HbnUtil {
private static SessionFactory sf;
static{
sf=new Configuration().configure().buildSessionFactory();
}
public static Session getSession(){
return sf.openSession();
}
}
完善FruitManager类:
package Yuchen.fristHbn.business.Biz;
//业务逻辑类:负责增删改查通过使用hibernate API进行
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import Yuchen.fristHbn.business.entity.Fruit;
import Yuchen.fristHbn.util.HbnUtil;
public class FruitManager {
public Integer insert(Fruit fruit){
Session session=HbnUtil.getSession();//通过工具更方便了
Integer id=null;
// Configuration config=new Configuration();
// config.configure();//读配置文件
// SessionFactory sf=config.buildSessionFactory();//得到工厂
// Session session=sf.openSession();//得到session
Transaction tt=session.beginTransaction();//检查事务开启
id=(Integer)session.save(fruit);//存储insert
tt.commit();//提交
session.close();//关闭资源
return id;
}
public Fruit selectId(Integer id){
Session session=HbnUtil.getSession();
Transaction t=session.beginTransaction();
Fruit fruit=(Fruit)session.get(Fruit.class, id);
t.commit();
session.close();
return fruit;
}
public void remove(Fruit fruit){
Session session=HbnUtil.getSession();
Transaction t=session.beginTransaction();
session.delete(fruit);
t.commit();
session.close();
}
}
测试对象状态的转换:
/**
* 知识点:
* hibernate基础:练习语法部分API和简单的映射关系
* 程序目标:
* 使用hibernate方法将对象进行持久化
* 实现数据库的增删改查
* API:
* 1.Configuration:这个类负责读取XML文档(映射配置文件)
* configure():读xml
* buildSessionFactory():创建一个生产session对象的工厂,其实是再次检查
* 因为hibernate和jdbc不一样,jdbc是如果不手动设置开启事务,那它
* 就是马上执行sql的,hibernate的不会马上执行,是事务提交后执行
* 默认情况下就是打开事务的状态,这里只是再检查以下
* 2.SessionFactory:负责生产session对象
* openSession():创建一个session
* 3.Session类:这个是主要的类,负责增删改查,开启事务等
* beginTransaction():产生一个事务对象(Transaction)
* save():增加相当于操作sql中的insert语句
* 4.Transaction类:负责管理事务的
* commit():提交一个事务
* test1():测试插入的功能
* test2():测试数据同步更新的功能
* test3():测试saveOrUpdate()
* test4():测试clear()和flush()
*/
package Yuchen.fristHbn.client;
import org.hibernate.Session;
import org.hibernate.Transaction;
import Yuchen.fristHbn.business.Biz.FruitManager;
import Yuchen.fristHbn.business.entity.Fruit;
import Yuchen.fristHbn.util.HbnUtil;
public class Test {
public void test1(){
Fruit fruit=new Fruit("lisi","hello",100);
// fruit.setName("zhangsan");
// fruit.setComments("hello");
// fruit.setPrice(100);
FruitManager fm=new FruitManager();
fm.insert(fruit);
}
public void test2(){
//测试同步更新的功能
Fruit fruit=new Fruit("meigui","hongse",70);//顺态
FruitManager fm=new FruitManager();
Fruit fruit2=new Fruit();
Integer id=fm.insert(fruit);
fruit2=fm.selectId(id);
System.out.println(fruit2.getFid());
System.out.println(fruit2.getName());
fruit.setName("ziluolan");//这里修改了对象
fruit2=fm.selectId(id);
System.out.println(fruit2.getFid());//但是结果没有更新
System.out.println(fruit2.getName());
//因为fruit在Integer id=fm.insert(fruit);后变成游离态了
//也就是说只有持久态才能实现同步更新
System.out.println(fruit.getFid());
System.out.println(fruit.getName());
}
public void test3(){
Session session=HbnUtil.getSession();
Transaction t=session.beginTransaction();
Fruit fruit=new Fruit("ziluolan","lanse",100);//顺态
Fruit fruit2=new Fruit();
FruitManager fm=new FruitManager();
session.save(fruit);//fruit在运行完此句后变为游离态
fruit2=(Fruit) session.get(Fruit.class, fruit.getFid());
//从数据库读并打印出来
System.out.println(fruit2.getFid()+":"+fruit2.getName());
session.saveOrUpdate(fruit);//如果该对象为游历态就更新数据库update
//否则就是顺态,增加insert
fruit2=(Fruit) session.get(Fruit.class, fruit.getFid());
//saveOrUpdate后再从数据库读并打印出来
System.out.println(fruit2.getFid()+":"+fruit2.getName());
//两个打印结果一样,saveOrUpdate方法判断如果id为null,就
//顺态,否则就是游离态
t.commit();
session.close();
}
public void test4(){
Session session=HbnUtil.getSession();
Transaction t=session.beginTransaction();
Fruit fruit=new Fruit("guihua","fense",300);//顺态
Fruit fruit2=new Fruit();
session.saveOrUpdate(fruit);//执行insert因为对象为顺态
// session.flush();
session.clear();//fruit变成游离态了,并且不会执行insert语句

