初识Hibernate之增删改查

来源:互联网 发布:淘宝客推广教程 编辑:程序博客网 时间:2024/06/08 16:43

作为JAVA祖传SSH三大框架的Hibernate,这里做一个简单的小介绍

一、Hibernate 简介

1、什么是 Hibernate

Hibernate 是一个开源框架,与 Struts 这种 MVC(Model-View-Controller) 框架不同的是,Hibernate 是一种 ORM(Object/Relational Mapping) 框架。

ORM 意为对象关系映射,因此 Hibernate 会在 Java 对象和关系数据库之间建立某种映射,以达到存取 Java 对象的目的,是实现持久化存储(将内存中的数据存储在关系型的数据库、磁盘文件、XML数据文件中等等)的一种解决方案。

Hibernate 不仅管理 Java 类到数据库表的映射(包括从 Java 数据类型到 SQL 数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用 SQL 和 JDBC 处理数据的时间。这正是它的设计目标,即将软件开发人员从大量相同的数据持久层相关编程工作中解放出来。

2、基本APIs

  • SessionFactory

    (org.hibernate.SessionFactory)

对于单个数据库映射关系经过编译后的内存缓存,它是线程安全且不可变的。是 Session 生成的工厂实例,也是 ConnectionProvider 的一个客户端(会用到 ConnectionProvider)。它在进程或集群的级别上,为那些在事务之前可重复使用的数据提供了选择性的二级缓存。

  • Session(org.hibernate.Session)

提供应用程序和持久化存储介质之间的一个单线程的会话对象,此对象生存期很短。它隐藏了 JDBC 连接,也是 Transaction 的工厂实例。对于应用的持久化对象及其集合,它提供了一个一级缓存;当遍历导航对象图或者根据持久化标识查找对象时,会用到这个一级缓存。

  • 持久化的对象及其集合

具有持久化状态和业务功能的单线程对象,同样生存期很短。这些对象可能是普通的 JavaBeans/POJOs(Plain Ordinary Java Object),它们只能与一个 Session 相关联。一旦 Session 被关闭,它们就会脱离持久化状态,并且可以被应用程序的任何层使用(比如跟表示层打交道的 data transfer objects)

  • 瞬态(transient)、脱管

    状态(detached)的对象及其集合

持久化的类目前没有和 Session 相关联的实例。他们可能是因为在被应用实例化后还没有被持久化,也可能是由于实例化它们的 Session 对象已经被关闭,从而脱离了持久化状态。

  • 事务(Transaction)

    (org.hibernate.Transaction)

(可选的)它是应用程序用来指定原子操作单元范围的对象,是一个单线程的、短生存周期的对象。它使用抽象把应用从底层的 JDBC、JTA 以及 CORBA 事务中隔离开。在某些情况下,一个 Session 可能涵盖多个 Transactions 对象。尽管使用该对象是可选的,但事务的划分(无论是使用底层的 API 还是使用 Transaction 对象)都是不可选的。

  • ConnectionProvider

    (org.hibernate.connection.ConnectionProvider)

(可选的)JDBC 连接的工厂和连接池。它通过抽象把应用从底层的 DataSource 或者 DriverManager 隔离开。这并不开放给应用程序使用,但对开发者而言是可以扩展或实现的。

  • TransactionFactory

    (org.hibernate.TransactionFactory)

(可选的)生成 Transaction 对象实例的工厂。仅供开发者扩展/实现用,并不开放给应用程序使用。

  • 扩展接口(Extension Interfaces)

Hibernate 提供了很多可选的扩展接口,你可以通过实现它们来定制你的持久层的行为。

二、Hibernate 简单增删改查

1、实验环境

windows+mysql+eclipse

2、mysql准备

查看数据库列表:

为了实验方便,我们在这里新建一个数据库并取名 hibernate 用作实验。 create databases hibernate;

进入到hibernate数据库:use hibernate;

3、eclipse准备

3.1、jar包导入

这里我们需要导入jar包,分别是hibernate包和mysql包

包下载地址如下链接:http://pan.baidu.com/s/1pLPiBCf 密码:yi37

不会导入包的小伙伴儿请自行离去百度。

3.2、代码们

(1)新建实体类 User.java

这个没什么太多说的,一个用户具有:id、username、password 三个属性。
package entity;public class User {    private int id;    private String username;    private String password;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }}
(2)配置 hibernate.cfg.xml

在 src 目录下,新建 hibernate.cfg.xml 文件,其配置如下:
<?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>    <session-factory>        <!-- Database connection settings -->        <!-- 表示使用 mysql 数据库驱动类 -->        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>        <!-- jdbc 的连接 url 和数据库(使用我们之前新建的 hibernate)-->        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>        <!-- 数据库用户名 -->        <property name="connection.username">root</property>        <!-- 密码(这里为空) -->        <property name="connection.password"></property>        <!-- JDBC connection pool (use the built-in) -->        <!-- <property name="connection.pool_size">1</property>-->        <!-- 数据库使用的方言 -->        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>        <!-- Echo all executed SQL to stdout -->        <!-- 设置 打印输出 sql 语句 为真 -->        <property name="show_sql">true</property>        <!-- 设置格式为 sql -->        <property name="format_sql">true</property>        <!-- 第一次加载 hibernate 时根据实体类自动建立表结构,以后自动更新表结构 -->        <property name="hbm2ddl.auto">update</property>                 <!-- 映射文件 -->        <mapping resource="entity/User.hbm.xml"/>    </session-factory></hibernate-configuration>

查询数据库端口号:show variables like 'port';
 查询用户名和密码: select host,user,password from mysql.user;

(3)配置 配置 User.hbm.xml

一个实体类对应一个映射文件,将User.hbm.xml放在User一个包下
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- 映射对应的 package --><hibernate-mapping package="entity">    <!-- 实体类和数据库中的表对应(如果没有这个表则新建) -->    <class name="User" table="user_info">        <!-- id主键 和其他属性对应表中相应的字段(这些都是在 User.java 实体类中定义的) -->        <id name="id" column="user_id"/>        <property name="username" column="user_username"></property>        <property name="password" column="user_password"></property>    </class></hibernate-mapping>

4、运行


(1)增

public class Test {    @SuppressWarnings("unchecked")    public static void main(String[] args) {        // 获取 Hibernate 配置信息        Configuration configuration = new Configuration().configure();        // 根据 configuration 建立 sessionFactory        SessionFactory sessionFactory = configuration.buildSessionFactory();        // 开启 session(相当于开启 JDBC 的 connection)        Session session = sessionFactory.openSession();        // 创建并开启事务对象        session.beginTransaction();        // 新建对象,并赋值        User user = new User();        user.setId(1);        user.setUsername("admin");        user.setPassword("admin");        // 保存对象        session.save(user);        // 提交事务        session.getTransaction().commit();        // 关闭 session 和 sessionFactory        session.close();        sessionFactory.close();    }}
(2)删
public class Test {    @SuppressWarnings("unchecked")    public static void main(String[] args) {        Configuration configuration = new Configuration().configure();        SessionFactory sessionFactory = configuration.buildSessionFactory();        Session session = sessionFactory.openSession();        session.beginTransaction();        StringBuilder hq = new StringBuilder();        // 对比查找时候的操作来看,因为我们需要修改指定 name 的用户密码,后面需要再添加查询条件        // 注意 from、where 的空格,":name" 表示一个参数        hq.append("from ").append(User.class.getName()).append(" where user_username=:name");        Query query = session.createQuery(hq.toString());        // 这里就设定参数 name 的值为"user1"        query.setString("name","user1" );         List<User> users = query.list();        for (User user : users) {            // 注意这里是 delete            session.delete(user);        }        session.getTransaction().commit();        session.close();        sessionFactory.close();    }
(3)查

public class Test {    @SuppressWarnings("unchecked")    public static void main(String[] args) {        Configuration configuration = new Configuration().configure();        SessionFactory sessionFactory = configuration.buildSessionFactory();        Session session = sessionFactory.openSession();        session.beginTransaction();        // 利用 StringBuilder 来连接查询语句        StringBuilder hq = new StringBuilder();        // 从 User 里面查找(注意 from 后有空格)        // 相当于 "select * from user_info;"        hq.append("from ").append( User.class.getName() );        // 利用 session 建立 query        Query query = session.createQuery( hq.toString() );        // 序列化 query 的结果为一个 list 集合        List<User> users = query.list();        // 打印每一个 User 信息(这里只打印了名字,你也可以打印其他信息)        for (User user : users) {            System.out.println( user.getUsername() );        }        session.getTransaction().commit();        session.close();        sessionFactory.close();    }}

(4)改
public class Test {    @SuppressWarnings("unchecked")    public static void main(String[] args) {        Configuration configuration = new Configuration().configure();        SessionFactory sessionFactory = configuration.buildSessionFactory();        Session session = sessionFactory.openSession();        session.beginTransaction();        StringBuilder hq = new StringBuilder();        // 对比查找的操作来看,因为我们需要修改指定 name 的用户密码,后面需要再添加查询条件        // 注意 from、where 的空格,":name" 表示一个参数        hq.append("from ").append(User.class.getName()).append(" where user_username=:name");        Query query = session.createQuery(hq.toString());        // 这里就设定参数 name 的值为"user1"        query.setString("name","user1" );         List<User> users = query.list();        for (User user : users) {            // 修改 user1 的密码            user.setPassword("123-user");            // 注意这里是 update            session.update(user);        }        session.getTransaction().commit();        session.close();        sessionFactory.close();    }

好了,这里留下我完整的文件,还没弄懂的小伙伴儿直接点击下载运行哦~如果你有问题请直接联系我哦

链接:http://pan.baidu.com/s/1eSwuI8U 密码:oqbf





0 0