zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    Netty源码分析第6章(解码器)---->第3节: 行解码器
    Netty源码分析第6章(解码器)---->第2节: 固定长度解码器
    Netty源码分析第6章(解码器)---->第1节: ByteToMessageDecoder
    Netty源码分析第5章(ByteBuf)---->第10节: SocketChannel读取数据过程
    Netty源码分析第5章(ByteBuf)---->第9节: ByteBuf回收
    Netty源码分析第5章(ByteBuf)---->第8节: subPage级别的内存分配
    Netty源码分析第5章(ByteBuf)---->第7节: page级别的内存分配
    【转】关于Tomcat下项目线程启动两次的问题
    设计模式【单例模式】
    【SQL学习笔记】一、select语句
  • 原文地址:https://www.cnblogs.com/wardensky/p/5761167.html
Copyright © 2011-2022 走看看