Hibernate框架开发笔记lesson1 Hibernate编程
2016-08-27 18:04
330 查看
Hibernate:
操作数据库的,跟JDBC是一样的。hibernate封装了JDBC ,是ORM框架。ORM : Object Ralational Mapping (对象关系映射),ORM框架操作数据库不是直接对表操作,直接对对象进行操作。所以表和对象有一个映射关系。
如果表名叫emp ,对象名叫Emp,只有表和对象有映射关系,对对象进行操作,hibernate底层就会对表进行操作。表里的字段 和 对象的属性 映射
程序员直接对对象进行增删改查, 底层hibernate会对底层映射表进行操作(生成sql语句),程序员不需要写SQL语句,只需对对象操作即可。
JDBC操作数据库的缺点:
1.代码冗余 :获取connnetion Conection conn ,
ps=conn.prepareStatement(sql),
给Sql占位符赋值 ps.setXxxx(n,xxx).....;
执行查询
ReusltSt rs =ps.extecuteQuery();
执行增删改 ps.executeUpdate();
conn.close();
2.需要关心用的是什么数据库:有些sql语句是不一样的
分页语句: ....
mySQL:
select * from emp limit ?, ?
orcale select * from ( selectrownum rn from emp) where rn<=2 and rn >=5 (2到5页)
SQLServe select
top 2 from emp (前两条数据)
3.返回结果集由程序员手动处理成一个对象或者对象的集合
如果属性比较多,赋值非常繁琐
事务是默认是自动的提交的,需要根据操作结果手动提交或者回滚.
需要大量写sql语句
*事务:
一组完整的操作 , 原子性, 数据一致性,隔离性
原子性:数据的操作不是独立的
数据一致性: 例如转账 : 转入和转出操作, 转出后必须转入必须收到才能提交
hibernate入门开发
引入jar包 :
antlr-2.7.6.jar 事务commons-collections-3.1.jar 数据连接池
dom4j-1.6.1.jar 解析XML
hibernate3.jar hibernate 核心JAR包
javassist-3.9.0.GA.jar 动态改变字节码jar包
jta-1.1.jar 事务
log4j-1.2.16.jar
mysql-connector-java-5.0.8-bin.jar
slf4j-api-1.5.8.jar 日志信息记录
slf4j-log4j12-1.6.1.jar 日志信息记录
创建hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置连接数据库的环境 -->
<property name="connection.url">jdbc:mysql://localhost:3306/db4b</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- 指定数据库的方言(用的是什么数据库) mysql方言 对对象操作的时候 hibernate会生成mysql对应的sql语句 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 显示sql语句 -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- 引入映射文件(实体映射文件)
resource: 编写映射文件的路径
-->
<mapping resource="entity/Dept.hbm.xml"/>
</session-factory>
</hibernate-configuration>
根据实体类配置映射文件 Dept.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>
<!--
name:全类名
table:表名
-->
<class name="entity.Dept" table="dept">
<!-- 配置主键属性与主键字段的映射(对应) -->
<id name="dno" column="dno" type="java.lang.Integer">
<!-- 配置主键生成器(生成策略 ):
assigned: hibernate忽略主键的值 由程序员自己指定
increment: 自增的 select max(id) max+1
.....
-->
<generator class="assigned"></generator>
</id>
<!-- 配置普通属性与字段的对应映射关系
name: 属性名
column:字段名
type: 类型名 俩种写法:java类型写法: java.lang.String hibernate的简短的写法:string
-->
<property name="dname" column="dname" type="java.lang.String"></property>
<property name="loc" column="loc" type="java.lang.String"></property>
</class>
</hibernate-mapping>
测试hibernate
1 .加载hibernate.cfg.xml主配置,把配置文件加载到了内存Configuration conf = new Configuration().configure("hibernate.cfg.xml");
2 .根据conf对象 获取SessionFactory对象
SessionFactory sf= conf.buildSessionFactory();
3.根据sf工厂对象 创建session 对象 session 是原始Connection的封装对象, 是与数据库的一次会话(web的session是与服务器的对话) 如果输出session有值,说明跟数据库连接成功
Session session =sf.openSession();
4.查询操作(get:根据主键查询)直接返回成需要的对象,底层也是通过sql 迭代生成resault集合
Dept d =(Dept ) session.get(Dept.class, 10);
5.释放资源
session.close();
如果是执行增删改操作
获取事务对象 tx(增删改需要事务) hibernate 需要手动提交事务(JDBC自动提交)
Transaction tx = session.beginTransaction();
4.操作对象
Dept d = new Dept();
d.setDno(40);
d.setDname("实施部");
d.setLoc("西安");
将d对象数据存入到缓存中
session.save(d);
tx.commit();
删除操作
session.delete(d);
修改操作
session.update(d); d 为修改后的对象
把Session封装成utils
public class HibernateUtils {private static Configuration conf = null;
private static SessionFactory sf = null;
放在静态代码块,只执行一次
static{
conf = new Configuration().configure("hibernate.cfg.xml");
sf = conf.buildSessionFactory();
}
public static Session getSession(){
Session session = sf.openSession();
return session;
}
}
这样获取session只创建一次工厂
但是,每次用户操作一次增,删,改会的打开一次session ,再关闭session。会浪费资源。应该一个用户使用一个session,用完再关闭session。因此,需要优化session。
优化Session
ThreadLocal<Session>将当前用户使用的session绑定到ThreadLocal中, 在做别的数据库的操作的时候,从ThreadLocal中获取.
save(Dept):第一次获取session 只能从工厂openSession()获取Session,
将session放入到ThreadLocal中 为了下次操作 直接从ThreadLocal中获取adLocal中获取
public class HibernateUtil{
存放用户使用的session对象
private static ThreadLocal <Session> threadLocal = new ThreadLocal<Session> ();
static SessionFactory sf = null;
static{
sf = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
}
public static Session getSession(){
Session session = threadLocal.get();
//如果从threadLocal中取不到现成的session对象,
// 就证明是第一次操作数据
if(session==null||!session.isOpen()){
session = sf.openSession();
threadLocal.set(session);
}
return session;
}
public static void closeSession(){
Session session = threadLocal.get();
if(session!=null){
threadLocal.set(null);
session.close();
}
}
}
相关文章推荐
- hibernate框架开发笔记 lesson3 HQL
- Hibernate框架开发笔记 lesson2 关联关系映射
- Hibernate框架开发笔记 lesson5
- springMVC框架开发笔记 lesson2 注解开发
- spring框架开发笔记 lesson5 三大框架整合
- Hibernate学习笔记一 使用idea开发工具搭建框架
- 【Hibernate框架开发之九】Hibernate 性能优化笔记!(遍历、一级/二级/查询/缓存/乐观悲观锁等优化算法)
- springMVC框架开发笔记 lesson1 springMVC编程
- 【Hibernate框架开发之九】Hibernate 性能优化笔记!(遍历、一级/二级/查询/缓存、乐观悲观锁等优化算法)
- 【Hibernate框架开发之九】Hibernate 性能优化笔记!(遍历、一级/二级/查询/缓存、乐观悲观锁等优化算法)
- springMVC框架开发笔记 lesson3 SSM框架整合
- [转载]学习笔记《.NET框架程序设计(修订版)》--第一章 Microsoft .NET框架开发平台体系架构(1)
- Struts+Hibernate模板开发笔记---设计模式:DAO
- 孙鑫VC++讲座笔记Lesson 6 菜单编程
- 在spring+ hibernate+ tapestry开发框架中处理orcale blob字段内容
- ArcGIS Server 开发系列(一)--编程框架总览 (转载于Flyingis)
- ArcGIS Server 开发系列(一)--编程框架总览
- SSH(struts+spring+hibernate)迅速开发--附录1 Struts校验框架(2)
- eclipse下wtp+HibernateTools开发笔记
- 在Struts--hibernate开发框架中,实现formbean与hibernate pojo的自动转换