再次认识Hibernate(一)

Hibernate

轻量级持久层解决方案   关系数据库ORM(Object Relational Mapping)框架

将java中的实体类与数据库简历一个映射,达到操作java对象进而操作数据库的目的。

特点:简化dao层编码工作、利用java反射机制、性能优秀、映射灵活


日志记录

sif4j(Simple Logging Facade for Java) 用于整合其他日志系统

log4j   具体的日志记录方案

log4j 的三个组件  

记录器(Loggers)

  格式:记录器=级别  输出源1 输出源2     log4j.rootLogger=info,stdout

输出源(Appenders)

   log4j.appender.stdout=org.apache.log4j.ConsoleAppender   控制台进行输出

   log4j.appender.file=org.apache.log4j.FileAppender  向文件进行输出

布局(Layouts)

%d{ABSOLUTE} %5p %c{1}:%L - %m%n

   log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

   log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j 的日志级别  fatal(致命的) error(普通错误) warn(警告) info(信息) debug(调试) trace(堆栈信息)


Hibernate 目录结构

 documentation:Hibernate文档

  lib:Hibernate开发jar包

       bytecode:操作字节码jar包.

       jpa:Hibernate的实现jpa规范.

       optional:Hibernate的可选jar包.

       required:Hibernate的必须的jar包.

  project:Hibernate提供的工程

导入Hibernate jar包

hibernate3.jar 

required,jpa 目录下的jar包

log4j slf4j.jar 日志记录的jar包

数据库驱动的jar包

创建实体类

    无参数的public构造器

    构建标识属性 映射数据表中的主键字段

    提供get/set方法

    使用基本数据类型的包装类型

    不使用final修饰(无法继承 无法生成代理对象)

创建ORM映射文件

   实体类名称.hbm.xml

   引入约束  org.hibernate.hibernate-mapping-3.0.dtd

   <hibernate-mapping> 类与表的映射

       <class name=""table=" ">    class 实体类名称     table 表名称

       <id name=" " column=" ">  id  配置唯一标识  

           <generator class="native">    主键生成策略 

        主键生成策略  尽量使用代理主键(起标识作用)而不使用自然主键(表属性作为主键)

         increment 自动增长 short int long   hibernate提供的自动增长策略   多线程下会产生问题

         identity  自动增长short int long  不适合oracle数据库

         sequence  应用在oracle数据库上

         native 本地策略 底层数据库不同  自动使用identity 或者 sequence

         uuid string 使用随机字符串

         assigned  hibernate本身不维护主键  由程序生成

         foregin 外来主键(应用于 多表 一对一的情况)

      </id>

       配置复合主键  <composite-id>

      <property name=" "column=" "type=" ">   映射类   name为类中的属性名称  column为表中字段名称  type属性表示类型   

       type有 java类型(java.lang.String  string  sql类型 )

       配置表之间的关联关系

       <many to one>  <one to one>

      配置预定义sql  会直接执行的sql语句

      <query name="findAll"> </query>

      <sql-query name="sqlFindAll">select * from customer</sql-query>

   </hibernate-mapping>

 创建核心配置文件 

     src下的  hibernate.cfg.xml

    <hibernate-configuration>

        <session-factory>

              <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver</property> 数据库驱动

              <property name="hibernate.connection.url"> </property>  数据库url

              <property name="hibernate.connection.username"></property> 数据库用户名

              <property name="hibernate.connection.password"><property>数据库密码               

              <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>    hibernate方言 操作数据库的语言  生成MySql

              <property name="hibernate.show_sql">true</property>  是否在控制台上显示SQL

              <property name="hibernate.format_sql">true</property> 格式化输出SQL

              <property name="hibernate.connection.autocommit">true</property>  事务是否自动提交

              <property name="hibernate.hbm2ddl.auto"></property>   数据库ddl策略

                用于测试的    create  每次执行时 创建新表(如果存在 将该表删除 重新创建)  create-drop 每次执行时 创建新表 程序执行后 删除该表

                update  不存在该表 创建  存在该表 更新      validate   校验映射文件与表中字段是否一致 不一致报错

              <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>在hibernate中使用c3p0连接池

              <property name="c3p0.min_size">5</property>

              <property name="c3p0.max_size">20</property>

              <property name=" c3p0,timeout">20</property>

              <property name="c3p0.idle_test_period">3000</property>每3000秒检查所有连接池的空闲连接

                <mapping resource=" "/>  需要加载的映射文件

        <session-factory>

   </hibernate-configuration>

编写测试类

 Configuration  configuration=new Configuration().configure();        记载核心配置文件(包含数据库连接信息)

 SessionFactory sessionFactory=configuration.buildSessionFactory(); 创建sessionFactory对象

 Session  session=sessionFactory.openSession(); 创建Session对象

 Transaction tx=session.beginTransaction();创建事务(事务默认不自动提交)

 Customer customer=new Customer();

 customer.setName(" "); customer.setAge(25);

 session.save(customer); 插入记录

 tx.commit(); 事务提交

 session.close(); 释放资源

 sessionFactory.close();

CRUD操作 (Create  Retrieve  Update  Delete)

 保存记录 session.  session.save(customer);

 根据主键进行查询 

 Customer customer=(Customer) session.get(Customer.class,1);   1为主键id值   使用get方法  返回真实对象  立即执行sql语句   不存在该数据会产生NullPointerException

 Customer customer=(Customer) session.load(Customer.class,1); 1为主键id值  使用load方法 返回代理对象  lazy load  真正使用该对象时 才会执行sql语句 不存在该数据会产生ObjectNotFoundException

 查询所有

     HQL(Hibernate Query Language)  Query query=session.createQuery("from Customer where name= ? ");

     QBC(Query  By  Criteria 条件查询)  Criteria  criteria=session.createCriteria(Customer.class);  

criteria.add(Restrictions.eq("name","demo")) ; //查询条件   List<Customer> list=criteria.list();

     SQL   SQLuery query=session.createSQLQuery("select * from customer");

     query.addEntity(Customer.class);  //封装成Customer对象

     List<Customer> list=query.list();          

 修改操作

   手动构造后修改 Customer   customer=new Customer();   customer.setAge(20);  session.update(customer);  如果没有设置属性,将会存入默认值  因而数据最好为包装类型  默认值为null

  查询后修改    Customer customer=(Customer) session.get(Customer.class,1);  customer.seAge(10);  session.update(customer);

删除记录  

  手动构造后删除  Customer customer=new Customer();  customer.setId(2);  session.delete(customer);

  查询后删除   Customer customer=(Customer)session.get(Customer.class,1); session.delete(customer);

核心对象

 Configuration:负载管理 hibernate的配置信息

  加载过程   Configuration  configuration=new Configuration().configure();

 SessionFactory:线程安全的  保存着当前数据库配置信息、映射关系和预定义的sql语句 维护连接池  负责维护Hibernate的二级缓存

   一个应用中只需要一个sessionFactory

 Session:应用程序与数据库之间交互操作的单线程对象  相当于jdbc中的Connection  是hibernate运作的核心  线程不安全 负责维护Hibernate的一级缓存

所有的持久化操作都要在session的管理下才能进行  

save()  update() delete() get()/load() saveOrUpdate()  createQuery()  createSQLQuery()  createCriteria() 

 Transaction: commit() 提交相关联的session实体对象   rollback() 撤销事务操作   wasCommit()判断事务是否提交   如果没有开启事务  那么每个session的操作 都相当于一个独立的事务

 Query:查询操作的对象

 Criteria:条件查询操作的对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值