Hibernate入门(6):CRUD 增删改查

本文介绍Hibernate框架的CRUD操作,包括创建、读取、更新和删除数据的方法。通过具体示例展示了如何利用Hibernate进行数据库交互,并提供了HQL查询、批量更新等技巧。

Hibernate CRUD 增删改查

 
Hibernate 是一种 ORM 架构,对于数据库进行的 CRUD 操作都是建立在实体对象上的,这个区别于面向数据表关系的 JDBC ;

以下示例中使用的 HibernateUtil 类是一个封装的 Session 管理类,详见: HibernateUtil



查询操作 Retrieve

Hibernate 支持查询的方式主要有3种:

HQL 是 Hibernate 的一种面向持久化实体的查询语言,区别于 SQL ;
Criteria 条件查询是一种完全面向对象的查询结构,使用类和方法的组织形式来取代 SQL 语言的组织形式,但是在 Hibernate5.x 版本中已经废弃了该种查询方式,仅保留作为向后兼容;
Hibernate 也支持原生的SQL查询,但是实际使用时,主要是用在项目的向后兼容,或者HQL无法解决过于复杂的关联查询的情况下,Hibernate官方是推荐使用 HQL 的方式进行查询;

一个简单的示例如下,详细内容参见以上的链接:
import org.hibernate.Session;
import org.hibernate.Transaction;
import java.util.List;

public class Test {
    public static void main (String[] args) throws Exception{
        //创建session,开启事务
        Session session = HibernateUitl.currentSession();
        Transaction tran = session.beginTransaction();

        String hqlStr = "select u from Users as u " +      //hql查询模板
                        "where u.icon = :iconType ";       
        List list  = session.createQuery(hqlStr)           //创建Query对象
                .setParameter("iconType","1")              //设置hql模板参数
                .list();                                   //获取结果
       
        for(Object element : list){   //遍历结果
            Users user = (Users)element;
            System.out.println(user.getName()+" "+user.getCreateDate());
        }
        
        //提交事务,关闭session
        tran.commit();
        HibernateUtil.closeSession();
    }
}


创建 Create

Hibernate 的数据插入直接通过将数据映射为实体实例进行的,如下示例:
public class Test {
    
    public static void main (String[] args) throws Exception{
        Session session = HibernateUitl.currentSession();
        Transaction tran = session.beginTransaction();
        
        //向user表增加一条记录,user表已经映射为User实体
        User user = new User();  //创建User实体并填充属性
        user.setName("assad");
        user.setAge(20);
        user.setDate(new Date());
  
        session.save(user);  //将User实体实例保存在Session
        
        tran.commit();     //提交事务
        HibernateUtil.closeSession();  //关闭Session
    }
}




更新 Update


类似于增加操作,hibernate的数据更新操作也是基于实体对象的,对获取到的实体对象的操作,会同步映射到数据中,这其中涉及到一些 hibernate 的缓存,可以参见  http://blog.youkuaiyun.com/al_assad/article/details/77900705
以下是一个简单的示例:
public class Test {
    
    public static void main (String[] args) throws Exception{
        
        Session session = HibernateUitl.currentSession();
        Transaction tran = session.beginTransaction();
        
        //user表已经映射为User实体,修改user表中age>18“的记录,修改它们的 point+10;
        List list = session.createQuery("select u from User u where u.age > :limit")
                            .setParamter("limit",18)
                            .list();
        
        for(Object obj : list){
            User user = (User)obj;                //遍历获取结果数据
            user.setPoint(user.getPoint()+10);   //修改实体属性
            session.save(user);                   //将实体保存至Session
        }
       
        tran.commit();     //提交事务
        HibernateUtil.closeSession();  //关闭Session
    }
}

对于批量更新,除了直接面这映射的实体类进行操作外,hibernate还支持基于 HQL 的 DML风格的批量修改:
 public static void main(String[] args){
        Session session = HibernateUtil.currentSession();
        Transaction tran = session.beginTransaction();
        
     //更新数据
        String hqlUpdate = "update User u set u.point = u.point + :increasePoint where u.age > :limit";    
        int updateCount = session.createQuery( hqlUpdate)
                .setParameter("increasePoint",10)
                .setParameter("limit",18)
                .executeUpdate();

        tran.commit();
        HibernateUtil.closeSession();
 }


删除 Delete

hibernate 的数据删除操作也是基于实体对象的,但完成数据库到实体的映射之后,如果在Session删除该实体,那么数据表中相应的记录也会被删除;
以下是一个简单的示例:
public class Test {
    
    public static void main (String[] args) throws Exception{
        
        Session session = HibernateUitl.currentSession();
        Transaction tran = session.beginTransaction();
        
        //user表已经映射为User实体,删除user表中age<18的记录
        List list = session.createQuery("select u from User u where u.age < :limit")
                            .setParamter("limit",18)
                            .list();
        
        for(Object obj : list){
            User user = (User)obj;                //遍历获取结果数据 
            session.delete(user);                //session 删除实体
        }
       
        tran.commit();     //提交事务
        HibernateUtil.closeSession();  //关闭Session
    }
}
对于批量删除,除了直接面对映射的实体类进行操作外,hibernate还支持基于 HQL 的 DML风格的批量删除:
 public static void main(String[] args){
        Session session = HibernateUtil.currentSession();
        Transaction tran = session.beginTransaction();

     //删除数据
        String hqlDelete = "delete from User u where u.age < :limitAge";
        int deletedCount = session.createQuery(hqlDelete)
                .setParameter("limitAge",18)
                .executeUpdate();

        tran.commit();
        HibernateUtil.closeSession();
 }



※ 对于大数据量的 批量操作(批量更新,批量插入)可能遇到内存溢出的情况,这一部分的详细情况和解决方式参见 : http://blog.youkuaiyun.com/al_assad/article/details/77900705






评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值