Hibernate框架开发笔记lesson1 Hibernate编程

本文介绍Hibernate框架的基本概念,对比JDBC的不足之处,并提供详细的入门级配置步骤与示例代码,帮助初学者快速掌握如何利用Hibernate简化数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

}

}




内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值