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();
    }

  • 相关阅读:
    UI自动化web端框架config.json代码
    UI自动化web端框架run.py代码
    UI自动化web端框架核心组成和目录结构
    appium环境搭建(windows-appium-android)
    官网pyse的修改版
    git安装和使用、python安装
    单例设计模式、工厂设计模式和装饰器
    AcWing 245 你能回答这些问题吗? (线段树)
    AcWing 244 谜一样的牛 (线段树)
    AcWing 239 奇偶游戏 (带权并查集 / 扩展域并查集)
  • 原文地址:https://www.cnblogs.com/1612ss/p/8119304.html
Copyright © 2011-2022 走看看