Hibernate第一篇【介绍Hibernate,简述ORM,快速入门】

来源:互联网 发布:活动报名软件 编辑:程序博客网 时间:2024/06/05 06:51

前言

前面已经学过了Struts2框架了,紧接着就是学习Hibernate框架了…本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门

什么是Hibernate框架?

Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象

为什么要使用Hibernate?

既然Hibernate是关于Java对象和关系数据库之间的联系的话,也就是我们MVC中的数据持久层->在编写程序中的DAO层…

首先,我们来回顾一下我们在DAO层写程序的历程吧:

  1. 在DAO层操作XML,将数据封装到XML文件上,读写XML文件数据实现CRUD
  2. 在DAO层使用原生JDBC连接数据库,实现CRUD
  3. 嫌弃JDBC的Connection\Statement\ResultSet等对象太繁琐,使用对原生JDBC的封装组件–>DbUtils组件

我们来看看使用DbUtils之后,程序的代码是怎么样的:

public class CategoryDAOImpl implements zhongfucheng.dao.CategoryDao {    @Override    public void addCategory(Category category) {        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());        String sql = "INSERT INTO category (id, name, description) VALUES(?,?,?)";        try {            queryRunner.update(sql, new Object[]{category.getId(), category.getName(), category.getDescription()});        } catch (SQLException e) {            throw new RuntimeException(e);        }    }    @Override    public Category findCategory(String id) {        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());        String sql = "SELECT * FROM category WHERE id=?";        try {            Category category = (Category) queryRunner.query(sql, id, new BeanHandler(Category.class));            return category;        } catch (SQLException e) {            throw new RuntimeException(e);        }    }    @Override    public List<Category> getAllCategory() {        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());        String sql = "SELECT * FROM category";        try {            List<Category> categories = (List<Category>) queryRunner.query(sql, new BeanListHandler(Category.class));            return categories;        } catch (SQLException e) {            throw  new RuntimeException(e);        }    }}

其实使用DbUtils时,DAO层中的代码编写是很有规律的。

  • 当插入数据的时候,就将JavaBean对象拆分,拼装成SQL语句
  • 当查询数据的时候,用SQL把数据库表中的列组合,拼装成JavaBean对象

也就是说:javaBean对象和数据表中的列存在映射关系!如果程序能够自动生成SQL语句就好了….那么Hibernate就实现了这个功能!

简单来说:我们使用Hibernate框架就不用我们写很多繁琐的SQL语句,从而简化我们的开发!


ORM概述

在介绍Hibernate的时候,说了Hibernate是一种ORM的框架。那什么是ORM呢?ORM是一种思想

  • O代表的是Objcet
  • R代表的是Relative
  • M代表的是Mapping

ORM->对象关系映射….ORM关注是对象与数据库中的列的关系

这里写图片描述


Hibernate快速入门

学习一个框架无非就是三个步骤:

  • 引入jar开发包
  • 配置相关的XML文件
  • 熟悉API

引入相关jar包

我们使用的是Hibernate3.6的版本

hibernate3.jar核心 + required 必须引入的(6个) + jpa 目录 + 数据库驱动包

这里写图片描述

编写对象和对象映射

编写一个User对象->User.java

public class User {    private int id;    private String username;    private String password;    private String cellphone;    //各种setter和getter}

编写对象映射->User.hbm.xml。一般它和JavaBean对象放在同一目录下

我们是不知道该XML是怎么写的,可以搜索一下Hibernate文件夹中后缀为.hbm.xml。看看它们是怎么写的。然后复制一份过来

这里写图片描述

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><!--   This mapping demonstrates content-based discrimination for the  table-per-hierarchy mapping strategy, using a formula  discriminator.--><hibernate-mapping     package="org.hibernate.test.array">    <class name="A" lazy="true" table="aaa">        <id name="id">            <generator class="native"/>        </id>        <array name="bs" cascade="all" fetch="join">            <key column="a_id"/>            <list-index column="idx"/>            <one-to-many class="B"/>        </array>    </class>    <class name="B" lazy="true" table="bbb">        <id name="id">            <generator class="native"/>        </id>    </class></hibernate-mapping>
  • 在上面的模板上修改~下面会具体讲解这个配置文件!
<!--在domain包下--><hibernate-mapping package="zhongfucheng.domain">    <!--类名为User,表名也为User-->    <class name="User"  table="user">        <!--主键映射,属性名为id,列名也为id-->        <id name="id" column="id">            <!--根据底层数据库主键自动增长-->            <generator class="native"/>        </id>        <!--非主键映射,属性和列名一一对应-->        <property name="username" column="username"/>        <property name="cellphone" column="cellphone"/>        <property name="password" column="password"/>    </class></hibernate-mapping>

主配置文件

hibernate.cfg.xml

如果使用Intellij Idea生成的Hibernate可以指定生成出主配置文件hibernate.cfg.xml,它是要放在src目录下的

如果不是自动生成的,我们可以在Hibernate的hibernate-distribution-3.6.0.Final\project\etc这个目录下可以找到

它长得这个样子:

<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD//EN"        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration>    <session-factory>        <property name="connection.url."/>        <property name="connection.driver_class"/>        <property name="connection.username"/>        <property name="connection.password"/>        <!-- DB schema will be updated if needed -->        <!-- <property name="hbm2ddl.auto">update</property> -->    </session-factory></hibernate-configuration>

通过上面的模板进行修改,后面会有对该配置文件进行讲解!

<hibernate-configuration>    <!-- 通常,一个session-factory节点代表一个数据库 -->    <session-factory>        <!-- 1. 数据库连接配置 -->        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="hibernate.connection.url">jdbc:mysql:///zhongfucheng</property>        <property name="hibernate.connection.username">root</property>        <property name="hibernate.connection.password">root</property>        <!--            数据库方法配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql         -->        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>        <!-- 2. 其他相关配置 -->        <!-- 2.1 显示hibernate在运行时候执行的sql语句 -->        <property name="hibernate.show_sql">true</property>        <!-- 2.2 格式化sql -->        <property name="hibernate.format_sql">true</property>        <!-- 2.3 自动建表  -->        <property name="hibernate.hbm2ddl.auto">create</property>        <!--3. 加载所有映射-->        <mapping resource="zhongfucheng/domain/User.hbm.xml"/>    </session-factory></hibernate-configuration>

测试

package zhongfucheng.domain;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.classic.Session;/** * Created by ozc on 2017/5/6. */public class App {    public static void main(String[] args) {        //创建对象        User user = new User();        user.setPassword("123");        user.setCellphone("122222");        user.setUsername("nihao");        //获取加载配置管理类        Configuration configuration = new Configuration();        //不给参数就默认加载hibernate.cfg.xml文件,        configuration.configure();        //创建Session工厂对象        SessionFactory factory = configuration.buildSessionFactory();        //得到Session对象        Session session = factory.openSession();        //使用Hibernate操作数据库,都要开启事务,得到事务对象        Transaction transaction = session.getTransaction();        //开启事务        transaction.begin();        //把对象添加到数据库中        session.save(user);        //提交事务        transaction.commit();        //关闭Session        session.close();    }}

值得注意的是:JavaBean的主键类型只能是int类型,因为在映射关系中配置是自动增长的,String类型是不能自动增长的。如果是你设置了String类型,又使用了自动增长,那么就会报出下面的错误!

    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'zhongfucheng.user' does

执行完程序后,Hibernate就为我们创建对应的表,并把数据存进了数据库了

这里写图片描述


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 海信电视蓝频了怎么办 连网电视蓝频了怎么办 英雄联盟画面卡顿怎么办 长残了怎么办原来很帅 被吓到了怎么办没精神 宝宝吓着怎么办最有效 4个月婴儿易惊吓怎么办 心里有问题的人怎么办 减肥的时候想吃东西怎么办 大联盟ping很高怎么办 酷派手机弹广告怎么办 孕早期肚子紧绷怎么办 怀孕2个月同房了怎么办 怀孕前三月同房了怎么办 人流前三天同房了怎么办 人流后三天同房了怎么办 吃避孕药后月经量少怎么办 排卵日同房不想怀孕怎么办 排卵日同房没有怀孕怎么办 想怀孕想生儿子怎么办 到期大姨妈不来怎么办 怕怀孕月经不来怎么办 宫颈环扎后宫缩怎么办 来例假刺激外阴高潮了怎么办 客人消费完说没钱怎么办? 孕13周血糖偏高怎么办 餐后血糖高14点怎么办 餐后血糖20多怎么办 空腹血糖6.6饭后9.2怎么办 键盘shift键失效了怎么办 灵异附身夫妻不合怎么办 鞋子买大了半码怎么办 鞋子买小了半码怎么办 黑布鞋鞋面白了怎么办 黑布鞋不黑了怎么办 黑布鞋退白了怎么办 老北京布鞋款式太少怎么办 老人输液抽搐后昏迷怎么办 头七家里有狗怎么办 股票退市股民的钱怎么办 美国股票退市股民怎么办