hibernate怎么用查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate怎么用查询相关的知识,希望对你有一定的参考价值。

刚开始学HIBERNATE 不懂

1:hibernate数据查询方式:有HQL方式,QBC方式,原生SQL方式。HQL适合静态查询,QBC则适合较多的动态查询。
A:HQL方式,支持条件查询,连接查询,分页查询,分组查询,内置函数和自定义函数查询(SUN(),MIN(),MAX()),子查询,动态绑定参数查。
HQL语句定义如下:
String hql="from book";
Query query=session.createQuery(hql);
B:QBC方式,也就是QBC检索方式。QBC通过Session类创建Criteria实例,通过不同方法进行检索,实际上Criteria是用来装载查询条件的容器。QBC有很多条件函数,如:Resstictions.eq(),Resstictions.gt(),Resstictions.ge(),
Resstictions.le(),Resstictions.and(),Resstictions.or()等。
Criteria容器使用方法如下:
Criteria criteria=session.createCriteria(book.class);
criteria.add(Restrications.It("id",new Integer(4)));
List list=criteria.list();
C:原生SQL方式。不管是HQL还是QBC最终都要通过Hibernate来解析,把他们转换成SQL语句进行对数据库的操作。因为我们知道SQL可以在多平台之间使用。
使用原生SQL方式如下:
String sql="select b.* from book b"
SQLQuery squery=session.createSQLQuery(sql);
squery.addEntity("b",book.class);
List list=squery.list();
2:hibernate的关联查询
A:一对一关联:
B:一对多,多对一关联
C:多对多关联
最后,要学hibernate,平时要多动手,慢慢积累经验,成就感就会也大,这样才能学而不厌。祝你学习进步。
参考技术A

HIbernate主要有三种查询方式HQL、QBC、SQL:

1).HQL(Hibernate Query Language):hibernate数据查询语言;

2).QBC(Query By Criteria):规则查询

3).SQL:原生的SQL语句(较为复杂的情况下使用)

想要详细了解的可以看一下下面的几篇文章:

    QBC数据查询

    HQL单表查询

    HQL多表查询

    希望对你有所帮助~

参考技术B 1. create EntityManager object
HibernateUtil.getEntityManagerFactory().createEntityManager()

2. create EntityTransaction object
em.getTransaction(); // em 就是刚才创建的EntityManager

3. tx.begin(); // tx 就是 EntityTransaction 对象

4. create Query object

5. tx.commit();
参考技术C 那建议你静下心来,找本书好好看看,推荐你看一下《深入浅出hibernate》,这样你了解的更全面,更系统

Hibernate怎么用

一.为什么用Hibernate?  【核心:对象关系映射】

  Hibernate是对jdbc的轻量级封装,可以简化数据库连接操作,

  在该框架之前,数据库的操作步骤是:

1.根据连接字串获取连接
2.执行sql语句
3.获取结果集
4.从结果集提取数据

二.Hibernate怎么用?

  1.引入框架所需要的包

  2.配置 src/hibernate.cfg.xml,常用配置如下:  【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">
<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

    <session-factory>
        <property name="hbm2ddl.auto">update</property>  //根据类自动建表
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="connection.username">root</property>
        <property name="connection.password">java</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

        <!-- 自定义配置 -->
        <property name="show_sql">true</property>  //显示sql语句
        <property name="format_sql">true</property>  //格式化显示sql语句
        
        <!-- 映射文件 -->  
        <mapping resource="com/bean/User.hbm.xml"/>  
    </session-factory>

</hibernate-configuration>

 

  3.编写实体类映射文件  User.hbm.xml  【文件名和实体类名字相同】

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
        
<hibernate-mapping>
    <class name="com.bean.User" table="TEST_USER" >
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="uname"/>
        <property name="photo"/>
    </class>
</hibernate-mapping> 

 

  4.进行具体查询的业务逻辑【软件导入框架时会默认添加一个获取session的类】

package com.dao.impl;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.bean.User;
import com.dao.IUserDao;
import com.util.HibernateSessionFactory;

public class UserDaoImpl implements IUserDao{

    @Override
    public Integer addUser(User u) {
        
        int result = -1;
        //获取会话
        Session session = HibernateSessionFactory.getSession();
        Transaction tx = session.beginTransaction();
        
        try {
            //保存数据
            session.save(u);
            tx.commit();
            result=1;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        //关闭
        session.close();
        return result;
    }

}

 

三,Hibernate高级知识:

  1.对象关系映射

    当一个类里,把另一个类作为属性使用时,怎么用映射文件来反映这种关系?

    这就是对象关系映射,参考上一篇对象关系映射文章

  2.Hibernate查询:Query查询,Criteria查询  [不常用的本地查询,native查询]

    Query查询:

  //获取会话 
  Session session = HibernateSessionFactory.getSession();
  Transaction tx = session.beginTransaction();
String hql="from Admin as admin where admin.aname=:name";//使用命名参数,推荐使用,易读。 Query query=session.createQuery(hql); query.setString("name", name);
List
<Admin> list=query.list(); for(Admin admin:list){   System.out.println(admin.getAname()); }

 

   Criteria查询:

    Restrictions-条件查询,默认获取全部

    Projections-聚合查询,如求和,平均值

  //获取会话 
  Session session = HibernateSessionFactory.getSession();
  Transaction tx = session.beginTransaction();


  Criteria c=session.createCriteria(Admin.class); c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或 c.add(Restrictions.eq("apassword", password)); List<Admin> list=c.list(); for(Admin admin:list){ System.out.println(admin.getAname()); }

 

四,Hibernate查询优化 

  1.延时加载:当一个类的属性是另一个类的时候,只显示本类属性,

    用法:配置set-lazy属性即可,默认开启

<?xml version="1.0" encoding="GBK"?> 
 <!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="org.crazyit.app.domain">    <!-- 映射 Person 持久化类 -->    <class name="Person" table="person_inf">     <!-- 映射标识属性 id -->     <id name="id" column="person_id">       <!-- 定义主键生成器策略 -->       <generator class="identity"/>     </id>     
     <!-- 用于映射普通属性 -->     <property name="name" type="string"/>      <property name="age" type="int"/>   
    <!-- 映射集合属性 -->     <set name="addresses" table="person_address" lazy="true">       。。。    </set>   </class> </hibernate-mapping>

   2.抓取策略:和延时差不多,

    用法:配置set-fetch属性即可,默认开启

五,Hibernate缓存

  1.一级缓存默认开启,session不关闭同一查询,语句只执行一次

    2.二级缓存,由第三方提供,可以于session关闭情况下进行历史查询

    导入第三方包

    在配置文件里添加开启配置

   











以上是关于hibernate怎么用查询的主要内容,如果未能解决你的问题,请参考以下文章

hibernate用HQL查询集合属性

在hibernate中用到的内连接查到数据怎么用

hibernate criteria模糊查询 怎么写

hibernate executeSQLQuery 查询多个表怎么返回值

如何用hibernate直接进行SQL语句查询

用easyUI DataGrid怎么才能实现分页显示和查询,后台用到了Struts2 ,hibernate