zoukankan      html  css  js  c++  java
  • java之Hibernate框架实现数据库操作

    之前我们用一个java类连接MySQL数据库实现了数据库的增删改查操作---------MySQL篇

    但是数据库种类之多,除了MySQL,还有Access、Oracle、DB2等等,而且每种数据库语言都不尽相同;

    这时,我们就需要一个框架来实现对主流数据库操作的兼容,并且简化操作流程,Hibernate就是其中一款

    主流框架。这里我们用Myeclipse作为开发软件来示例。

    1.建立数据库连接

    开启MySQL数据库服务,并在Myeclipse中,Window-->Show View-->DB Browser,打开数据库窗口;

    右键New,这里要求你输入你开启的数据库信息,并对其进行连接,因为我这里用的是MySQL,所以选择

    信息如下:

    Driver template:MySQL Connecter/J;

    Driver name:自定义,但是推荐使用和项目相关的名字;

    Conection URL:jdbc:mysql://localhost:8090/eco(这里写自己数据库的地址);

    Driver Jars:这里需要添加一个数据库驱动,在这里是MySQL的JDBC驱动,提前下载好的;

    然后就是用户名、密码了,如果信息无误,那么连接成功。

    2.新建java项目,并为其加入Hibernate特性

    流程如下:

    右键项目-->Myeclipse-->Add Hibernate Capabilities-->选择版本,我这里选的是4.1版本,然后选择Hibernate

    的Core核心包,下一步;

    选择之前连接的数据库-->在这里会生成一个hibernate.cfg.xml文件,当前存储了数据库的连接信息-->选择一个

    目录来放置HibernateSessionFactory.java这个类-->finish。

    这个类中的方法,会在后面的数据库操作中用到,这里Hibernate已经帮我们写好了,后面加以调用就OK了。

    3.反向生成持久化类

    数据库中建立一张表table,并为其添加属性字段,比如ID,name,age等等,在这里我们使用的是依靠表来

    反向生成持久化类(和表中属性相对应的类文件),表的信息设置好之后,右键表-->Hibernate Reverse Engineer;

    这里会生成一个持久化类和关于类与表映射关系的XML文件,系统让你选择一个安放路径,POJO<>DB字段打

    钩,表示项目到数据库的映射-->Type类型:Java,ID字段(主键)的类型,我这里选的是assigned(手动输入),

    如果ID信息填的是学号的话,这样就比较靠谱,如果没有什么切实意义,那么选native,他会更具数据库类别自

    动匹配类型,MySQL就会是自增-->finish。

    4.映射文件和数据库信息文件

    Student.hbm.xml

     1 <hibernate-mapping>
     2     <class name="student.Student" table="student" catalog="eco">
     3         <id name="id" type="java.lang.Integer">
     4             <column name="id" />
     5             <generator class="assigned" />
     6         </id>
     7         <property name="user" type="java.lang.String">
     8             <column name="user" length="16" not-null="true" />
     9         </property>
    10         <property name="password" type="java.lang.String">
    11             <column name="password" length="16" not-null="true" />
    12         </property>
    13         <property name="age" type="java.lang.Integer">
    14             <column name="age" not-null="true" />
    15         </property>
    16     </class>
    17 </hibernate-mapping>

    这表示了student包下的Student持久化类与数据库表student的映射关系,property是持久化类中的成员变量,

    column是数据库表的属性字段,它们一一对应,Id标签表示这个字段是主键。

    hibernate.cfg.xml

     1 <session-factory>
     2         <property name="dialect">
     3             org.hibernate.dialect.MySQLDialect
     4         </property>
     5         <property name="connection.url">
     6             jdbc:mysql://localhost:8090/eco
     7         </property>
     8         <property name="connection.username">root</property>
     9         <property name="connection.password">root</property>
    10         <property name="connection.driver_class">
    11             com.mysql.jdbc.Driver
    12         </property>
    13         <property name="myeclipse.connection.profile">
    14             mysqljdbc
    15         </property>
    16         
    17         <mapping resource="student/Student.hbm.xml" />
    18     </session-factory>

    这是数据库信息文件以及映射文件的注册,其实property标签还可以加几个:

    <property name="show_sql">true</property>表示进行数据库操作时,在后台打印sql语句

    <property name="fomat_sql">true</property>表示将打印的sql语句格式化

    <property name="hbm2ddl.auto">create</property>添加记录时对表的操作处理,create删除新建,update更新

    5.单元测试

    这里来个插曲,就是单元测试,有了单元测试,我们就不用像以前那样总是新建一个程序入口的main方法来运行

    代码功能了,可以选择性的运行功能块(方法)。

    首先要为项目导入Junit单元测试工具的jar包,然后新建一个测试类;

     1 public class StudentTest {
     2     private Session session = HibernateSessionFactory.getSession();
     3     private Transaction transaction;
     4 
     5     @Before
     6     public void init() {
     7         // 开启事务
     8         transaction = session.beginTransaction();
     9     }
    10 
    11     @After
    12     public void distory() {
    13         // 提交事务
    14         transaction.commit();
    15         // 关闭会话
    16         session.close();
    17         // 关闭会话工厂
    18         HibernateSessionFactory.getSessionFactory().close();
    19     }
    20 
    21     @Test
    22     public void testadd() {
    23         // 事务具体内容
    24         Student s = new Student(334, "桔子桑", "12646574", 26);
    25         session.save(s);
    26     }
    27 
    28 }

    我们来看这三个注解:

    @Before 相当于初始化,我们在这个方法中实现了开启事务;

    @Test     在这里安排想要实现的功能,布置真正要做的事;

    @After    相当于销毁,在这里我们先把任务提交给数据库,然后关闭会话/会话工厂,如果不关闭,随着对数据库连接

    的次数增加,有可能导致连接池溢出,所以,我们在任务结束之后,关闭会话。

    6.增删改查

     1     @Test
     2     public void testadd() {
     3         // 事务具体内容
     4         Student s = new Student(334, "桔子桑", "12646574", 26);
     5         session.save(s);
     6     }
     7     @Test
     8     public void testupdate() {
     9         // 事务具体内容
    10         Student s = (Student)session.get(Student.class, 1);
    11         s.setAge(25);
    12         session.update(s);
    13     }
    14     @Test
    15     public void testdelete() {
    16         // 事务具体内容
    17         Student s = (Student)session.get(Student.class, 1);
    18         session.delete(s);
    19     }
    20     @Test
    21     public void testget() {
    22         // 事务具体内容
    23         Student s = (Student)session.get(Student.class, 1);
    24         System.out.println(s);
    25     }

    以上就是数据库的增删改查功能,是不是很方便呢,再也不用冥思苦想地去拼接sql语句了,

    Student.class表示Student类的类类型,是java反射的知识。

    温馨提示:Hibernate版本不同,获取会话工厂的方法也会有差异,本文使用的是4.1版本的Hibernate。

  • 相关阅读:
    [No000037]操作系统Operating Systems操作系统历史与硬件概况History of OS & Summaries!
    [No000036]操作系统Operating Systems系统调用的实现System_Call
    [No000035]操作系统Operating System之OS Interface操作系统接口
    [No000034]知乎-长期接收碎片化知识有什么弊端?
    [No000033]码农网-如何锻炼出最牛程序员的编码套路
    [No000032]程序员的年龄天花板
    [No000031]操作系统 Operating Systems 之Open the OS!
    [No000030]程序员节发点别的:中国教育整个把人脑子搞坏了-易中天
    [No00002F]3步,教你如何分解需求
    [No00002E]关于大数据,你不知道的6个迷思
  • 原文地址:https://www.cnblogs.com/eco-just/p/7820897.html
Copyright © 2011-2022 走看看