zoukankan      html  css  js  c++  java
  • 持久层框架--hibernate(1)

    一.Hibernate

    hibernate是基于ORM映射的数据持久层框架,封装了DAO层

    hibernate框架搭建步骤:

      1.引入jar包 11个
      2.添加hibernate的配置文件hibernate.cfg.xml
      3.建表 tab_customer表 id,name,des,age
      4.创建实体类 Customer类 id,name,des,age
      5.添加映射文件,建立持久化类和表的映射关系 *.hbm.xml
      6.测试

     

    使用hibernate注解的方法配置映射信息需要引入:

    ejb3-persistence.jar
    hibernate-commons-annotations.jar
    hibernate-annotations.jar
    hibernate-jpa-2.0-api-1.0.0.Final.jar

    安装与配置hibernate(注解):
      hibernate.hbm.xml 文件中把引xxx.hbm.xml改为引用实体类即把:
      <mapping resource=“xxx.hbm.xml"/>
      改为:<mapping class=“xxx" />

    eg:

        <mapping resource="com/edu/oid/Customer.hbm.xml" />

      改为<mapping class="com.edu.anno.Customer" />

    持久化类中:

      @Entity    //表示当前类是一个持久化类 引的是javax.persistence中的Entity
      @Table(name="anno_cus")    //定义映射表的信息。name属性表示表名称

      @Id      //主键

      @Column(length=255,unique=true)    //其他字段  字段长度255,设置唯一约束

      @Transient    //该属性不会被映射

    主键约束与唯一约束区别:

      一张表里只能有一个主键约束,可以有多个唯一约束,主键不能为空,而唯一可以为空

     1 package com.edu.anno;
     2 
     3 import javax.persistence.Column;
     4 import javax.persistence.Entity;
     5 import javax.persistence.Id;
     6 import javax.persistence.Table;
     7 import javax.persistence.Transient;
     8 
     9 
    10 @Entity//表示当前类是一个持久化类
    11 @Table(name="anno_cus")//定义映射表的信息。name属性表示表名称
    12 public class Customer {
    13 
    14     @Id
    15     private int id;
    16     @Column(length=255,unique=true)
    17     private String name;
    18     @Transient//该属性不会被映射
    19     private int age;
    20     private String des;
    21     public int getId() {
    22         return id;
    23     }
    24     public void setId(int id) {
    25         this.id = id;
    26     }
    27     //@Column
    28     public String getName() {
    29         return name;
    30     }
    31     public void setName(String name) {
    32         this.name = name;
    33     }
    34     public int getAge() {
    35         return age;
    36     }
    37     public void setAge(int age) {
    38         this.age = age;
    39     }
    40     public String getDes() {
    41         return des;
    42     }
    43     public void setDes(String des) {
    44         this.des = des;
    45     }
    46     
    47     
    48 }

    加载配置文件:

        Configuration cfg = new Configuration();
        cfg.configure("com/edu/anno/hibernate.cfg.xml");

    改为  AnnotationConfiguration cfg = new AnnotationConfiguration();
        cfg.configure("com/edu/anno/hibernate.cfg.xml");



    •需求:使用单元测试工具,测试hibernate 的增删改查(CRUD)操作

    引包(11个)

    日志处理引过来直接放在src下:

       log4j.properties

     1 ### direct log messages to stdout ###
     2 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
     3 log4j.appender.stdout.Target=System.out
     4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
     5 log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
     6 
     7 ### direct messages to file hibernate.log ###
     8 #log4j.appender.file=org.apache.log4j.FileAppender
     9 #log4j.appender.file.File=hibernate.log
    10 #log4j.appender.file.layout=org.apache.log4j.PatternLayout
    11 #log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    12 
    13 ### set log levels - for more verbose logging change 'info' to 'debug' ###
    14 
    15 log4j.rootLogger=warn, stdout
    16 
    17 log4j.logger.org.hibernate=info
    18 
    19 ### log just the SQL
    20 #log4j.logger.net.sf.hibernate.SQL=debug
    21 
    22 ### log JDBC bind parameters ###
    23 log4j.logger.org.hibernate.type=info
    24 
    25 ### log schema export/update ###
    26 log4j.logger.org.hibernate.tool.hbm2ddl=debug
    27 
    28 ### log cache activity ###
    29 #log4j.logger.net.sf.hibernate.cache=debug
    30 
    31 ### enable the following line if you want to track down connection ###
    32 ### leakages when using DriverManagerConnectionProvider ###
    33 #log4j.logger.net.sf.hibernate.connection.DriverManagerConnectionProvider=trace

    数据库表的字段与实体类属性在Customer.hbl.xml中配置映射

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC 
     3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     4     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     5 <hibernate-mapping>
     6             <!-- table是表名,name是实体类属性名,column是字段名 -->
     7     <class name="com.edu.domain.Customer" table="tab_customer">
     8         <id name="id" column="id" type="integer">
     9             <!-- 主键生成策略 -->
    10             <generator class="increment"/>
    11         </id>
    12             <!-- 配置普通属性 -->
    13         <property name="name" column="name" type="string"/>
    14         <property name="age" column="age" type="integer"/>
    15         <property name="des"/>
    16     </class>
    17 </hibernate-mapping>

    hibernate.cfg.xml映射配置

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE hibernate-configuration PUBLIC
     3     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     4     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
     5 <hibernate-configuration>
     6 <session-factory>
     7     <!-- 配置数据库连接的基本信息 -->
     8     <property name="hibernate.connection.driver_class">
     9         oracle.jdbc.driver.OracleDriver
    10     </property>
    11     <property name="hibernate.connection.url">
    12         jdbc:oracle:thin:@localhost:1521:XE
    13     </property>
    14     <property name="hibernate.connection.username">lihengyu</property>
    15     <property name="hibernate.connection.password">lihengyu</property>
    16 
    17     <!-- 数据库的方言 使用的是哪种数据库 -->
    18     <property name="hibernate.dialect">
    19         org.hibernate.dialect.Oracle10gDialect
    20     </property>
    21     <!-- 显示sql语句 -->
    22     <property name="hibernate.show_sql">true</property>
    23     <!-- 自动创建数据库表 
    24             none:默认值  有表就使用,没表不创建
    25             create:每次都创建新表
    26             update: 有表就使用,没表创建。如果持久化类及映射文件发生改变,则发生alter语句修改表结构。
    27     -->
    28     <property name="hibernate.hbm2ddl.auto">update</property>
    29     
    30     <!-- 添加映射文件 -->
    31     <mapping resource="com/edu/domain/Customer.hbm.xml" />
    32 
    33 </session-factory>
    34 
    35 
    36 </hibernate-configuration>

    实体类Customer

     1 package com.edu.domain;
     2 /**
     3  *  持久化类 映射 数据库中tab_customer表
     4  * @author Administrator
     5  *
     6  */
     7 public class Customer {
     8 
     9     private int id;
    10     private String name;
    11     private int age;
    12     private String des;
    13     public int getId() {
    14         return id;
    15     }
    16     public void setId(int id) {
    17         this.id = id;
    18     }
    19     public String getName() {
    20         return name;
    21     }
    22     public void setName(String name) {
    23         this.name = name;
    24     }
    25     public int getAge() {
    26         return age;
    27     }
    28     public void setAge(int age) {
    29         this.age = age;
    30     }
    31     public String getDes() {
    32         return des;
    33     }
    34     public void setDes(String des) {
    35         this.des = des;
    36     }
    37     
    38     
    39 }
      1 TestHibernate测试
      2 
      3 package com.edu.domain;
      4 
      5 import java.util.List;
      6 
      7 import org.hibernate.SessionFactory;
      8 import org.hibernate.Transaction;
      9 import org.hibernate.cfg.Configuration;
     10 import org.hibernate.classic.Session;
     11 import org.junit.Test;
     12 
     13 /**
     14  * 使用单元测试工具,测试hibernate 的增删改查(CRUD)操作
     15  * 
     16  * @author Administrator
     17  * 
     18  */
     19 public class TestHibernate {
     20 
     21     private static SessionFactory sf;
     22     static {
     23         // 1. 加载配置文件
     24         Configuration cfg = new Configuration();
     25         cfg.configure("com/edu/domain/hibernate.cfg.xml");
     26 
     27         // 2. 获得SessionFactory
     28         sf = cfg.buildSessionFactory();
     29     }
     30     
     31     /**
     32      *  用户保存
     33      */
     34     @Test
     35     public void save() {
     36         
     37         Session session = sf.openSession();
     38         Transaction tran = session.beginTransaction();
     39         
     40         Customer c = new Customer();
     41         c.setName("tom1");
     42         c.setAge(12);
     43         c.setDes("cat");
     44         
     45         session.save(c);
     46         
     47         tran.commit();
     48         session.close();
     49     }
     50     /**
     51      *  按id查询用户
     52      */
     53     @Test
     54     public void findById() {
     55         
     56         Session session = sf.openSession();
     57         Transaction tran = session.beginTransaction();
     58         
     59         Customer c = (Customer) session.get(Customer.class, 2);
     60         System.out.println(c.getName());
     61         
     62         tran.commit();
     63         session.close();
     64     }
     65     /**
     66      *  删除客户
     67      */
     68     @Test
     69     public void delete() {
     70         
     71         Session session = sf.openSession();
     72         Transaction tran = session.beginTransaction();
     73         
     74         Customer c = (Customer) session.get(Customer.class, 3);
     75 
     76         session.delete(c);
     77         
     78         tran.commit();
     79         session.close();
     80     }
     81     
     82     /**
     83      *  编辑客户
     84      */
     85     @Test
     86     public void update() {
     87         
     88         Session session = sf.openSession();
     89         Transaction tran = session.beginTransaction();
     90         
     91         Customer c = (Customer) session.get(Customer.class, 2);
     92         
     93         c.setName("松江");
     94         
     95         session.update(c);
     96         
     97         tran.commit();
     98         session.close();
     99     }
    100     /**
    101      *  查询所有客户
    102      */
    103     @Test
    104     public void findAll() {
    105         
    106         Session session = sf.openSession();
    107         Transaction tran = session.beginTransaction();
    108         
    109         List<Customer> cs = session.createQuery(
    110                     "from Customer").list();
    111         
    112         for (Customer c : cs) {
    113             System.out.println(c.getName());
    114         }
    115         
    116         tran.commit();
    117         session.close();
    118     }
    119 }

    运行结果

  • 相关阅读:
    妙用sql的统计进行集合的比较
    kissy学习笔记(1)上手kissy
    Ext与现有项目的结合(一)完全封装已有的HTML元素使之成为Ext的组件
    Fix IE6 剪贴板撤销机制CtrlZ,CtrlY功能会在由于Js动态改变页面元素的value后失效的Problem
    Ajax个人开发心得(一)先从一个最简单的ajax功能模块说起,Ajax技术其实很简单
    【转】仅用 []()+! 就足以实现几乎任意Javascript代码
    为什么不用13px字体
    Ajax个人开发心得(二)页面逻辑与页面表现的分离,让你的Ajax编程更加模块化
    纯JS转换Select为Combox,完美实现原select所有功能
    关于window.parent的奇怪问题
  • 原文地址:https://www.cnblogs.com/Pioneer-HengYu/p/6654322.html
Copyright © 2011-2022 走看看