但行好事
莫论前程❤

Hibernate(六)–HQL实现CRUD详解

在hibernate中的增删改查的实现。hibernate是OR框架,也就是对象关系框架,有了 hibernate我们就不用再去写SQL语言,我们只需要操纵对象去进行增删改查。这里今天写的就是在如何应用hibernate实现增删改查。

增加save

​  第一个我们首先看看增,增在SQL里面就是insert,也就是插入,在hibernate中,我们只需要,操纵一个对象进行save,然后再commit事务,就能实现插入功能,下面给大家具体看看代码,持久类我就不再写了,里面也就是与数据库中的字段要一一对应的东西,要有set,get方法,我直接就写的怎么调用save方法。

import org.hibernate.HibernateException; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.hibernate.cfg.Configuration; 
public class UserTest { 
    public static void main(String args[]){ 
        Configuration cfg = new Configuration().configure(); //获取hibernate的配置信息 
        SessionFactory sf = cfg.buildSessionFactory(); //根据config建立sessionFactory 
        Session ses = sf.openSession(); //factory用于建立session,开启Session,相当于开启JDBC的Connection 
        Transaction ts = ses.beginTransaction(); //创建事务的对象ts 
        User user = new User(); //持久化对象 
        user.setName("kobe"); 
        user.setTel("111111111"); 
        try { 
            ses.save(user); 
            ts.commit(); 
        }catch (HibernateException he){ 
            he.printStackTrace(); 
            ts.rollback(); 
        }finally{ 
            ses.close(); 
            sf.close(); 
            System.out.println("插入成功"); 
        } 
    } 
}

删除delete

第二个我们看看删,删在SQL里面是delete,也就是删除,同样在hibernate中,我们也是只需要调用一个对象,调用delete方法,就能进行删除。

public class DeleteTest {
    public static void main(String args[]) {
        Configuration cfg = new Configuration().configure();
        SessionFactory sf = cfg.buildSessionFactory();
        Session ses = sf.openSession();
        Transaction ts = ses.beginTransaction();
        User user = new User();
        user.setId("8a8308891e9c3ef3011e9c3ef4aa0001");
        try {
            ses.delete(user);
            ts.commit();
        } catch (HibernateException he) {
            he.printStackTrace();
            ts.rollback();
        } finally {
            ses.close();
            sf.close();
            System.out.println("删除成功");
        }
    }
}

修改Update

具体中间的含义参照save方法,这里我们要注意一点,我们调用删除的时候,他删除的条件,也就是where后面的条件一定是我们xml中配置id,通过这个来进行查找删除,这里尤其值得注意,也就是,我这里调用的user.setId(” “);这句话,他是通过””中的内容进行删除的。

第三个我们看看改,改在SQL中update,在hibernate中,我们同样只需要操作一个对象进行更改信息。

public class UpdateTest {
    public static void main(String args[]) {
        Configuration cfg = new Configuration().configure();
        SessionFactory sf = cfg.buildSessionFactory();
        Session ses = sf.openSession();
        Transaction ts = ses.beginTransaction();
        User user = new User();
        user.setId("8a8308891e9c3ef3011e9c3ef4aa0001");
        user.setName("kobe24");
        try {
            ses.update(user);
            ts.commit();
        } catch (HibernateException he) {
            he.printStackTrace();
            ts.rollback();
        } finally {
            ses.close();
            sf.close();
            System.out.println("更改成功");
        }
    }
} 

但是这里我们有需要注意的地方了,如果有的朋友用过这个update就会发现,调用这个方法的时候他更新的不只是你想更新的数据,你不想更新的数据,他也会随着改变,如果你没有给他set值,他就会出现null,或者表格中什么都没有,这里我们就需要用另一种方法了,去更新你想更新的数据,而你不想改变的数据还会保持原来的状态,这里我们就需要调用一个方法。

Session ses = sf.openSession(); 
Transaction ts = ses.beginTransaction(); 
User user = (User)ses.get(User.class,"8a8308891e9c3ef3011e9c3ef4aa0001"); 
user.setName("kobe24"); 
try { 
    ses.update(user); 
    ts.commit();

这样我们就会发现,我们只更新了我们想要更新的数据。ses不光光有这一个get方法,相同功能他还有一个load方法,两个方法功能是相同的但是有什么区别呢,区别就是用load方法时候他是从缓存中查找,而我们调用get方法的时候是从数据库中查找,不过get方法他也是先从缓存中查找,如果没有在去数据库中查找。 

第四个我们看看查,查在SQL中是select,在hibernate中我们查询的时候有多种方法,这里我就写一种hibernate比较提倡的方法,就是HQL。用这个方法时候我们尤其需要注意的是他其中的from跟的不是表名,而是类名。 

查询select

特点:

  1. 与SQL相似,SQL中的语法基本上都可以直接使用。
  2. SQL查询的是表和表中的列;HQL查询的是对象与对象中的属性。
  3. HQL的关键字不区分大小写,类名与属性名是区分大小写的。
  4. SELECT可以省略.
// 1,简单的查询,Employee为实体名而不是数据库中的表名(面向对象特性)
hql = "FROM Employee";
hql = "FROM Employee AS e"; // 使用别名
hql = "FROM Employee e"; // 使用别名,as关键字可省略

// 2,带上过滤条件的(可以使用别名):Where
hql = "FROM Employee WHERE id<10";
hql = "FROM Employee e WHERE e.id<10";
hql = "FROM Employee e WHERE e.id<10 AND e.id>5";

// 3,带上排序条件的:Order By
hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name";
hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name DESC";
hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name DESC, id ASC";

// 4,指定select子句(不可以使用select *)
hql = "SELECT e FROM Employee e"; // 相当于"FROM Employee e"
hql = "SELECT e.name FROM Employee e"; // 只查询一个列,返回的集合的元素类型就是这个属性的类型
hql = "SELECT e.id,e.name FROM Employee e"; // 查询多个列,返回的集合的元素类型是Object数组
hql = "SELECT new Employee(e.id,e.name) FROM Employee e"; // 可以使用new语法,指定把查询出的部分属性封装到对象中

// 5,执行查询,获得结果(list、uniqueResult、分页 )
Query query = session.createQuery("FROM Employee e WHERE id<3");
query.setFirstResult(0);
query.setMaxResults(10); // 等同于 limit 0,10
//两种查询结果list、uniqueResult
// List list = query.list(); // 查询的结果是一个List集合
// Employee employee = (Employee) query.uniqueResult();// 查询的结果是唯一的一个结果,当结果有多个,就会抛异常

// 6,方法链
List list = session.createQuery(
        "FROM Employee e")
        .setFirstResult(0)
        .setMaxResults(10)
        .list();

// 7,聚集函数:count(), max(), min(), avg(), sum()
hql = "SELECT COUNT(*) FROM Employee"; // 返回的结果是Long型的
hql = "SELECT min(id) FROM Employee"; // 返回的结果是id属性的类型

//8,分组: Group By ... Having
hql = "SELECT e.name,COUNT(e.id) FROM Employee e GROUP BY e.name";
hql = "SELECT e.name,COUNT(e.id) FROM Employee e GROUP BY e.name HAVING count(e.id)>1";
hql = "SELECT e.name,COUNT(e.id) FROM Employee e WHERE id<9 GROUP BY e.name HAVING count(e.id)>1";
hql = "SELECT e.name,COUNT(e.id) " + 
     "FROM Employee e " + 
     "WHERE id<9 " + 
     "GROUP BY e.name " + 
     "HAVING count(e.id)>1 " + 
     "ORDER BY count(e.id) ASC";
hql = "SELECT e.name,COUNT(e.id) AS c " + 
     "FROM Employee e " + 
     "WHERE id<9 " + 
     "GROUP BY e.name " + 
     "HAVING count(e.id)>1 " + // 在having子句中不能使用列别名
     "ORDER BY c ASC"; // 在orderby子句中可以使用列别名

// 9,连接查询 / HQL是面向对象的查询
 //>> 内连接(inner关键字可以省略)
 hql = "SELECT e.id,e.name,d.name FROM Employee e JOIN e.department d";
 hql = "SELECT e.id,e.name,d.name FROM Employee e INNER JOIN e.department d";
 //>> 左外连接(outer关键字可以省略)
 hql = "SELECT e.id,e.name,d.name FROM Employee e LEFT OUTER JOIN e.department d";
 //>> 右外连接(outer关键字可以省略)
 hql = "SELECT e.id,e.name,d.name FROM Employee e RIGHT JOIN e.department d";
 //可以使用更方便的方法
 hql = "SELECT e.id,e.name,e.department.name FROM Employee e";

// 10,查询时使用参数
// >> 方式一:使用'?'占位
 hql = "FROM Employee e WHERE id BETWEEN ? AND ?";
 List list2 = session.createQuery(hql)
     .setParameter(0, 5)// 设置参数,第1个参数的索引为0。
     .setParameter(1, 15)
     .list();

// >> 方式二:使用变量名
 hql = "FROM Employee e WHERE id BETWEEN :idMin AND :idMax";
 List list3 = session.createQuery(hql)
     .setParameter("idMax", 15)
     .setParameter("idMin", 5)
     .list();

// 当参数是集合时,一定要使用setParameterList()设置参数值
 hql = "FROM Employee e WHERE id IN (:ids)";
 List list4 = session.createQuery(hql)
     .setParameterList("ids", new Object[] { 1, 2, 3, 5, 8, 100 })
     .list();

// 11,update与delete,不会通知Session缓存
// >> Update
int result = session.createQuery(
        "UPDATE Employee e SET e.name=? WHERE id>15")
        .setParameter(0, "无名氏")
        .executeUpdate(); // 返回int型的结果,表示影响了多少行。
// >> Delete
int result1 = session.createQuery(
        "DELETE FROM Employee e WHERE id>15")
        .executeUpdate(); // 返回int型的结果,表示影响了多少行。
赞(0) 打赏
未经允许不得转载:刘鹏博客 » Hibernate(六)–HQL实现CRUD详解
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏