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
    }
}
时间: 2024-11-04 18:01:31

hibernate初步的相关文章

Hibernate技术(一)--Hibernate初步

Hibernate初步 ORM:在编写程序时,处理数据采用面向对象的方式,而保存数据却以关系型数据库的方式,因此需要一种能在两者之间进行转换的机制.这种机制称为ORM,ORM保存了对象和关系型数据库表的映射信息. Hibernate框架搭建 Hibernate3JAR包引入: antlr-2.7.6.jar 语言转换工具,实现HQL到SQL的转换 commons-collections-3.1.jar dom4j-1.6.1.jar 读写XML文件 hibernate3.jar 核心类库 hib

Hibernate初步部署

下载全套文件: hibernate-release-4.1.7.Final.zip 目录结构 Documentation文件夹下是开发帮助文档 Lib文件夹是开发使用的库,其中该文件夹下面的required目录是开发时必须导入的JAR文件: Project文件夹是项目源码文件 JDBC与Hibernate的比较: Hibernate的初步配置部署: 1.     创建web项目 2.     添加响应需要的Hibernate的jar包 3.     创建Java Bean业务实体类 4.    

hibernate初步2

Hibernate级联设计 数据库表之间的关系(主要关系有一对多.一对一.多对多)主要是从如下三个方面体现出来: 1.表体设计 2.实体类的设计 3.配置文件 以下是一些重要级联设计参数属性介绍: cascade级联操作,默认值为 none 1.none:只做级联查询 2.save-update:级联查询,级联插入和级联更新 3.delete:级联查询,级联删除 4.all:级联查询,级联插入,级联更新和级联删除 5.all-delete-orphan:基础主从表记录关系时,会把从表对应的记录一

Hibernate二次学习一----------搭建Hibernate

? 版权声明:本文为博主原创文章,转载请注明出处 [TOC] 1. 项目结构 本项目使用maven进行项目管理,搭建一个简单的Hibernate框架需要四步. 本项目未使用注解方式进行搭建 1.1 pom.xml 使用maven引入依赖jar包,若未使用maven,则自己下载所需jar包放到lib目录下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001

如何自学 Java 开发

如何自学 Java 开发? 568赞同反对,不会显示你的姓名 李艾米IT路上学习 568 人赞同 Java Web前端技术 HTML 入门视频课程 1 HTML 简介 2 HTML基本结构[ 3 HTML的BODY标签以及颜色的设定 4 HTML之br标签 5 HTML之p标签 6 HTML之pre标签. 7 HTML之center 8 HTML之引文标签 9 HTML之hr 10 HTML之address 11 HTML之meta 标签 12 HTML之特殊字符 13 HTML之注释 14 H

hibernate中缓存的初步认识

为什么实用缓存 目的是为了减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能. hibernate如果使用了缓存,在查询数据时,首先到缓存中去查找,如果找到就直接使用,找不到的时候就会从物理数据源中检索,所以,把频繁使用的数据加载到缓存区后,就可以大大减少应用程序对物理数据源的访问,使得程序的运行性能明显的提升. 查询时使用缓存的实现过程为:首先查询一级缓存中是否具有需要的数据,如果没有,查询二级缓存,如果二级缓存中也没有,此时再执行查询数据库的工作.要注意的是:此3种方式的查询速度

ssh(struts,spring,hibernate)开发的初步集成01--依赖

一.概念 SSH 通常指的是 Struts2 做前端控制器,spring 管理各层的组件,hibernate 负责持久化层. SSM 则指的是 SpringMVC 做前端控制器,Spring 管理各层的组件,MyBatis 负责持久化层. 二.构建流程 创建maven工程...在pom.xml文件中配置需要的依赖 <properties> <java-version>1.8</java-version> <junit-version>4.8.2</ju

Spring MVC + Hibernate的初步整合

今天突然想要做一个网站,打算采用SpringMVC(4.1.5.RELEASE)+Hibernate(4.3.8.Final)作为主要框架,来试试效果. 先贴出Maven的部分代码:                 <properties> <spring-version>4.1.5.RELEASE</spring-version> <hibernate-version>4.3.8.Final</hibernate-version>       

【笔记——hibernate】关于Hibernate 4.3.5的初步认识

连接数据库的一个框架,Orm框架的一种. 一.下载:http://hibernate.org/ 二.配置: 1.导入必须的包 hibernate-release-4.3.5.Final\lib\required(必须的jar) 如果需要时用annotataion的话,导入: hibernate-release-4.3.5.Final\lib\jpa(jap相关的jar) hibernate-release-4.3.5.Final\lib\jpa-metamodel-generator(jpa生成