/** * jdbc有常用的API * hibernate也有自己常用的API(核心) * 01.Configuration 类 :读取我们的核心配置文件----hibernate.cfg.xml * 接口 * 02.SessionFactory :初始化hibernate需要的各种参数! * jdbc.properties初始化一次! SessionFactory也是只需要初始化一次即可!写成单例! * * 03.Session:之前使用的HttpSession(用户session)! 现在的session叫会话session! * hibernate就是通过session来操作对象的(增删改查)以及创建事务对象! * 04.Tranaction :进行事务的处理 * 05.Query :hibernate中的查询接口(SQL,HQL) * 06.Criteria:hibernate中的查询接口,是对query进行了简单封装! * 更能体现使用的是面向对象的思想来操作数据库! */public class StudentTest { Session session=null; Transaction transaction=null; //在执行测试方法之前 先执行before @Before public void before(){ /** * 01.读取核心的配置文件 在src的根目录下面! 底层规定位置! * 在实例化Configuration对象的时候通过configure() * 去src根目录下面,寻找hibernate.cfg.xml文件 */ Configuration configuration=new Configuration().configure(); //02.创建sessionFactory SessionFactory sessionFactory = configuration.buildSessionFactory(); //03.打开session session = sessionFactory.openSession(); //04.开启事务 transaction= session.beginTransaction(); } //在执行测试方法之后 @After public void after(){ //07.提交事务 sql语句 整体的执行! transaction.commit(); //08.关闭session session.close(); //sessionFactory.close(); 验证hbm2ddl中的create-drop } //新增 @Test public void addStudent(){ //05.创建一个对象 Student student=new Student(500,5, "小白555"); //06.持久化操作---》将对象保存到数据库中 session.save(student); //不会产生 insert语句 } /** * 根据id删除指定的学生 * * 会产生 2条sql语句 * 01.根据id去数据库中查询 有没有对应的数据 * 02.根据id删除 指定delete语句 */ @Test public void delStudent(){ Student student=new Student(); student.setId(2); //给对象的ID赋值 //session对象的方法 delete删除 System.out.println("************"); session.delete(student); System.out.println("************"); } /** * 根据id修改指定的学生 * 只会执行一条update语句! * 如果数据库中没有指定id的数据,没效果!有 就更新! */ @Test public void updateStudent(){ Student student=new Student(); student.setId(1000); //给对象的ID赋值 System.out.println("************"); student.setAge(50); session.update(student); System.out.println("************"); } /** * 查询数据库中指定学生的信息 * 查询 不需要事务! * get和load的区别 * get: * 01.在get()立即产生一条sql语句 * 02.首先回去hibernate的1级缓存(session)中查询有没有对应的数据 * 如果有,直接返回,就不会访问数据库! * 如果没有,去2级缓存中查询(sessionFactory)中查询! * 如果2级缓存中也没有数据,则会产生一条select语句 访问数据库! * 03.如果数据库中存在该数据 则返回 * 04.没有对应的数据 返回 null */ @Test public void getStudent(){ //通过get()获取数据 System.out.println("****************"); Student student=(Student) session.get(Student.class, 200); System.out.println("****************"); System.out.println(student); } //验证不会访问数据库 @Test public void getStudent2(){ //通过get()获取数据 Student student=(Student) session.get(Student.class, 200); //被session管理 Student student2=(Student) session.get(Student.class, 200); //缓存中已经存在了 } /** * evict()从session缓存中 清除指定的对象 */ @Test public void evictStudent(){ //通过get()获取数据 Student student=(Student) session.get(Student.class, 200); //被session管理 Student student2=(Student) session.get(Student.class, 300); //被session管理 session.evict(student); //从session缓存中 清除student对象 /** * 有人认为:1级缓存中确实是清除了!但是2级缓存中应该没有清除吧? * 不是这么理解的! 2级缓存需要我们手工配置!不配置 就不存在2级缓存! */ student=(Student) session.get(Student.class, 200); //再次获取id为200的数据 } /** * clear() 从session缓存中 清除所有的对象 */ @Test public void clearStudent(){ //通过get()获取数据 Student student=(Student) session.get(Student.class, 200); //被session管理 Student student2=(Student) session.get(Student.class, 300); //被session管理 //session.clear(); //从session缓存中 清除所有对象 student=(Student) session.get(Student.class, 200); //再次获取id为200的数据 student2=(Student) session.get(Student.class, 300); //再次获取id为300的数据 } /** * load: 懒加载 * 01.不会立即产生sql语句 * 02.在用户使用真正对象的时候才去访问数据库! * 03.首先回去hibernate的1级缓存(session)中查询有没有对应的数据 * 如果有,直接返回,就不会访问数据库! * 如果没有,去2级缓存中查询(sessionFactory)中查询! * 如果2级缓存中也没有数据,则会产生一条select语句 访问数据库! * 04.如果数据库中存在该数据 则返回 * 05.没有对应的数据 返回 ObjectNotFoundException 异常 * 06.如果想实现和 get()一样的效果!怎么做? * 在对应的hbm.xml文件中的 class节点上 新增 lazy="false" 立即加载! */ @Test public void loadStudent(){ //通过load()获取数据 Student student=(Student) session.load(Student.class, 200); System.out.println("****************"); System.out.println(student); //产生sql语句 System.out.println("****************"); }}