hibernate初步

package cn.bdqn.test;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

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 cn.bdqn.bean.Student;
import cn.bdqn.util.HibernateSessionFactory;

public class HibernateTest {

    // 新增一个学生信息
    @Test
    public void addStudent() {
        // 获取配置文件 hibernate.cfg.xml
        Configuration configuration = new Configuration().configure();
        // 创建咱们的sessionFactory
        SessionFactory factory = configuration.buildSessionFactory();
        // 打开session
        Session session = factory.openSession();
        // 开启事务
        Transaction transaction = session.beginTransaction();
        /*
         * 开始新增操作 创建一个学生对象
         */
        for (int i = 4; i < 15; i++) {
            Student stu = new Student(i, "强"+i, "坚强"+i);
            // 保存学生信息到数据库
            session.save(stu);
        }
        // 提交事务
        transaction.commit();
        // 关闭session
        session.close();
    }

    // 查询指定学生信息 get()立即加载 把所需要的对象 session load()延迟加载 hibernate默认的 使用的使用
    @Test
    public void findStudent() {
        /*
         * get()和load()方法:从数据库中取得持久化对象(已经记载在怎们的session缓存中)!
         * student就是一个持久化对象(持久态) session.close(); student就变成了游离态!
         * 
         * 
         * 01.get(): hibernate回去确认ID(主键标识符)在数据库中是否存在,首先会去session
         * 中查找,也就是一级缓存中去查找!如果没有,再去二级缓存中查找,如果再没有,就去 数据库中查询,仍然还没有找到,就返回一个NULL!
         * 
         * 02.load(): hibernate就会认为咱们所查找的ID一定存在!首先会去session中查找,如果没有找到
         * ,hibernate会根据lazy属性的值是否使用延迟加载,如果是,就返回该代理对象,如果没有找到,
         * 再去二级缓存中查找,再去数据库,再没有,报ObjectNotFoundException;
         */

        // 获取配置文件 hibernate.cfg.xml
        Configuration configuration = new Configuration().configure();
        // 创建咱们的sessionFactory
        SessionFactory factory = configuration.buildSessionFactory();
        // 打开session
        Session session = factory.openSession();
        // 查询指定的学生
        /*
         * 如果load想实现象get() 必须在配置文件中加上 lazy="false"
         */
        Student student = (Student) session.load(Student.class, 4);
        // 输出学生信息
        System.out.println(student + "*********1");
        // 关闭session
        session.close();
    }

    // 修改学生信息
    @Test
    public void updateStudent() {
        /*
         * update(),saveOrUpdate以及merge()的区别
         * 
         * 01.update() 直接更新数据库,只有一条SQL,无论数据库中存不存在数据
         * 
         * 02.saveOrUpdate 001.数据库存在数据,先查询,后修改! 两条SQL 002.数据库不存在数据,先查询,后新增!
         * 两条SQL 03.merge 001.数据库存在数据,先查询,后修改! 两条SQL 002.数据库不存在数据,先查询,后新增! 两条SQL
         */

        /*
         * commit()方法执行之前默认进行Flush()清理缓存,Flush()清理缓存的时候会进行脏检查,之后把脏对象同步到数据库 脏对象:
         * 与之前session中存在的快照对比,发现对象的属性有变化,那么就是!!
         * 
         * flush():只是进行清理缓存!!
         */

        // 读取配置文件
        Configuration configuration = new Configuration().configure();
        // 创建工厂
        SessionFactory factory = configuration.buildSessionFactory();
        // 打开session
        Session session = factory.openSession();
        // 开启事务
        Transaction transaction = session.beginTransaction();
        // 修改
        Student student = new Student(10, "光头强10", "李和强10");
        student.setName("管光头强");
        session.save(student);
        student.setName("管光头强2");
        // 事务的提交
        transaction.commit();
        // 关闭session
        session.close();
    }

    // 删除学生信息
    @Test
    public void deleteStudent() {
        // 读取配置文件
        Configuration configuration = new Configuration().configure();
        // 创建工厂
        SessionFactory factory = configuration.buildSessionFactory();
        // 打开session
        Session session = factory.openSession();
        // 开启事务
        Transaction transaction = session.beginTransaction();
        // 首先查询到要删除的对象
        Student student = (Student) session.load(Student.class, 6);
        // 删除
        session.delete(student);
        // 事务的提交
        transaction.commit();
        // 关闭session
        session.close();
    }

    // 使用list查询所有学生信息
    @Test
    public void testList() {
        // 获取session
        Session session = HibernateSessionFactory.getSession();
        // 编写HQL语句(from的是类)
        String hql = "from Student";
        // 创建Query
        Query query = session.createQuery(hql);
        // 使用list查询所有(只有一条查询语句)
        List list = query.list();
        // 遍历
        for (Object object : list) {
            System.out.println(object);
        }
    }

    // 使用iterate查询所有学生信息
    // 01.在没有缓存的情况下 执行N+1条sql语句 N代表数据 第一条只是查ID(主键标识符)
    @Test
    public void testIterate() {
        // 获取session
        Session session = HibernateSessionFactory.getSession();
        // 编写HQL语句(from的是类)
        String hql = "from Student";
        // 创建Query
        Query query = session.createQuery(hql);
        // 使用list查询所有
        Iterator list = query.iterate();
        // 遍历
        while (list.hasNext()) {
            Student object = (Student) list.next();
            System.out.println(object);
        }
    }

    // 使用iterate查询所有学生信息
    // 02.在有缓存的情况下 执行1条sql语句
    @Test
    public void testIterate2() {
        // 获取session
        Session session = HibernateSessionFactory.getSession();
        // 编写HQL语句(from的是类)
        String hql = "from Student";
        // 创建Query
        Query query = session.createQuery(hql);
        // 使用list查询所有
        List list2 = query.list();
        System.out.println("上面的sql是list查询的!!*************");
        // 清空缓存
        session.clear();
        Iterator list = query.iterate();
        // 遍历
        while (list.hasNext()) {
            Student object = (Student) list.next();
            System.out.println(object);
        }
    }

    // 按参数位置绑定
    @Test
    public void argTest1() {
        // 获取session shift +tab 前移
        Session session = HibernateSessionFactory.getSession();
        // 写HQL
        String hql = "from Student where id=?";
        // 创建query对象
        Query query = session.createQuery(hql);
        // 参数位置绑定
        // 01.setString()
        // query.setString(0, "1");
        // 02.setParameter
        query.setParameter(0, 2);
        // 执行查询
        Student stu = (Student) query.uniqueResult();
        System.out.println(stu);
        // 关闭session
        HibernateSessionFactory.closeSession();
    }

    // 按参数名称绑定
    @Test
    public void argTest2() {
        // 获取session shift +tab 前移
        Session session = HibernateSessionFactory.getSession();
        // 写HQL
        String hql = "from Student where name like :names";
        // 创建query对象
        Query query = session.createQuery(hql);
        // 参数名称绑定
        // 01.setString()
        // query.setString(0, "1");
        // 02.setParameter
        query.setParameter("names", "%强%");
        // 执行查询
        List list = query.list();
        for (Object object : list) {
            System.out.println(object);
        }
        // 关闭session
        HibernateSessionFactory.closeSession();
    }

    // 动态参数绑定
    @Test
    public void argTest3() {
        // 获取session shift +tab 前移
        Session session = HibernateSessionFactory.getSession();
        // 创建一个对象
        Student student = new Student();
        student.setName("%强%");
        // 编写HQL
        StringBuffer buffer = new StringBuffer("from Student s where 1=1 ");
        // 条件拼接
        if (student.getId() != null) {
            buffer.append(" and id=:id");
        }
        if (student.getName() != null) {
            buffer.append(" and name like :name");
        }
        if (student.getPassword() != null) {
            buffer.append(" and password=:password");
        }
        // 创建query对象
        Query query = session.createQuery(buffer.toString());
        // 通过setProperties()
        query.setProperties(student);
        List list = query.list();
        for (Object object : list) {
            System.out.println(object);
        }
        // 关闭session
        HibernateSessionFactory.closeSession();
    }

    // 投影查询 01.将每条查询结果封装成Object对象
    @Test
    public void ObjTest1() {
        // 获取session shift +tab 前移
        Session session = HibernateSessionFactory.getSession();
        // 写HQL
        String hql = "select name from Student";
        // 创建query对象
        Query query = session.createQuery(hql);
        // 查询
        List<Object> list = query.list();
        // 遍历
        for (Object object : list) {
            System.out.println(object);
        }
        // 关闭session
        HibernateSessionFactory.closeSession();
    }

    // 投影查询 02.将每条查询结果封装成Object数组
    @Test
    public void ObjTest2() {
        // 获取session shift +tab 前移
        Session session = HibernateSessionFactory.getSession();
        // 写HQL
        String hql = "select name,password from Student";
        // 创建query对象
        Query query = session.createQuery(hql);
        // 查询
        List<Object[]> list = query.list();
        // 遍历 [L 这是数组toString()的结果
        for (Object[] object : list) {
            System.out.print("name:" + object[0]);
            System.out.println("password:" + object[1]);
        }
        // 关闭session
        HibernateSessionFactory.closeSession();
    }

    // 投影查询 03.将每条查询结果通过构造函数封装成对象
    @Test
    public void ObjTest3() {
        // 获取session shift +tab 前移
        Session session = HibernateSessionFactory.getSession();
        // 写HQL,前提这个构造函数必须在Student类中存在
        String hql = "select new Student(name,password) from Student";
        // 创建query对象
        Query query = session.createQuery(hql);
        // 查询
        List<Student> list = query.list();
        // 遍历
        for (Student object : list) {
            System.out.println(object.getName());
        }
        // 关闭session
        HibernateSessionFactory.closeSession();
    }

    // 分页
    @Test
    public void pageList() {
        /*
         * pageIndex :当前页码
         * pageSize:  页大小(每页显示的数据)
         * totalCount:总记录数
         * totalPage: 总页数
         * 每页显示3条数据  按照id升序排列  查看第一页内容
         */
        // 获取session
        Session session = HibernateSessionFactory.getSession();
        //写一个hql排序
        String hql="from Student order by id";
        //创建query对象
        Query query = session.createQuery(hql);
        //查询总记录数
        String hqlCounts="select count(*) from Student";
        //执行
        int counts= ((Long)session.createQuery(hqlCounts).uniqueResult()).intValue();
        //页大小(每页显示的数据)
        int  pageSize=3;
        //求出总页数(总记录数%页大小==0)?(总记录数/页大小):(总记录数/页大小+1)
        int totalPage=(counts%pageSize==0)?(counts/pageSize):(counts/pageSize+1);
        //当前页
        Scanner scanner=new Scanner(System.in);
        System.out.println("亲:想看第几页?");
        int pageIndex=scanner.nextInt();
        //设置从第几页开始(当前页-1)*页大小
        query.setFirstResult((pageIndex-1)*pageSize);
        //设置每页显示多少条数据
        query.setMaxResults(pageSize);
        //查询
        List list = query.list();
        for (Object object : list) {
            System.out.println(object);
        } 
    }

    @Test
    public  void test111(){
        int a=10;
        int b=10;
        Integer c=10;
        Integer d=10;
        //底层有ValueOf(int value) -128  127之间的数字 是不会重新创建一个integer对象的! 
        Integer c1=128;
        Integer d1=128;
        System.out.println(a==b); //t
        System.out.println(a==c); //t
        System.out.println(c==d); //t
        System.out.println(c1==d1); //f
    }
}
原文地址:https://www.cnblogs.com/go4mi/p/5550568.html