一.为什么用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关闭情况下进行历史查询
导入第三方包
在配置文件里添加开启配置
时间: 2024-10-12 17:23:05