zoukankan      html  css  js  c++  java
  • Hibernate入门,HQL,双向表关联关系

           Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate,翻译过来是冬眠的意思,正好现在已经进入秋季,世间万物开始准备冬眠了。其实对于对象来说就是持久化。

            持久化(Persistence):即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等

        Hibernate所需要的maven节点

        

    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-ehcache -->
        <dependency>
           <groupId>org.hibernate</groupId>
           <artifactId>hibernate-ehcache</artifactId>
        <version>4.3.11.Final</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.transaction/jta -->
    <dependency>
        <groupId>javax.transaction</groupId>
        <artifactId>jta</artifactId>
        <version>1.1</version>
    </dependency>
    //因为个人使用的是 IntelliJ 开发环境maven并不提供ojdbc6.jar所以我们需要在本地电脑自行注册 <!-- https://mvnrepository.com/artifact/com.oracle/ojdbc14 --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.1.0</version> </dependency>

      注册过本地仓库的同志们应该都清楚我就不多说了上代码:

      注释:ojdbc6.jar是oracle提供的我们只需要找到自己jar的地址更改为你自己的地址,并在cmd中运行。如果没有配置maven工厂的同志可能会有问题。

    mvninstall:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.1.0 -Dpackaging=

    jar -Dfile=E:softwareoracleapp16125product11.2.0dbhome_1jdbclibojdbc6.jar

        HQl开篇

    
    
    <--! 分离参数防止代码冗余  -->
    Configuration cfg;
    Session session;
    Transaction tx;SessionFactory factory;
    @Before
    public void myBefor(){
    /*
    * 线程安全:方法中来用一个对象,不用考虑线程安全问题
    * Session 代表连接 线程不安全
    * */
    //创建配置对象
    cfg=new Configuration().configure("Dog.cfg.xml");
    //根据配置对象创建SessionFactory
    factory=cfg.buildSessionFactory();
    //根据SessionFactory去创建Session
    session=factory.getCurrentSession();
    //开启事务
    tx=session.beginTransaction();
    //6.提交
    tx.commit();
    //7.关闭
    session.close();
    }

      //小配置users.hbm.xml简单的介绍一个配置

     

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="cn.happy.Rental.entity">
        <!--dynamic-update="true"  动态更新先检索再修改-->
        <class name="cn.happy.Rental.entity.users" table="users" dynamic-update="true" >
            <id name="id" column="id">
                <!--主键生成策略 :
              assigned:程序员手动给值
              native:本地的  底层数据库来决定  到底  使用  序列(支持序列的DB:Oralce hibernate_sequence)
                或者是自增(Mysql AutoIncrement)
              -->
               <generator class="native"></generator>
            </id>
            <property name="name" column="name"></property>
            <property name="password" column="password"></property>
            <property name="typehome" column="typehome"></property>
            <property name="username" column="username"></property>
            <property name="isadmin" column="isadmin"></property>
        </class>
    
    </hibernate-mapping>
    

      //大配置hibernate.cfg.xml

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <!-- Database connection settings -->
            <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
            <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
            <property name="connection.username">xxx</property>
            <property name="connection.password">xxx</property>
    
            <!--getCurrentSession-->
            <property name="hibernate.current_session_context_class">thread</property>
    
            <!-- SQL dialect  方言-->
            <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
            <!--格式化SQL-->
            <property name="format_sql">true</property>
            <!--在控制台‘打印sql控制台-->
            <property name="show_sql">true</property>
            <!--自动构建表结构   create 先delete表结构 在创建 update 直接更新表结构-->
            <property name="hbm2ddl.auto">update</property>
            <!--关联小配置-->
            <mapping resource="cn/happy/Rental/entity/users.hbm.xml" />
            <mapping resource="cn/happy/Rental/entity/district.hbm.xml" />
            <mapping resource="cn/happy/Rental/entity/house.hbm.xml" />
            <mapping resource="cn/happy/Rental/entity/street.hbm.xml" />
            <mapping resource="cn/happy/Rental/entity/type.hbm.xml" />
    
        </session-factory>
    </hibernate-configuration>
    

     

    // 1.简单查询

      
        @Test
        public void s1(){
            String hql="from users";
            Query query=session.createQuery(hql);
            List<users>users=query.list();
            for(users u1:users){
                System.out.println("========"+u1.getUsername());
            }
        }
    

       //2.带条件查询

       
        @Test
        public void s2(){
            String hql="from users us where us.username='xxx'";
            Query query=session.createQuery(hql);
            List<users>users=query.list();
            for(users u1:users){
                System.out.println("========"+u1.getTypehome());
            }
        }
    

      //3.动态sql

        @Test
        public void s1(){
            dg dl=new dg();
    dl.setDogid("40288b8a6087bf0f016087bf12800000"); dl.setDogname("二黑"); dl.setDogage(10); StringBuilder sb=new StringBuilder(" from Dog g where 1=1 "); if(dl.getDogid()!=null){ sb.append("and g.dogid =:dogid "); } if(dl.getDogname()!=null){ sb.append("and g.dogname=:dogname "); } if(dl.getDogage()!=null){ sb.append("and g.dogage=:dogage"); } Query query=session.createQuery(sb.toString()); query.setProperties(dl); List<Dog>list=query.list(); for (Dog item:list){ System.out.println(item.getDogname()); } }

         //分页

        @Test
        public void s2(){
            String hql="from Dog order by dogid";
            Query query=session.createQuery(hql);
            int pageIndex=2;
            int pageSize=3;
            query.setFirstResult((pageIndex-1)*pageSize);//起始记录数
            query.setMaxResults(pageSize);
            List<Dog>list=query.list(); 
            for (Dog  li:list){
                System.out.println(li.getDogname());
            }
     
        }
    

      简单封装UTIL

    public class HQLutil {
    
        
       static ThreadLocal<Session>tlSession=new ThreadLocal<Session>();
        public  static SessionFactory factory;
        static Configuration cfg=null;
        static {
            cfg=new Configuration().configure("Dog.cfg.xml");
            factory=cfg.buildSessionFactory();
        }
    
        public static Session getSession(){
            Session session=tlSession.get();
            if(session==null){
                session=factory.openSession();
                tlSession.set(session);
            }
            return session;
        }
        public static Session CloseSession(){
            Session session=tlSession.get();
            if(session!=null){
                tlSession.set(session);
                session.close();
            }
            return session;
        }
    }
    

      双向表关联关系:

        我们以下所要的测试实体:部门表,员工表


    想要实现关联我们要分别在两个小配置植入我们所需要的属性:记得放在我们的<class>点中
    Dept:

    <!--一对多双向关联 //员工实体 一对多private Set<Emp>emps;-->
    <!-- cascade="save-update"级联 -->
    <!-- inverse="true"放弃维护关系:不干预顶层集合数据 -->
    <!-- order-by="empno desc"排序 -->
    <set name="emps" cascade="save-update,delete" inverse="true" order-by="empno desc">
    <key column="deptno"></key>
    <one-to-many class="Emp"></one-to-many>
    </set>
    Emp:
    <!--
    name:在多的一方植入对方的对象名
    class:再多的一方植入对方的类型名
    column:在当前分析的对象对应底层表的外列的值
    -->
    <many-to-one name="Dept" class="Dept" column="deptno" cascade="save-update"></many-to-one>

    //多对一
        @Test
        public void s1(){
            Emp emp= HQLutil.getSession().get(Emp.class,1);
            System.out.println(emp.getDept().getDeptname());
        }
    
    //一对多
    @Test
    public void s2(){
    Dept dept=new Dept();
    dept.setDeptno(1);
    Emp emp=HQLutil.getSession().load(Emp.class,2);
    emp.setDept(dept);
    HQLutil.getSession().saveOrUpdate(emp);
    Transaction transaction = HQLutil.getSession().beginTransaction();
    transaction.commit();
    }

    //一对多双向关联
    @Test
    public void s3(){
    String hql="from Dept";
    Query query = HQLutil.getSession().createQuery(hql);
    List<Dept> list = query.list();
    for (Dept dept:list){
    System.out.println(dept.getDeptname()+"=====部门");
    System.out.println("=======dept=======");
    for (Emp emp:dept.getEmps()){
    System.out.println(emp.getEmpname()+"=====员工");
    System.out.println("=======emp=======");
    }
    System.out.println("======= yes ========");
    }
    }
    //多对多添加
    @Test
    public void s4(){
    String hql="from Dept";
    Query query = HQLutil.getSession().createQuery(hql);
    List<Dept> list = query.list();
    for (Dept dept:list){
    System.out.println(dept.getDeptname()+"=====部门");
    System.out.println("=======dept=======");
    for (Emp emp:dept.getEmps()){
    System.out.println(emp.getEmpname()+"=====员工");
    System.out.println("=======emp=======");
    }
    System.out.println("======= yes ========");
    }
    }
    //导航属性 cascade="save-update"
    @Test
    public void s5(){
    Transaction transaction = HQLutil.getSession().beginTransaction();
    Dept dept=new Dept();
    dept.setDeptname("sss4");
    Emp emp=new Emp();
    emp.setEmpname("呵呵哒4");
    dept.getEmps().add(emp);
    HQLutil.getSession().save(dept);
    transaction.commit();
    }

  • 相关阅读:
    Java实现 LeetCode 343 整数拆分(动态规划入门经典)
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 338 比特位计数
    H264(NAL简介与I帧判断)
    分享一段H264视频和AAC音频的RTP封包代码
  • 原文地址:https://www.cnblogs.com/1612ss/p/8119304.html
Copyright © 2011-2022 走看看