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:\software\oracle\app\16125\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.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();
}

 

转载于:https://www.cnblogs.com/1612ss/p/8119304.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值