Hibernate初探之单表映射(一)

1.什么是ORM

ORM(Object/Relationship Mapping):对象/关系映射
写SQL语句的缺点:
1.不同的数据库使用的SQL语法不同。比如:PL/SQL(Oracle)与T/SQL(SQL Server)
2.同样的功能在不同的数据库中有不同的实现方式。比如分页SQL。
3.程序过分依赖SQL对程序的移植及扩展、维护等带来很大的麻烦。
为了完全使用面向对象思想开发软件,抛弃书写SQL的思想,需要采用一种可行ORM框架技术。

2.Hibernate简介

1.Hibernate是java领域的一个开源的ORM框架
2.Hibernate是对JDBC进行了非常轻量级的封装,实质上还是通过JDBC实现对数据库的操作
3.Hibernate在程序中的作用:持久化层,把程序中生成的对象 持久化到数据库的表中
这里写图片描述
其他主流的ORM框架技术
1.MyBatis:前身就是iBatis(Apache)
2.Toplink:后被Oracle收购,并重新包装为Oracle AS TopLink
3.EJB:本身是JAVAEE的规范(重量级)

3.使用Hibernate前准备

使用eclipse,注意要安装一个插件Hibernate Tools for Eclipse Plugins,插件可以简化ORM框架,使开发简捷高效
如何安装Hibernatetools插件:
下载http://tools.jboss.org/downloads/
点击help–install new。。–找到安装包–安装完重启
出现Hibernate文件夹即表示安装成功
原文地址:http://blog.sina.com.cn/s/blog_9868e32a010120qx.html
eclipse3.7 插件Hibernate Tools实现步骤:
1.启动eclipse
2.选择Help > Install New Software…>
3.添加如下地址:http://download.jboss.org/jbosstools/oxygen/stable/updates/
这个地址是怎么得到的。搜索jbosstools下载界面,点击下载即可。
4.出现如图:
这里写图片描述
5.在选择JBoss Web and Java EE Development展开后选择Hibernate Tools工具。
这里写图片描述
6.接下来就自动安装了,在此安装的过程网速很重要,其后就是next、finish就安装成功了。
7.接下来就可以使用Hibernate Tools 工具了在eclipse上查看如下图
这里写图片描述

4.编写第一个Hibernate例子

1.首先我们要编写一个Hibernate的配置文件hibernate.cfg.xml
2.然后创建持久化类
3.创建对象–关系映射文件
4.通过Hibernate API来编写访问数据库的代码

  • 导入Hibernate必须的jar包
    hibernate-release-4.2.4.Final\lib\required
  • 导入mysql的jdbc驱动
    mysql-connector-java-5.17-bin.jar
  • 导入junit4的jar包
    Junit-4.10.jar

5.创建hibernate工程

这里就是创建一个java项目,然后导入相应的jar包
建议在窗口 window选择最下面的一个首选项,然后打开java构建路径,将对应的jar包加在库中,这样在项目创建后可以直接导入jar包会比较方便

6.hibernate配置文档

使用hibernatetools插件去自动生成
如果编辑的时候eclipse没有出现代码提示功能,我们需要导入dtd文档的支持
这里写图片描述
配置hibernate:数据库用户名,密码,jdbc驱动,方言,URL
选择src new 最下面的其他 ,之后选择hibernate第一个cfg.xml即可。

<session-factory>   
 <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
    <property name="connection.url">jdbc:mysql://127.0.0.1:3306/hibernate?useUnicode=true&characterEncoding=UTF-8</property>
    <property name="connection.username">root</property>
    <property name="connection.password"></property>
    <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

    <property name="show_sql">true</property> <! -- 在控制台显示出sql语句 -- >
    <property name="format_sql">true</property> <! -- 按照格式化显示出sql语句 -- >
    <property name="hbm2ddl.auto">create</property> <! -- 会重新创建一张表 -- >
    <mapping resource="com/Student.hbm.xml" ></mapping>
 </session-factory>

7.创建持久化类

持久化类需要符合javabeans的设计原则

package com.imooc;

import java.util.Date;

public class Students {
    /**
     * 1.共有的类
     * 2.属性私有
     * 3.有一个不带参的默认构造方法
     * 4.属性geterseter封装
     */

    public Students() {

    }

    private int sid;//学号
    private String sname;//名字
    private String gender;//性别
    private Date birthday;//生日
    private String address;//地址

    public Students(int sid, String sname, String gender, Date birthday, String address) {
        super();
        this.sid = sid;
        this.sname = sname;
        this.gender = gender;
        this.birthday = birthday;
        this.address = address;
    }
    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 String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String toString() {
        return "Students [sid=" + sid + ", sname=" + sname + ", gender=" + gender + ", birthday=" + birthday
                + ", address=" + address + "]";
    }

}

8.创建对象-关系映射文件和数据库

创建对象关系映射文件,src,new其它,选择hibernate最后一个hbm.xml,下一步找到我们要持久化的学生类,点完成。
这是工具帮我们自动生成的配置文档,在这个文档中把我们的学生类实体类映射到一张表。并且把每一个属性都映射成了一个字段,column表示对应的字段名。这就是对象关系映射的配置文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-1-11 20:14:33 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.imooc.Students" table="STUDENTS">
        <id name="sid" type="int">
            <column name="SID" />
            <generator class="assigned" />
        </id>
        <property name="sname" type="java.lang.String">
            <column name="SNAME" />
        </property>
        <property name="gender" type="java.lang.String">
            <column name="GENDER" />
        </property>
        <property name="birthday" type="java.util.Date">
            <column name="BIRTHDAY" />
        </property>
        <property name="address" type="java.lang.String">
            <column name="ADDRESS" />
        </property>
    </class>
</hibernate-mapping>
<hibernate-configuration>
 <session-factory name="connectionName">
  <property name="connection.username">root</property>
  <property name="connection.password">root</property>
  <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&amp;amp;characterEncoding=UTF-8</property>
  <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="show_sql">true</property>
  <property name="format_sql">true</property>
  <property name="hbm2ddl.auto">create</property>
  <mapping resource="Students.hbm.xml"/>
 </session-factory>
</hibernate-configuration>

在.cfg.xml中添加<mapping resourse="Students.hbm.xml"/>
随后新建一个mysql数据库 hibernate。

9.使用JUnit进行测试

使用Junit进行测试,这里需要介绍三个注解

  • @Test:测试方法
  • @Before:初始化方法
  • @After:释放资源
    在我们执行测试方法前,也就是测试某个test标签下的方法时,它会先执行before注解标签下面的这个方法,然后在执行test这个方法,执行完毕之后要释放资源,执行after标签下的方法。

这里我们先在项目名下new source folder 新建源文件包,一般测试是test。在包里新建一个测试类StudentsTest

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

//测试类
public class StudentsTest {

    @Before
    public void init() {

    }

    @After
    public void destory() {}



    @Test
    public void testSaveStudents() {

    }

}

10.通过Hibernate API编写访问数据库的代码

最后我们呢就要通过Hibernate API来编写访问数据库的代码,分以下几步:

Configuration config=new Configuration().configure();//创建配置对象
ServiceRegistry serviceRegistry =new ServiceRegistryBuilder().applySettings (config.getProperties()).buildServiceRegistry();
//创建服务注册对象
sessionFactory =config.buildSessionFactory(serviceRegistry);
//创建会话工厂对象
session =sessionFactory.openSession();//打开会话。
transaction =session.beginTransaction();//打开事务 

这些步骤都是要放到我们的初始化方法当中

//测试类
public class StudentsTest {
    private SessionFactory sessionFactory;
    private Session session;
    private Transaction transaction;


    @Before
    public void init() {
        Configuration config=new Configuration().configure();//创建配置对象
        config.addClass(Students.class);
        ServiceRegistry serviceRegistry =new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
        //创建服务注册对象
        sessionFactory =config.buildSessionFactory(serviceRegistry);
        //创建会话工厂对象
        session =sessionFactory.openSession();//打开会话。
        transaction =session.beginTransaction();//打开事务 
    }

    @After
    public void destory() {
        transaction.commit();//提交事务
        session.close();//关闭会话
        sessionFactory.close();//关闭会话工厂
    }



    @Test
    public void testSaveStudents() {
        //生成一个学生对象
        Students s=new Students(1,"张三丰","男",new Date(),"武当山");
        session.save(s);//保存对象进数据库

    }

}

junit4调试,可以看到数据库中多了一张students的表,并且添加了一行内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
private static void printTableMetaInfo(Session session) { Connection connection = session.connection(); try { DatabaseMetaData metaData = connection.getMetaData(); ResultSet result = metaData.getColumns(null, null, NameOfTable, null); String strInJava = ""; String typeInJava; while (result.next()) { String columnName = result.getString(4); if ("stampTime".equalsIgnoreCase(columnName)) { continue; } int columnType = result.getInt(5); String nameFirstLetterLower = columnName.substring(0, 1).toLowerCase() + columnName.substring(1); switch (columnType) { case Types.VARCHAR: case Types.LONGVARCHAR: case Types.LONGNVARCHAR: case Types.NVARCHAR: case Types.CHAR: typeInJava = "String"; break; case Types.TINYINT: case Types.SMALLINT: case Types.INTEGER: typeInJava = useInteger ? "Integer" : "int"; break; case Types.TIMESTAMP: case Types.BINARY: typeInJava = "Calendar"; break; case Types.DECIMAL: typeInJava = "BigDecimal"; break; case Types.BIGINT: typeInJava = "BigInteger"; break; case Types.LONGVARBINARY: typeInJava = "byte[]"; break; case Types.DATE: typeInJava = "Calendar"; break; default: throw new Exception("Unknown type " + columnType + " and column is " + columnName); } strInJava += " private " + typeInJava + " " + nameFirstLetterLower + ";\n"; // strInHibernate += "\n"; } String str = "import javax.persistence.Entity;\n" + "import javax.persistence.Id;\n" + "import javax.persistence.Table;\n" + "import java.util.Calendar;\n\n"; str += "@Entity\n"; str += "@Table(name=\"$\")\n".replace("$", NameOfTable); str += "public class $ {\n".replace("$", NameOfTable.substring(2)); str += "\n @Id\n"; str += strInJava; str += "}"; System.out.println(str); StringSelection stringSelection = new StringSelection(str); Clipboard clpbrd = Toolkit.getDefaultToolkit().getSystemClipboard(); clpbrd.setContents(stringSelection, null); } catch (Exception e) { e.printStackTrace(); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值