zoukankan      html  css  js  c++  java
  • 一个Hibernate 的简单教程

    一个Hibernate 的简单教程

    在网上找了很多Hibernate的相关教程,大多数都是结合WEB服务器的,自己写一个单独
    的示例在Eclipse下直接运行,不需要自己写ANT脚本,不需要结合web服务器。但是需要MYSQL数据库-_-

           首先要学会如何使用Eclipse,然后要下载Hibernate需要的所有JAR文件,最后安装好MYSQL
    准备开始!

           第一步,我们要创建一个表 结构如下
          +-----------+--------------+------+-----+---------+----------------+
          | Field      | Type         | Null | Key | Default | Extra          |
          +-----------+--------------+------+-----+---------+----------------+
           | id           | int(11)      | NO   | MUL | NULL    | auto_increment |
           | title        | varchar(400) | YES |     | NULL    |                |
           | content | text         | YES |     | NULL    |                |
           | time      | datetime     | YES |     | NULL    |                |
          +-----------+--------------+------+-----+---------+----------------+

           第二步,在Eclipse中创建一个JAVA项目(我在项目中用到的包名是cn.com.nick.hbm)。编写News.java类,这个类对应了数据库中的表

    package cn.com.nick.hbm;

    import java.util.Date;

    public class News
    {
    private int id;
    private String title;
    private String content;
    private Date date;

    public int getId()
    {
       return id;
    }

    public void setId(int id)
    {
       this.id = id;
    }

    public String getTitle()
    {
       return title;
    }

    public void setTitle(String title)
    {
       this.title = title;
    }

    public String getContent()
    {
       return content;
    }

    public void setContent(String content)
    {
       this.content = content;
    }

    public Date getDate()
    {
       return date;
    }

    public void setDate(Date date)
    {
       this.date = date;
    }

    }

           第三步,配置对应关系 保存为News.hbm.xml文件 与News类在同一目录下(并不是一定要在同一目录下,为了方便暂时先放在这里)

    <?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>
        <!-- 这里说明了cn.com.nick.hbm.News这个类对应了NEWS表 -->
    <class name="cn.com.nick.hbm.News" table="NEWS">
    <!-- 从这里开始配置了News类中的属性对应到表中的那个字段,以及这个字段的类型 -->
       <id name="id" column="id">
        <generator class="native" />
       </id>
       <property name="title" type="string" column="TITLE"/>
       <property name="content" type="string" column="CONTENT"/>
       <property name="date" type="timestamp" column="TIME"/>
      
    </class>

    </hibernate-mapping>

          第四步,配置hibernate.cfg.xml 注意这个名字不能改,并且要放到SRC的跟路径下(这里要注意,如果放错地方示例中的方法是找不到这个文件的)

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE hibernate-configuration
        PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

    <hibernate-configuration>

    <session-factory name="java:/hibernate/HibernateFactory">

       <property name="show_sql">true</property><!-- 这里配置成显示SQL语句,方便调试 -->
       <property name="connection.driver_class">
        com.mysql.jdbc.Driver<!-- 这里是mysql的JDBC driver class名 -->
       </property>
       <property name="current_session_context_class">thread</property><!-- 配置上下文 -->
       <property name="connection.url">
        jdbc:mysql://localhost:3306/test<!-- 这里是mysql的hibernate_test数据库URL -->
       </property>
       <property name="connection.username">root</property><!-- 用户名 -->
       <property name="connection.password">123</property> <!-- 密码 -->
       <property name="dialect">
        org.hibernate.dialect.MySQLDialect<!-- 这里是mysql的Dialect -->
       </property>
       <property name="myeclipse.connection.profile">my</property>
       <mapping resource="cn/com/nick/hbm/News.hbm.xml" /><!-- 指定News的映射文件 -->

    </session-factory>

    </hibernate-configuration>
           最后创建一个测试类 Test.java 代码如下,里边有注释说明

    package cn.com.nick.hbm;

    import java.util.Date;
    import java.util.List;

    import org.hibernate.HibernateException;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.classic.Session;

    public class Test
    {

    private static final SessionFactory sessionFactory;

    static
    {
       try
       {
        // 这里创建了SessionFactory 将hibernate.cfg.xml文件放到SRC的跟路径下
        // Hibernate会自己找到
        sessionFactory = new Configuration().configure()
          .buildSessionFactory();
       } catch (Throwable ex)
       {
        // Make sure you log the exception, as it might be swallowed
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
       }
    }

    public static SessionFactory getSessionFactory()
    {
       return sessionFactory;
    }

    public static void main(String[] args)
    {
       // 实例化一个新的News对象,并填充内容
       News news = new News();
       news.setTitle("测试标题");
       news.setContent("添加测试内容");
       news.setDate(new Date());

       Test t = new Test();
       // 调用Test类下的存储方法,相当于执行INSERT语句
       // t.Save(news);
       // 调用查询方法,显示数据库的内容
       t.select();
       // 调用更新方法
       // t.update();
       // 调用删除
       // t.delete();
    }

    /**
    * 一个简单的添加数据方法
    * @param news news对象,这个对象将被添加到库中
    */
    public void Save(News news)
    {
       try
       {
        //获取hibernate的session
        Session session = Test.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        //这里只需要调用save方法把news对象传进去就插入成功了!
        session.save(news);
        session.getTransaction().commit();
       
       } catch (HibernateException e)
       {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }

    }

    /**
    * 查询方法
    */
    public void select()
    {
       try
       {
        Session session = Test.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        //注意!!!这里的 News 不是表名称! 是对象名所以要注意大小写
        String sql=" from News";
        //带条件的查询
        //String sql="from News where id=1";
       
        //用session.createQuery()执行HQL查询语句
        List<News> l = session.createQuery(sql).list();
        //在控制台循环输出
        for (News n : l)
        {
         System.out.println(n.getId());
         System.out.println(n.getTitle());
         System.out.println(n.getContent());
         System.out.println(n.getDate());
         System.out.println("==============");
        }
        session.getTransaction().commit();
       
       } catch (HibernateException e)
       {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
    }

    /**
    * 更新方法
    */
    public void update()
    {
       try
       {
        Session session = Test.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        //定义了要装载对象的ID
        Integer id = 1;
        //用load方法装载一个对象进来
        News n = (News) session.load(News.class, new Integer(id));
        //重新设置这个对象的标题
        n.setTitle("更新后标题");
        //用update方法更新这个对象
        session.update(n);
        session.getTransaction().commit();
       } catch (HibernateException e)
       {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
    }

    public void delete()
    {
       try
       {
        Session session = Test.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        //定义了要装载对象的ID
        Integer id = 6;
        //用load方法装载一个对象进来
        News n = (News) session.load(News.class, new Integer(id));
        //用delete方法删除这个对象
        session.delete(n);
        session.getTransaction().commit();
       } catch (HibernateException e)
       {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
    }

    }

        好啦,直接运行Test类看一下效果吧!

        特别说明:运行这个示例还需要在项目中导入MYSQL的驱动,另外导入Hibernate的jar文件时一定导全,Hibernate用到了许多其他的JAR文件这些都需要导入到项目中,可以参考这篇文章

  • 相关阅读:
    译文-浏览器下载图片的方式和时间点
    总结一下各种0.5px的线
    CSS3渐变效果工具
    [CSS]《CSS揭秘》第四章——视觉效果
    如何机制地回答浏览器兼容性问题
    如何更愉快地使用em —— 别说你懂CSS相对单位
    CSS学习(二):背景图片如何定位?
    React-简单通用的抛物线动画
    如何更愉快地使用rem —— 别说你懂CSS相对单位
    linuxC进程间通信的几种方式
  • 原文地址:https://www.cnblogs.com/pricks/p/1488953.html
Copyright © 2011-2022 走看看