之前我们用一个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。

java之Hibernate框架实现数据库操作的更多相关文章

  1. Java通过JDBC 进行MySQL数据库操作

    转自: http://blog.csdn.net/tobetheender/article/details/52772157 Java通过JDBC 进行MySQL数据库操作 原创 2016年10月10 ...

  2. java:Hibernate框架1(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态,增删查改)

    1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件  准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cf ...

  3. ThinkPhp框架的数据库操作(查询)

    TP框架有一套自己的数据库操作的代码,包括数据库的增.删.改.查.本文主要讲解TP框架的数据库查询操作. 找到入口文件的控制器: 我这里的入口文件是Show文件夹下的控制器. 打开Login控制器. ...

  4. Java常用工具类之数据库操作辅助类DBUtil.java

    package com.qushida.util; import java.beans.BeanInfo; import java.beans.Introspector; import java.be ...

  5. 018.CI4框架CodeIgniter数据库操作之:Delete删除一条数据

    01. 在Model中写数据库操作语句,代码如下: <?php namespace App\Models\System; use CodeIgniter\Model; class User_mo ...

  6. Java/C++实现模板方法模式---数据库操作

    对数据库的操作一般包括连接.打开.使用.关闭等步骤,在数据库操作模板类中我们定义了connDB().openDB().useDB().closeDB()四个方法分别对应这四个步骤.对于不同类型的数据库 ...

  7. 017.CI4框架CodeIgniter数据库操作之:Updata更新修改一条数据

    01. 在Model中写入数据库操作的代码如下: <?php namespace App\Models\System; use CodeIgniter\Model; class User_mod ...

  8. java:Hibernate框架4(延迟加载(lazy),抓取(fetch),一级缓存,get,load,list,iterate,clear,evict,flush,二级缓存,注解,乐观锁和悲观锁,两者的比较)

    1.延时加载和抓取: hibernate.cfg.xml: <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-co ...

  9. Java从入门到精通——数据库篇之JAVA中的对Oracle数据库操作

    在Java中对Oracle数据库的操作分为两种:一.查询.二.非查询. 下面是我对其进行总结: 一.查询数据 /** * 根据用户代码查询 * @param userId * @return 如果存在 ...

随机推荐

  1. jdbc连接sql数据库

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...

  2. Linux0.11进程分配时间片的策略

    想知道内核什么时候给进程重新分配时间片,最好的办法就是阅读源代码(其中已经打了注释) /******************************************************** ...

  3. css之盒子模型案例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 【算法导论】最小生成树之Prime法

    关于最小生成树的概念,在前一篇文章中已经讲到,就不在赘述了.下面介绍Prime算法:         其基本思想为:从一个顶点出发,选择由该顶点出发的最小权值边,并将该边的另一个顶点包含进来,然后找出 ...

  5. XBMC源代码分析 3:核心部分(core)-综述

    前文分析了XBMC的整体结构以及皮肤部分: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) 本文以及以后的文章主要分析XBMC的VC工程中的源代码. ...

  6. 使用MD5加密的登陆demo

    最近接手了之前的一个项目,在看里面登陆模块的时候,遇到了一堆问题.现在记录下来. 这个登陆模块的逻辑是这样的 1 首先在登陆之前,调用后台的UserLoginAction类的getRandomKey方 ...

  7. 【Visual C++】游戏编程学习笔记之三:游戏循环的使用

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44208419 作者:Zee ...

  8. VirtualBox安装RHEL之后配置桥接网络

    VirtualBox安装RHEL之后配置桥接网络 1 如果主机是Intel (R) Ethernet Connection I217-LM上网的: 2 如果主机是无线上网的, 如ipconfig显示如 ...

  9. gtk+程序在关闭主窗口时的事件流

    当鼠标单击gtk+窗口的关闭按钮时,程序首先接收到delete_event,当该事件处理函数返回TRUE表示事件已处理禁止进一步传播,从而取消关闭操作:当返回FALSE时,事件消息进一步向上传播,此时 ...

  10. linux内核 container_ofC语言之应用

    之前在剖析内核链表的文章中就有说到这个 container_of宏展开后的应用技巧. //offset(struct list , list);----->展开后((size_t) & ...