Hibernate入门(4)- Hibernate数据操作

Hibernate加载数据

Session.get(Class clazz, Serializable id)

  • clazz:需要加载对象的类,例如:User.class

  • id:查询条件(实现了序列化接口的对象):

返回值: 此方法返回类型为Object,也就是对象,然后我们再强行转换为需要加载的对象就可以了。

如果数据不存在,则返回null;

注:执行此方法时立即发出查询SQL语句。加载User对象

加载数据库中存在的数据,代码如下

@Test
public void testLoad() {
    Session session = null;
    Transaction tx = null;

    try {
        session = HibernateUtil.getSession();
        tx = session.beginTransaction();

        User user = (User) session.get(User.class,"4028802c46d255740146d25576320000");

        // 数据加载完后的状态为persistent状态。数据将与数据库同步。
        System.out.println("user.name=" + user.getName());

        // 因为此的user为persistent状态,所以数据库进行同步为龙哥。
        user.setName("龙哥");
        session.getTransaction().commit();
    } catch (HibernateException e) {
        e.printStackTrace();
        session.getTransaction().rollback();
    } finally {
        if (session != null) {
            if (session.isOpen()) {
                session.close();
            }
        }
    }
}

Object Session.load(Class clazz, Serializable id)

  • clazz:需要加载对象的类,例如:User.class

  • id:查询条件(实现了序列化接口的对象):例"4028802c46d255740146d25576320000"字符串已经实现了序列化接口。

  • 此方法返回类型为Object,但返回的是代理对象。

  • 执行此方法时不会立即发出查询SQL语句。只有在使用对象时,它才发出查询SQL语句,加载对象。

  • 因为load方法实现了lazy(称为延迟加载、赖加载)

  • 延迟加载:只有真正使用这个对象的时候,才加载(才发出SQL语句)

  • hibernate延迟加载实现原理是代理方式。

  • 采用load()方法加载数据,如果数据库中没有相应的记录,则会抛出异常对象不找到(org.hibernate.ObjectNotFoundException)

复制代码

@Test
public void testLoad() {
    Session session = null;
    Transaction tx = null;
    try {
        session = HibernateUtil.getSession();
        tx = session.beginTransaction();

        User user = (User) session.load(User.class,
                "4028802c46d255740146d25576320000");
        // 只有在使用对象时,它才发出查询SQL语句,加载对象。
        System.out.println("user.name=" + user.getName());
        // 因为此的user为persistent状态,所以数据库进行同步为龙哥。
        user.setName("发哥");
        session.getTransaction().commit();
    } catch (HibernateException e) {
        e.printStackTrace();
        session.getTransaction().rollback();
    } finally {
        if (session != null) {
            if (session.isOpen()) {
                session.close();
            }
        }
    }
}

Hibernate两种加载数据方式的区别

  • get()方法默认不支持lazy(延迟加载)功能,而load支持延迟加载
  • get()方法在查询不到数据时,返回null,而load因为支持延迟加载,只有在使用对象时才加载,所以如果数据库中不在数据load会抛出异常(org.hibernate.ObjectNotFoundException)。
  • get()和load()只根据主键查询,不能根据其它字段查询,如果想根据非主键查询,可以使用HQL

hibernate更新数据

建立使用hibernate进行更新数据时,先加载数据,然后再修改后更新。
否则一些字段可以会被null替换。

@Test
public void testDelete() {
    Session session = null;
    Transaction tx = null
    try {
        session = HibernateUtil.getSession();
        tx = session.beginTransaction();
        User user = (User) session.load(User.class,
                "4028802c46d255740146d25576320000");
        session.delete(user);
        session.getTransaction().commit();
    } catch (HibernateException e) {
        e.printStackTrace();
        session.getTransaction().rollback();
    } finally {
        if (session != null) {
            if (session.isOpen()) {
                session.close();
            }
        }
    }
}

query接口初步

Query session.createQuery(String hql)方法;

  • hibernate的session.createQuery()方法是使用HQL(hibernate的查询语句)语句查询对象的。
  • hql:是查询对象的,例如:"from User",其中from不区分大小写,而User是区分大小写,因为它是对象。是User类
  • 返回Query对象。
    -执行这条语句后,Hibernate会根据配置文件中所配置的数据库适配器自动生成相应数据库的SQL语句。如:
hibernate: select user0_.id as id0_, user0_.name as name0_, user0_.password as password0_, 
user0_.createTime as createTime0_, user0_.expireTime as expireTime0_ from User user0_

代码示例

public Iterator getSomeDept(String name) throws HibernateException {
    String queryString = "select u from Dept as u where u.name like :name";
    beginTransaction();
    Query query = session.createQuery(queryString);
    query.setString("name", "%" + name + "%");
    Iterator it = query.iterate();
    return it;
}
原文地址:https://www.cnblogs.com/wardensky/p/5761167.html