Hibernate第四天

1基于主键来进行映射

  1. 人和身份证的问题

    身份证这一端 人的这一端是不用配置的

      <hibernate-mapping package="com.qf.one2one">
        <class name="IdCard" table="t_idcard">
            <!--配置的是表里面的主键-->
            <id name="pId" type="java.lang.Integer">
                <!--下面这个表示的是要使用别的对象的主键来最为主键-->
                <generator class="foreign">
                    <!--下面的这个name值是不能改变的   后面的值 使用下面one2one的name的值就OK了-->
                    <param name="property">people</param>
                </generator>
            </id>
            <!--配置的是普通的列-->
            <property name="cardNum"></property>
    
            <!--是不是就要配置映射的关系了   constrained:表示的是要作为外键-->
            <one-to-one name="people" class="People" constrained="true" cascade="all"></one-to-one>
            </class>
        </hibernate-mapping>
    

2. 查询(HQL/SQL/Cretiria)

  1. hql的查询方式
    HQL—>Hibernate Query Language

    SQL—>本地的查询

    Cretiria查询:是Hibrnate的设计者为了方便 不会编写Sql语句的人使用的

    HQL(在Hibernate中使用最多的) 面向对象的查询 具有高的可移植性 和底层的表没有关系 即使有关系那也是间接性的关系 查询的时候直接查询的我们的JAVA对象

    HQL如何使用呢?

    将我们原来的SQL语句中的 表字段换成对象的属性 表的名字换成类的名字就OK了 (还是要SQL的基础)

    SQL—>本地的SQL查询(就是我们前面写的那种)

    Cretiria查询(面向对象的查询) 跟HQL一样 主要方便的是 不会SQL的人使用的

HQL查询

            //查询所有的数据
//  Query query=session.createQuery("select d from Dept d");

    //带条件的查询

//  Query query=session.createQuery("select d from Dept d  where d.deptId>2");

    //between   and 

//  Query query=session.createQuery("select d from Dept d  where d.deptId between 4 and 6");

    //查询数据并封装成对象

//  Query query=session.createQuery("select new Employ(e.empName,e.empAddress) from Employ e ");

    //模糊查询

    //Query query=session.createQuery("select new Employ(e.empName) from Employ e where empName like '%狗%'");


    //Query query=session.createQuery("select new Employ(e.empName) from Employ e where empName like ?");

    //query.setString(0,"%狗%");

    //给占位符整个名字
    /*Query query=session.createQuery("select new Employ(e.empName) from Employ e where empName=:empName");
    query.setParameter("empName","狗娃1");*/


    //分组查询(统计用户表里面  男和女的人数)
    Query query=session.createQuery("select u.gender,count(*) from User u group by u.gender");



    List list=query.list();

    System.out.println(list);

    session.close();
    /**
     * 分页查询
     * @throws Exception
     */
    @Test
    public void testFY() throws Exception {
        Session session=new Configuration().configure("config/hibernate.cfg.xml").buildSessionFactory().openSession();
        Query query=session.createQuery("select new User(u.uName,u.gender) from User u");
        //分页:获取一共有所少数据
       ScrollableResults results=query.scroll();
       //表示的是滚动到末尾
       results.last();
       //下面就可以获取一共的数据条目数了
       long count=results.getRowNumber()+1;
       //打印我们的一共的数据条目数
       System.out.println("获取到的一共的数据是:"+count);
       //接下来我们就应该设置  
       //分页查询的重点  要设置要从那一条数据查询   要查询多少条数据
       query.setFirstResult(1);
       query.setMaxResults(2);
       //接下来就应该查询数据了
       List list=query.list();
       System.out.println(list);
    }
    /**
     * 内连接查询
     * @throws Exception
     */
    @Test
    public void testInnerJoin() throws Exception {
        Session session=new Configuration().configure("config/hibernate.cfg.xml").buildSessionFactory().openSession();
        //Query query=session.createQuery("from Dept d inner join d.emps");
        Query query=session.createQuery("from Employ e inner join e.dept");

        List list=query.list();

        //以谁为主查询那么水谁就在前面

        for (Object object : list) {
            Object[] b =(Object[]) object;
            System.out.println(b[0]);
            System.out.println(b[1]);
        }

        //System.out.println(list);
    }
    /**
     * 左连接查询
     * @throws Exception
     */
    @Test
    public void testLeftJoin() throws Exception {
        Session session=new Configuration().configure("config/hibernate.cfg.xml").buildSessionFactory().openSession();
        //Query query=session.createQuery("from Dept d inner join d.emps");
        Query query=session.createQuery("from Dept d left join d.emps");

        List list=query.list();

        //以谁为主查询那么水谁就在前面

        for (Object object : list) {
            Object[] b =(Object[]) object;
            System.out.println(b[0]);
            System.out.println(b[1]);
        }

        //System.out.println(list);
    }

    @Test
    public void testRightJoin() throws Exception {
        Session session=new Configuration().configure("config/hibernate.cfg.xml").buildSessionFactory().openSession();
        //Query query=session.createQuery("from Dept d inner join d.emps");
        Query query=session.createQuery("from Dept d right join d.emps");

        List list=query.list();

        //以谁为主查询那么水谁就在前面

        for (Object object : list) {
            Object[] b =(Object[]) object;
            System.out.println(b[0]);
            System.out.println(b[1]);
        }

        //System.out.println(list);
    }
    /**
     * 迫切连接
     * @throws Exception
     */
    @Test
    public void testFetchJoin() throws Exception {
        Session session=new Configuration().configure("config/hibernate.cfg.xml").buildSessionFactory().openSession();
        //Query query=session.createQuery("from Dept d inner join d.emps");
        Query query=session.createQuery("from Employ e left join fetch e.dept");

        List list=query.list();
        //以谁为主查询那么水谁就在前面    
        System.out.println(list);
    }
    /**
     * 懒加载的问题
     * @throws Exception
     */
    @Test
    public void testLazy() throws Exception {
        Session session=new Configuration().configure("config/hibernate.cfg.xml").buildSessionFactory().openSession();
        session.beginTransaction();

        User user=session.load(User.class,1);
        //持久化的状态
        user.setuName("xxxxxxx");

        session.flush();  //强制缓存于数据库同步



        session.getTransaction().commit();
        session.close();

        //System.out.println(user);

    }

懒加载的问题

 就是如果我们的session关闭之后 懒加载的数据还能使用吗?

 如果没有进行任何设置  那么懒加载的数据 是没有办法在session关闭之后进行使用

如果我就是要使用呢?

            //解决方案一:强制代理对象初始化
    //Hibernate.initialize(dept);
    //解决方案二:先使用一下数据
    //user.getuName();
    //解决方案三:就是在session关闭之前来使用数据

    //解决方案四:设置步支持懒加载

3 Hibernate中对象的状态问题

 1>:临时对象

   就是创建了对象但是没有save   find   load   get  ....之前的对象称为临时对象

   在数据库没有对应的记录



 2>:持久化对象

    就是调用了  save   find    load   get ....操作数据库方法之后的对象

    持久化对象有啥特点呢?在数据有对应的记录

    持久化对象是可以和数据库同步的.....




 3>:游离对象

   调用了session的close方法之后的对象称为游离对象  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值