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 } }