import java.util.Arrays;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;
import com.itheima.a_hello.User;
//详解Session对象
public class SessionTest {
@Test
//Session对象 用于操作数据库
//增
public void fun1(){
//1加载配置
Configuration conf = new Configuration().configure();
//2 根据Configuration 配置信息创建 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 获得session
Session session = sf.openSession();
User u = new User();
u.setName("jerry");
u.setPassword("1234");
//调用Session的save方法保存对象到数据库中
session.save(u);
//关闭资源
session.close();
sf.close();
}
@Test
//Session对象 用于操作数据库
//改
public void fun2(){
//1加载配置
Configuration conf = new Configuration().configure();
//2 根据Configuration 配置信息创建 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 获得session
Session session = sf.openSession();
//打开事务
Transaction ts = session.beginTransaction();
//先查询出你要修改的对象
User user = (User) session.get(User.class, 1);
//在查询结果上,进行修改
user.setName("汤姆");
session.update(user);
//提交事务
ts.commit();
//关闭资源
session.close();
sf.close();
}
@Test
//Session对象 用于操作数据库
//删
public void fun3(){
//1加载配置
Configuration conf = new Configuration().configure();
//2 根据Configuration 配置信息创建 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 获得session
Session session = sf.openSession();
//打开事务
Transaction ts = session.beginTransaction();
//--------------------------------------------------------
//先查询出你要修改的对象
User user = (User) session.get(User.class,1);
/*User user = new User();
user.setId(1);*/
//根据ID删除
session.delete(user);
//---------------------------------------------------------
//提交事务
ts.commit();
//关闭资源
session.close();
sf.close();
}
@Test
//Session对象 用于操作数据库
//查询get
public void fun4(){
//1加载配置
Configuration conf = new Configuration().configure();
//2 根据Configuration 配置信息创建 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 获得session
Session session = sf.openSession();
//打开事务
Transaction ts = session.beginTransaction();
//--------------------------------------------------------
//先查询出你要修改的对象
User user = (User) session.get(User.class,3);
//---------------------------------------------------------
//提交事务
ts.commit();
//关闭资源
session.close();
sf.close();
System.out.println(user);
}
@Test
//Session对象 用于操作数据库
//查询 load
public void fun5(){
//1加载配置
Configuration conf = new Configuration().configure();
//2 根据Configuration 配置信息创建 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 获得session
Session session = sf.openSession();
//打开事务
Transaction ts = session.beginTransaction();
//--------------------------------------------------------
//先查询出你要修改的对象
User user = (User) session.load(User.class,3);
//---------------------------------------------------------
//提交事务
ts.commit();
//关闭资源
session.close();
sf.close();
System.out.println(user);//报错,没有session
}
//get: get方法被调用时立刻 发送sql语句查询
//load : 调用时并没有查询数据库,当我们需要使用该对象的时候,才查询数据
//------------------------------------------------------------------------------------------------------------
@Test
//Session对象 用于操作数据库
//查询所有User
public void fun6(){
//1加载配置
Configuration conf = new Configuration().configure();
//2 根据Configuration 配置信息创建 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 获得session
Session session = sf.openSession();
//打开事务
Transaction ts = session.beginTransaction();
//--------------------------------------------------------
//HQL语言 => Hibernate Query Language
//createQuery 传入hql语句查询
//select * from t_user;
Query query = session.createQuery("from com.itheima.a_hello.User");
//list 将语句执行,并返回结果
List<User> list = query.list();
System.out.println(list);
//---------------------------------------------------------
//提交事务
ts.commit();
//关闭资源
session.close();
sf.close();
}
@Test
//Session对象 用于操作数据库
//查询所有User
public void fun7(){
//1加载配置
Configuration conf = new Configuration().configure();
//2 根据Configuration 配置信息创建 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 获得session
Session session = sf.openSession();
//打开事务
Transaction ts = session.beginTransaction();
//--------------------------------------------------------
//Criteria 查询 => Hibernate独创的面向对象的查询=> 无语句
Criteria criteria = session.createCriteria(User.class);
//select * from t_user;
List<User> list = criteria.list();
System.out.println(list);
//---------------------------------------------------------
//提交事务
ts.commit();
//关闭资源
session.close();
sf.close();
}
@Test
//Session对象 用于操作数据库
//查询所有User
public void fun8(){
//1加载配置
Configuration conf = new Configuration().configure();
//2 根据Configuration 配置信息创建 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 获得session
Session session = sf.openSession();
//打开事务
Transaction ts = session.beginTransaction();
//--------------------------------------------------------
//原生的Sql查询
SQLQuery query = session.createSQLQuery("select * from t_user");
// addEntity 将查询结果封装到指定对象中
query.addEntity(User.class);
List<User> list = query.list();
System.out.println(list);
/*List<Object[]> list = query.list();
for(Object[] objs : list){
System.out.println(Arrays.toString(objs));
}*/
//---------------------------------------------------------
//提交事务
ts.commit();
//关闭资源
session.close();
sf.close();
}
//---------------------------------------------------------------------------
/*
* session.save();
* session.update();
* session.delete();
* session.get();
* session.load(); 对比get
* session.createQuery()
* session.createCritieria();
* session.createSqlQuery();
*
*/
//-------------------------------------------------------------------
//1 load方法.返回一个代理对象,获得其内容时,会查询数据库,是每次访问属性都会查询数据库吗?
//答:不是每次都查.代理对象中有一个标识是否被初始化的boolean型变量. 记录是否被初始化过.
//2 代理都是要基于接口的,用load方法返回的代理,就没有实现任何接口?
//答: java中的动态代理是基于接口. 而 Hibernate 是使用javassist-3.12.0.GA.jar 产生代理对象的.
// 该代理与被代理对象之间的关系是继承关系.与我们学的动态代理不是一种.所以不需要接口.
}
报错:
org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.itheima.a_hello.User. Expected: class java.lang.String, got class java.lang.Integer
修改:保持数据库的id类型和实体类中的id类型一致。
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
get 通过id查询,如果没有 null
load 通过id查询,如果没有抛异常