Hibernate学习过程-1-创建第一个Hibernate-CURD项目

来源:互联网 发布:下载淘宝旺旺卖家版 编辑:程序博客网 时间:2024/04/25 05:15

Hibernate学习过程-1-创建第一个Hibernate-CURD项目

提笔之际
  经过半年间断性地学习JavaSE, 到了本月,刚好系统地学完了JavaSE中的内容,Java是我第二个系统地学习完的编程语言,我的第一门系统地学完的编程语言是PHP;既然 JavaSE基础知识学完了,那么便要开始接触一些流行的Java开发时可能会使用框架了;于是就往图书馆跑,一眼看到Hibernate并喜欢上了它; 于是,弃用Eclipse,装上高大上的MyEclipse 2014,好戏开场了~

Hibernate简介

ORM的概念

  O: Object 对象
  R: Ralationship 关系
  M: Mapping 映射
  把一个关系型的数据库描述成一个对象,通过映射的方式

jdbc的缺点

  1、代码比较繁琐
  2、sql语句平台的移植性不是很强
  3、没有data pool(数据缓存)
  4、当jdbc调用mysql的存储过程的时候,存储过程本身移植性比较差
  5、没有做到面向对象开发

hibernate优点

  1、面向对象的编程
  2、代码比较简单
  3、具有缓存:一级缓存、二级缓存、查询缓存 命中率的概念
  4、移植性比较强

hibernate的缺点

  1、支持的分布式事务比较弱
  2、如果一张表的数据有千万级别,不适合用hibernate来做
  3、如果表之间的关系相当复杂,不适合用hibernate来做

导入jar包(可省略)

  下图列的是常用包,红点表示必备包;
  导入jar包

将工程转换为Hibernate工程

  将java工程转换为Hibernate工程
选择Hibernate版本:
  选择Hibernate版本
可以不Create SessionFactory class,因为后面我们自己写一个
  创建Hibernate.cfg.xml文件
配置数据库连接(或者取消Specify database…前面的勾勾,暂不配置数据库连接)
配置数据库连接
导入Hibernate常用类库(若前面已导入jar包,则无需再导入,即去除所有勾勾),
这里使用了MySQL数据库,所以还要额外导入mysql-connector-java-5.1.10-bin.jar
导入jar库
finish向导后创建一个数据库
创建数据库

编辑Hibernate配置文件:

如果前面没有配置数据库连接,那么点击Db Driver右侧的new按钮创建一个Driver,勾选上Save password就是记住密码;
创建Driver
在Properties中Add一个property:
配置对数据库策略
到了这里,Hibernate的配置就差不多完成了,接下来对Hibernate的配置文件做个解释

<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration>    <!--         一个sessionFactory就代表一个数据库的描述    --><session-factory>    <!-- 链接数据库的用户名 -->    <property name="connection.username">hibernate</property>    <!-- 链接数据库的密码 -->    <property name="connection.password">test</property>    <!-- 链接数据库的驱动 -->    <property name="connection.driver_class">        com.mysql.jdbc.Driver    </property>    <!-- 链接数据库的url -->    <property name="connection.url">        jdbc:mysql://localhost:3306/hibernate_test    </property>    <!--         方言        告诉hibernate用什么样的数据库,将来会生成什么样的sql语句    -->    <property name="dialect">        org.hibernate.dialect.MySQLDialect    </property>    <!--         hibernate对表的策略        validate  在hibernate容器启动的时候,根据映射文件和持久化类校验表        create    每次当hibernate启动的时候,都会根据持久化类和映射文件创建表        create-drop  每次当hibernate启动的时候,都会根据持久化类和映射文件创建表,销毁的时候删除表        update  检查,如果和映射文件不一致,则更新表的结构,如果没有表,则会创建表    -->    <property name="hbm2ddl.auto">update</property></session-factory></hibernate-configuration>

编写代码

1、编写取得Session的类HibernateSessionFactory

    package com.test.util;    import org.hibernate.HibernateException;    import org.hibernate.Session;    import org.hibernate.SessionFactory;    import org.hibernate.cfg.Configuration;    public class HibernateSessionFactory{        //创建常量保存SessionFactory,        //Hibernate对数据库的操作是通过Session来实现的,        //而Session是从SessionFactory中得到的        //因为SessionFactory是线程安全的,所以将其定义成常量        private static final SessionFactory sessionFactory;        //使用静态代码块初始化sessionFactory,因为静态代码块只会执行一次,在类加载时执行,        //所以将其放在静态代码块中初始化正符合需求        static{            try{                //这句话访问了Hibernate.cfg.xml文件,然后构建出一个SessionFactory                sessionFactory = new Configuration().configure().                        buildSessionFactory();            }catch(HibernateException he){                System.err.println("SessionFactory建立失败。" +                         he.getMessage());                throw new RuntimeException("SessionFactory建立失败。" +                         he.getMessage(),he);            }        }        /**         * 取出一个Session对象的方法         * @return 一个Session对象         */        public static Session currentSession(){            return sessionFactory.openSession();        }        /**         * 关闭Session的方法         * @param s 要关闭的Session对象         */        public static void closeSession(Session s){            if(null!=s)                s.close();        }    }

2、编写持久化类Student

  Student类中的字段与数据表Student中的字段相对应,字段名可不相同,若不相同,需要在Student.hbm.xml指定。
Student类是一个Bean类,因此只要创建好字段,然后用IDE生成getter和setter方法就完成了。

    package model;    public class Student {        private String id;        private String name;        private String cardId;        private int age;        public String getId() {            return id;        }        public void setId(String id) {            this.id = id;        }        public String getName() {            return name;        }        public void setName(String name) {            this.name = name;        }        public String getCardId() {            return cardId;        }        public void setCardId(String cardId) {            this.cardId = cardId;        }        public int getAge() {            return age;        }        public void setAge(int age) {            this.age = age;        }    }

3、为Student类创建一个与数据库表关联起来的映射文件Student.hbm.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>        <!--             class元素代表持久化类                name属性为类的全名                table 表名  默认值:类名                catalog 数据库的名字         -->        <class name="model.Student">            <!--                 id为主键元素                  name 标示符属性对应Student中的字段                  length 数据库中pid的长度                  column 对应数据库中的字段,若相同可省略                  type  类型             -->            <id name="id" column="sid">                <!--                     主键的产生器                      需要通过什么样的方式产生主键                 -->                <generator class="uuid.hex"></generator>            </id>            <!--                 代表一般的属性             -->                    <property name="cardId" type="java.lang.String"></property>                    <property name="name" type="java.lang.String"></property>                    <property name="age" type="java.lang.Integer"></property>        </class>    </hibernate-mapping>

4、编写操作数据库的类StudentDAOImp

package com.test.util;import java.util.List;import model.Student;import org.hibernate.HibernateException;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;public class StudentDAOImp {    static Session session = null;    /**     * 创建新的学生对象     * @param stu Student对象     */    public static void createStu(Student stu){        try {            //开启连接            session = HibernateSessionFactory.currentSession();            //开启事务            Transaction tx =session.beginTransaction();            session.save(stu);            //提交事务            tx.commit();        } catch (HibernateException e) {            e.printStackTrace();        } finally{            HibernateSessionFactory.closeSession(session);        }    }    /**     * 删除指定学生     * @param id 将被删除学生的id     */    public static void delStu(String id){        try{            session = HibernateSessionFactory.currentSession();            Transaction tx = session.beginTransaction();            //从数据库中取出该学生对象            Student stu = (Student)session.get(Student.class, id);            //删除此学生            session.delete(stu);            //提交事务            tx.commit();        } catch(HibernateException e){            e.printStackTrace();        } finally{            HibernateSessionFactory.closeSession(session);        }    }    /**     * 修改学生对象     * @param stu 修改后的学生对象     */    public static void mdfUpdate(Student stu){        try{            session = HibernateSessionFactory.currentSession();            Transaction tx = session.beginTransaction();            session.update(stu);            tx.commit();        } catch(HibernateException e){            e.printStackTrace();        }finally{            HibernateSessionFactory.closeSession(session);        }    }    @SuppressWarnings("unchecked")    public static List<Student> getAllStu(){        List<Student> list =null;        try {            session = HibernateSessionFactory.currentSession();            Transaction tx = session.beginTransaction();            Query q = session.createQuery("from Student");            list = q.list();            tx.commit();        } catch (HibernateException e) {            e.printStackTrace();        } finally{            HibernateSessionFactory.closeSession(session);        }        return list;    }}

5、将Hibernate.hbm.xml声明在Hibernate.cfg.xml中

这里写图片描述
产生的代码:

    <mapping resource="model/Student.hbm.xml" />

6、编写业务逻辑处理类BM

package BusinessManager;import java.util.List;import model.Student;import org.junit.Test;import com.test.util.StudentDAOImp;public class BM {    @Test    public void addStuTest(){        //创建新的学生对象        Student stu = new Student();        stu.setName("TC");        stu.setAge(21);        stu.setCardId("1411302103008");        StudentDAOImp.createStu(stu);    }    @Test    public void mdfStuTest(){        List<Student> list = StudentDAOImp.getAllStu();        Student stu = list.get(0);        stu.setName("newName");        stu.setCardId("jsdlkf");        if(stu.getAge()<50)//进行业务处理            stu.setAge(18);        StudentDAOImp.mdfUpdate(stu);    }    @Test    public void delStuTest(){        List<Student> list = StudentDAOImp.getAllStu();        Student stu = list.get(0);        StudentDAOImp.delStu(stu.getId());    }}

7、使用Junit测试BM类中的方法

常见错误解决方案

1、在测试过程中如果出现下图的情况,则是MySQL驱动包没导入,应该将mysql-connector-java-5.1.10-bin.jar导入工程中:
缺少mysql驱动包
第一、二行警告是因为没有配置log4j产生的,暂且不管。
导入包方法如下:
导包
这里写图片描述
2、如果控制台输出如下异常
对表策略异常
原因是没有设置hibernate对表的策略,解决方案,在hibernate.cfg.xml文件中进行如下操作
修改对表策略
或者在<session-factory>节点内添加如下代码

<property name="hbm2ddl.auto">update</property>

测试前的准备

1、为了能看到Hibernate操作数据库时产生的SQL语句,我们在hibernate.cfg.xml中添加如下Property:
显示SQL语句
2、打开MyEclipseDatabaseExplorer视图,若左边DB Browser没有一个数据库Driver,则是之前没创建,此时创建一个Driver
创建Driver
测试添加数据
右键点击方法名:
测试方法
其余方法同样测试。
测试添加方法
若进度条为绿色,且控制台输出如下:
生成的SQL语句
则很可能成功了,此时我们打开数据库查看
进行如下操作
查看表
直接点击执行按钮
查寻表SQL语句
在SQL Result中有如下显示便是成功了
表内数据
测试修改数据
修改表时Hibernate产生的SQL语句
修改后的结果
测试删除数据
测试删除数据
删除后

结尾

   到这里,一个能成Hibernate的CURD的工程就实现了,在学习的过程中,虽然有书本的指导,但我任然遇到了各种的麻烦,幸亏Java基础还行, 仔细分析了下就逐个解决了,总的来说还是挺顺利的。这是我学习Hibernate的开始,此博客也是我的第一篇博客。写完博客之后发现对 Hibernate的一些基础更加理解了,这里也只是记录了一个基本的操作过程,并没有写下一些概念性的文字,很多细节只能依靠读者自己去了解了。

0 0
原创粉丝点击