Hibernate教程之四OID、HQL、SQL、QBC操作

Hibernate有四种操作方式,分别为OID、HQL、QBC、SQL。
OID:对象标识符,Hibernate来标记唯一的对象的标记,其实就是主键
可以实现的操作:增删改查
比如我们常用的
save、update、delete、get、load、saveOrUpdate等方法
特点:操作简单
缺点:无法实现复杂条件查询
示例代码:

//oid操作
    @Test
    public void test1(){
        User user=new User();
        user.setPass("11");
        user.setUserName("lx");
        System.out.println(session.save(user));//保存
        User user2=session.get(User.class, 3);//查询
        user2.setUserName("胡汉三");
        session.update(user2);//修改
        User user3=new User();
        user3.setId(4);
        session.delete(user3);//删除
    }

HQL:Hibernate Query Language面向对象查询
是Hibernate特有的一种查询方式
其实就是将sql转换为对象
之前操作的是表,现在操作的是类
之前操作的是字段,现在操作的是属性
之前操作的一条数据,现在操作的是对象
比如:from User
这个User就是类名而不是表明
操作HQL的对象是Query
HQL可以实现:修改、删除、查询、复杂条件、聚合函数调用等
示例代码:

//HQL操作
    @Test
    public void test2(){
        //1、查询实体
        String hql1="from User";
        //String hql1="select new User(id,username,pass) from User";//查询实体,完整写法
        Query<User> query=session.createQuery(hql1,User.class);//获取操作HQL的对象
        List<User> list=query.getResultList();//获取多条查询的结果
        User user=query.uniqueResult();//获取单一结果,要求结果必须为一个,否则报异常
        //2、按条件进行查询
        String hql2="from User where id=?";//索引占位符
        //String hql2="from User where id=:id";//命名占位符
        Query<User> query2=session.createQuery(hql2);
        query2.setParameter(0, 1);//位索引占位符,赋值,从0开始
        //query2.setParameter("id", 1);//命名占位符,赋值
        User user2=query2.getSingleResult();//获取唯一对象
        //3、使用函数
        String hql3="select COUNT(id) from User";
        Query<Long> query3=session.createQuery(hql3);
        long count=query3.getSingleResult();
        //4、使用分页
        String hql4="from User";
        Query<User> query4=session.createQuery(hql4,User.class);
        query4.setFirstResult(0);//设置起始行索引:(当前页数-1)*每页显示的数量
        query4.setMaxResults(10);//每页显示的数量
        List<User> list4=query4.getResultList();
        //5、修改
        String hql5="update User set pass=:pass where id=:id";
        Query query5=session.createQuery(hql5);
        query5.setParameter("pass","123456");
        query5.setParameter("id",3);
        query5.executeUpdate();
        //6、删除
        String hql6="delete from User where id=?";
        Query query6=session.createQuery(hql6);
        query6.setParameter(0, 3);
        query6.executeUpdate(); 
    }

当然HQL也指出多表联合查询,但是不需要使用on,只需写出inner join、left join、right join等

QBC:Query By Criteria
是简化的HQL的查询操作
目的:就是可以不用写各种查询的关键字就可以实现复杂条件的查询
但是Hibernate5.2.1x中过时了
示例代码:

//QBC查询操作
    @Test
    public void test3(){
        Session session=HibUtils.getCurrentSession();
        Transaction tran=session.beginTransaction();
        //创建操作QBC的对象
        Criteria criteria=session.createCriteria(User.class);
        //添加各种条件
        criteria.add(Restrictions.in("id", new Integer[]{1,2,3}));//in
        criteria.add(Restrictions.and(Restrictions.ilike("pass", "%1%")));//like模糊查询
        //获取查询的所有结果
        List<User> list=criteria.list();

        tran.commit();
    }

QBC现在过时了,就是之前需要自己写查询条件的各种关键字,新视野QBC就不用了,因为使用方法代替了。

SQL:Hibernate支持原生的SQL操作
可以实现增删改查
就是自己写SQL语句
示例代码:

// SQL查询操作
    @Test
    public void test4() {
        Session session = HibUtils.getCurrentSession();
        Transaction tran = session.beginTransaction();
        String sql="select * from tb_user";//自己写SQL语句
        //之前的写法,现在过时
        //NativeQuery<User> query=session.createSQLQuery(sql);
        //现在的写法
        NativeQuery<User> query=session.createNativeQuery(sql);
        List<User> list=query.getResultList();
        tran.commit();
    }

这个是万能写法,因为自己写SQL语句。
以上就是Hibernate支持的几种操作方式。
现在贴出完整的单元测试代码:


public class QueryTest {

    private Session session;
    private Transaction tran;

    @Before
    public void pre() {
        session = HibUtils.getCurrentSession();
        tran = session.beginTransaction();
    }

    // oid操作
    @Test
    public void test1() {
        User user = new User();
        user.setPass("11");
        user.setUserName("lx");
        System.out.println(session.save(user));// 保存
        User user2 = session.get(User.class, 3);// 查询
        user2.setUserName("胡汉三");
        session.update(user2);// 修改
        User user3 = new User();
        user3.setId(4);
        session.delete(user3);// 删除

    }

    // HQL操作
    @Test
    public void test2() {
        // 1、查询实体
        String hql1 = "from User";
        // String hql1="select new User(id,username,pass) from User";//查询实体,完整写法
        Query<User> query = session.createQuery(hql1, User.class);// 获取操作HQL的对象
        List<User> list = query.getResultList();// 获取多条查询的结果
        User user = query.uniqueResult();// 获取单一结果,要求结果必须为一个,否则报异常
        // 2、按条件进行查询
        String hql2 = "from User where id=?";// 索引占位符
        // String hql2="from User where id=:id";//命名占位符
        Query<User> query2 = session.createQuery(hql2);
        query2.setParameter(0, 1);// 位索引占位符,赋值,从0开始
        // query2.setParameter("id", 1);//命名占位符,赋值
        User user2 = query2.getSingleResult();// 获取唯一对象
        // 3、使用函数
        String hql3 = "select COUNT(id) from User";
        Query<Long> query3 = session.createQuery(hql3);
        long count = query3.getSingleResult();
        // 4、使用分页
        String hql4 = "from User";
        Query<User> query4 = session.createQuery(hql4, User.class);
        query4.setFirstResult(0);// 设置起始行索引:(当前页数-1)*每页显示的数量
        query4.setMaxResults(10);// 每页显示的数量
        List<User> list4 = query4.getResultList();
        // 5、修改
        String hql5 = "update User set pass=:pass where id=:id";
        Query query5 = session.createQuery(hql5);
        query5.setParameter("pass", "123456");
        query5.setParameter("id", 3);
        query5.executeUpdate();
        // 6、删除
        String hql6 = "delete from User where id=?";
        Query query6 = session.createQuery(hql6);
        query6.setParameter(0, 3);
        query6.executeUpdate();
    }

    // QBC查询操作
    @Test
    public void test3() {
        Session session = HibUtils.getCurrentSession();
        Transaction tran = session.beginTransaction();
        // 创建操作QBC的对象
        Criteria criteria = session.createCriteria(User.class);
        // 添加各种条件
        criteria.add(Restrictions.in("id", new Integer[] { 1, 2, 3 }));// in
        criteria.add(Restrictions.and(Restrictions.ilike("pass", "%1%")));// like模糊查询
        // 获取查询的所有结果
        List<User> list = criteria.list();

        tran.commit();
    }

    // SQL查询操作
    @Test
    public void test4() {
        Session session = HibUtils.getCurrentSession();
        Transaction tran = session.beginTransaction();
        String sql="select * from tb_user";//自己写SQL语句
        //之前的写法,现在过时
        //NativeQuery<User> query=session.createSQLQuery(sql);
        //现在的写法
        NativeQuery<User> query=session.createNativeQuery(sql);
        List<User> list=query.getResultList();
        tran.commit();
    }

    @After
    public void end() {
        tran.commit();
    }
}

HibUtils自己封装的工具类用于加载数据库配置信息并创建Session对象,代码如下:


public class HibUtils {

    private static SessionFactory factory;
    static {
        factory = new Configuration().configure().buildSessionFactory();
    }

    //安全,效率高
    public static Session getCurrentSession() {
        return factory.getCurrentSession();
    }
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值