zoukankan      html  css  js  c++  java
  • Hibernate4.2.4入门(一)——环境搭建和简单例子

    一、前言

    发下牢骚,这段时间要做项目,又要学框架,搞得都没时间写笔记,但是觉得这知识学过还是要记录下。进入主题了

    1.1、Hibernate简介

    什么是Hibernate?Hibernate有什么用?

    Hibernate是开放源代码的对象关系映射框架,用来把java的对象映射到数据库中的关系数据中,以便永久保存数据。

    (简单说来,我们都知道Java语言是面向对象的语言,数据库是面向关系的,我们每次要往数据库中添加数据的时候,是不是每次都需要写SQL语句,进行CRUD,而优秀的开发人员

    他们想出了一个非常好的映射框架,对象关系映射,也就是Hibernate,再透彻点说,就是你往对象添加数据的时候,数据库中的表就自动添加了数据了。是不是很神奇!)

    Hibernate的作用:

    1、管理Java类的对象到数据库的映射

    2、提供数据查询

    3、提高效率,减少开发人员使用SQL和jdbc处理数据的时间

    4、Hibernate能实现数据持久化和对象关系的映射

    1.2、理解Hibernate

    笔者在前面有说过,学一个东西,首先要理解它是什么?有什么用?为何存在?

    我们要了解Hibernate,首先要先去了解三层结构,三层结构我们都听过,但是,它和Hibernate有什么关系呢?

    这里简要说明下三层结构

    三层结构分为: 表示层,业务逻辑层,数据库层

    表示层:         提供与用户进行交互的界面

    业务逻辑层:   负责各种业务逻辑,提供对业务数据的保存,更新,删除和查询操作等

    数据库层:      存放管理应用的持久化业务数据

    而Hibernate,其实就是在业务逻辑层和数据库层中间,添加一个持久化层,这个持久化层是业务逻辑中分离出来的;这样,业务逻辑层通过持久化层,持久化层通过数据库层。

     

    这里说了持久化,那么什么是持久化呢?

    将数据(如内存中的对象)永久的保存到存储设备中,就是持久化,持久化的作用是将内存中的数据存储到关系型的数据库中。

    说到底其实数据存放分为两种,一种是短期存放,就是存放在内存中,当你重新运行项目的时候,内存中的数据就消失,而另外一种就是永久存放。

    理论就到这里。

    1.2、简单例子——增删改查

    1.2.1、搭建环境

    新建java property,这里笔者的环境是Eclipse+Tomcat8.0,下载所需要的jar包,打包在这里,注意还得添加mysql的jar包,将包导入到项目中,具体操作

    右键项目名——Properties——Java Build Path——Libraries——Add Library——User Library——User Libraryies——New,接下来就添加jar,然后起个名字,之后将导入到你的项目就可以了。

    效果图:

    1.2.2、新建配置文件

     这里需要注意一点就是:在Hibernate中,默认配置文件的命名为hibernate.cfg.xml,所以我们配置文件命名一般就是这个,如果说你想要重新命名的话,那么在读取配置文件的时候就要指定相对路径。

    在src下新建hibernate.cfg.xml

    内容有连接数据库,指定读取实体类的配置信息,还有在控制台输出SQL语句等数据;配置文件中的dtd文件,在hibernate-core-4.2.4.Final.jar中的org.hibernate中的最后就能看到hibernate-configuration-3.0.dtd,打开该文件,然后将下面的dtd文件限制加到xml配置文件中即可。注意:笔者这里使用的是hibernate 4.2的版本。但是一般都在核心包里面的。

    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

    新建实体类:Student.java

    package com.hibernate.hellos;
    
    public class Student {
        private int sid;
        private String sname;
        private int sage;
        public int getSid() {
            return sid;
        }
        public void setSid(int sid) {
            this.sid = sid;
        }
        public String getSname() {
            return sname;
        }
        public void setSname(String sname) {
            this.sname = sname;
        }
        public int getSage() {
            return sage;
        }
        public void setSage(int sage) {
            this.sage = sage;
        }
    }
    Student

    重点来了:当我们新建实体类时,需要在该实体类的基础上新建映射文件,dtd限制同样在核心包中里面查找

    新建配置文件:Student.hbn.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!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="com.hibernate.hellos.Student" table="Student">
            <!--
             type:表示该属性是int类型
             column:映射的是数据库中的列名
             native:根据底层数据库的能力选择identity, sequence 或者hilo中的一个,就是根据数据库生成
             -->
            <id name="sid" type="int">
                <column name="ID" />
                <generator class="native" />
            </id>
             <property name="sname" type="java.lang.String">
                <column name="SNAME" />
            </property>
            <property name="sage" type="int">
                <column name="SAGE" />
            </property>
        </class>
    </hibernate-mapping>

    注意:

    其中generator的class有:
    increment(递增)
    用于为long, short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。

    identity (标识)
    对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。返回的标识符是long, short 或者int类型的。

    sequence (序列) 

    在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的

    uuid
    用一个128位的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。

    native(本地)
    根据底层数据库的能力选择identity, sequence 或者hilo中的一个。

    新建配置文件:hiberate.cfg.xml,该文件放在src下

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <property name="show_sql">true</property>          <!-- 显示sql语句 -->
               <property name="format_sql">true</property>      <!-- 格式化sql语句 -->
              <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
              <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
              <property name="hibernate.connection.url">
                  <![CDATA[jdbc:mysql://localhost:3306/myhibernate?useUnicode=true&characterEncoding=utf8]]>
              </property>
              <property name="connection.username">root</property>
              <property name="connection.password">root</property>
              <!-- 创建表 使用create,查询或者更新的时候使用update-->
              <property name="hibernate.hbm2ddl.auto">create</property>
              <!-- hibernate的第一个测试例子 -->
              <mapping resource="com/hibernate/hellos/Student.hbm.xml" />
              
              
        </session-factory>
    </hibernate-configuration>

     注意:使用hibernate.hbm2ddl.auto的时候,当为create的时候,表示如果你数据库中没创建表也没关系,hibernate会自动帮你创建,当使用update的时候,表示在表的基础上使用

    接下来新建一个测试类:Test.java

    package com.hibernate.hellos;
    
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.service.ServiceRegistry;
    import org.hibernate.service.ServiceRegistryBuilder;
    
    public class Test {
        private static SessionFactory sessionfactory;
        private static Session session;
        public static void main(String[] args){
            //读取默认配置文件名 hibernate.cfg.xml
            //如果要指定文件名,只需要在new Configuration().configure("指定文件的路径");
            Configuration config = new Configuration().configure();
            //注册服务
            ServiceRegistry service = new ServiceRegistryBuilder().applySettings(config.getProperties())
                    .buildServiceRegistry();
            //实例化一个session工厂
            SessionFactory sessionfactory = config.buildSessionFactory(service);
            //打开hibernate的session,执行操作
            session = sessionfactory.openSession();
            
            //添加 
            add();
            
            //查询
            sel();
            
            //修改    
            update();
            
            //删除
            delete();
        }
        //添加
        public static void add(){
            Transaction transaction = session.beginTransaction();
            Student s = new Student();
            s.setSname("张三");
            s.setSage(20);
            session.save(s);
            transaction.commit();
        
            //注意:如果session关闭的话,需要指定打开
        }
        //查询
        public static void sel(){
            Student s = (Student) session.get(Student.class, 1);
            System.out.println(s.getSname());
            
        }
        //修改数据
        public static  void update(){
            Student s = new Student();
            s.setSname("李四");
            s.setSage(30);
            
            Transaction transaction = session.beginTransaction();
            //获取数据库中的表
            Student s1 = (Student) session.get(Student.class,1);
            transaction.commit();
            s1.setSname("李思思");
            transaction = session.beginTransaction();
            session.update(s1);
            transaction.commit();
        }
        public static void delete(){
            
            Transaction transaction = session.beginTransaction();
            Student s = (Student) session.get(Student.class, 1);
            session.delete(s);
            transaction.commit();
            
        }
    }

    如果你直接复制我代码的话,你就会看到数据库中除了一张表数据什么都没有,把delete()方法注释掉。恩,别犯傻。

    当我们使用格式化的时候,就可以看到

    添加和修改的效果图:

    数据库中的表的数据:

    总结:

     1、新建实体类的时候,记得要写映射文件,当然可以使用注解的方式,后期笔者会慢慢记录

     2、table表名不可以是mysql中的关键字

     3、hibernate.hbm2ddl.auto的使用需要注意

  • 相关阅读:
    spring参数类型异常输出(二), SpringMvc参数类型转换错误输出(二)
    spring参数类型异常输出,SpringMvc参数类型转换错误输出
    Linux下载jdk ,Linux如何下载jdk
    Linux安装Jdk,CentOS安装Jdk
    Linux系统ifconfig命令找不到,centos ifconfig Command not found
    centos could not retrieve mirrorlist
    Spring声明式事务(xml配置事务方式)
    微信上传图文消息invalid media_id hint,thumb_media_id怎么获取
    云虚拟主机开源 DedeCMS 安装指南
    安装dede显示dir的解决办法
  • 原文地址:https://www.cnblogs.com/IT-1994/p/6103474.html
Copyright © 2011-2022 走看看