您的位置:首页 > 编程语言

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();

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: