• 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的使用需要注意

  • 相关阅读:
    我的知识库(4) java获取页面编码(Z)
    知识库(3)JAVA 正则表达式 (超详细)
    The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. Struts
    某人总结的《英语听力的技巧 》,挺搞的
    我的知识库(5)java单例模式详解
    构建可扩展程序
    SerialPort (RS232 Serial COM Port) in C# .NET
    Python学习笔记——String、Sequences
    UI题目我的答案
    jQuery学习系列学会操纵Form表单元素(1)
  • 原文地址:https://www.cnblogs.com/IT-1994/p/6103474.html
Copyright © 2020-2023  润新知