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多表查询
希望对你有所帮助~
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怎么用查询的主要内容,如果未能解决你的问题,请参考以下文章