hibernate的通用查询

 

package com.zking.util;

import org.hibernate.Session;
import org.hibernate.query.Query;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * hql的通用查询
 * sql Pagebean Class clz
 * 1.hql语句传过来拼接Countsql
 * 2.给命名参数赋值
 * 3.pageBean.settotal
 * 4.查询你所需要的结果集
 */
public class BaseDao {
    /**
     * 给命名参数赋值
     *
     * @param query
     * @param map
     */
    private void setParameters(Query query, Map<String, Object> map) {
        if (map == null || map.size() == 0) {
            return;
        }
        Object value;
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            value = entry.getValue();
            if (value instanceof Collection) {
                query.setParameterList(entry.getKey(), (Collection) value);
            } else if (value instanceof Object[]) {
                query.setParameterList(entry.getKey(), (Object[]) value);
            } else {
                query.setParameter(entry.getKey(), value);
            }
        }


    }


    /**
     * 拼装hql语句,Counthql
     * 用于查询符合记录的所有记录数
     *
     * @param hql
     * @return
     */
    public String getCountSql(String hql) {
        int index = hql.toUpperCase().indexOf("FROM");
        return "select count(*) " + hql.substring(index);
    }

    /**
     * 通用查询
     * @param session
     * @param hql
     * @param map 含有命名参数的集合
     * @param pageBean
     * @return
     */
    protected  List executeQuery(Session session, String hql, Map<String, Object> map, PageBean pageBean) {
        if (pageBean != null && pageBean.isPagination()) {
            String countsql=getCountSql(hql);
            Query countquery=session.createQuery(countsql);
            this.setParameters(countquery,map);
            pageBean.setTotal(countquery.getSingleResult().toString());
            Query query = session.createQuery(hql);
            this.setParameters(query,map);
              query.setFirstResult(pageBean.getStartIndex());
              query.setMaxResults(pageBean.getRows());
            return query.list();
        } else {
            Query query = session.createQuery(hql);
            this.setParameters(query, map);
            return query.list();
        }
    }

}

此处使用到了Pagebean 一个分页的类 在这里也把代码贴出来

package com.zking.util;


import javax.servlet.http.HttpServletRequest;
import java.util.Map;

public class PageBean {
    private int page = 1;// 页码

    private int rows = 10;// 页大小

    private int total = 0;// 总记录数

    private boolean pagination = true;// 是否分页
    private String url;
    private Map<String, String[]> parameterMap;//所有参数集合
    /**
     *
     * @Title: setPageBean
     * @Description: (初始化对象的方法)
     * @param request
     * @return void
     */
    public void   setPageBean(HttpServletRequest request) {
        this.page=request.getParameter("page")==null?1:Integer.parseInt(request.getParameter("page"));
        this.rows=request.getParameter("rows")==null?5:Integer.parseInt(request.getParameter("rows"));
        // 只有jsp页面上填写pagination=false才是不分页
        this.setPagination(!"false".equals(request.getParameter("pagination")));
        this.setParameterMap(request.getParameterMap());
        this.setUrl(request.getRequestURL().toString());
    }
    /**
     *
     * @Title: getMaxPages
     * @Description: (最大页码数)
     * @return
     * @return int
     */
    public int getMaxPages() {
        return this.total%this.rows==0?this.total/this.rows:this.total/this.rows+1;
    }
    /**
     *
     * @Title: getNextPages
     * @Description: (下一页页码)
     * @return
     * @return int
     */
    public int getNextPages() {
        return this.page<getMaxPages()?this.page+1:getMaxPages();
    }

    /**
     *
     * @Title: getUpPages
     * @Description: (上一页)
     * @return
     * @return int
     */
    public int getUpPages() {
        return this.page-1>0?this.page-1:1;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public Map<String, String[]> getParameterMap() {
        return parameterMap;
    }

    public void setParameterMap(Map<String, String[]> parameterMap) {
        this.parameterMap = parameterMap;
    }

    public PageBean() {
        super();
        // TODO Auto-generated constructor stub
    }

    public PageBean(int page, int rows, int total, boolean pagination) {
        super();
        this.page = page;
        this.rows = rows;
        this.total = total;
        this.pagination = pagination;
    }

    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }

    public int getRows() {
        return rows;
    }

    public void setRows(int rows) {
        this.rows = rows;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public void setTotal(String total) {
        this.total = Integer.parseInt(total);
    }

    public boolean isPagination() {
        return pagination;
    }

    public void setPagination(boolean pagination) {
        this.pagination = pagination;
    }

    /**
     * 获得起始记录的下标
     *
     * @return
     */
    public int getStartIndex() {
        return (this.page - 1) * this.rows;
    }

    @Override
    public String toString() {
        return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Hibernate和MyBatis都是Java中常用的ORM框架,但它们在设计和使用上有很大的差异。 Hibernate是一个全自动ORM框架,它使用对象关系映射技术将Java类映射到关系数据库中的表。Hibernate自动维护类和表之间的映射关系,可以自动生成SQL语句,开发人员无需手动编写。Hibernate非常适合处理复杂的关系型数据。 MyBatis则是一个半自动ORM框架,它使用XML或注解将SQL语句映射到Java方法中。MyBatis通过将SQL和Java代码分离,允许开发人员灵活控制SQL执行的细节,能够满足更加复杂的需求。MyBatis通常被认为是更加灵活和易于调试的ORM框架。 关于它们的优劣,这取决于具体的使用场景和开发人员的个人偏好。一般来说,如果您的应用程序需要处理复杂的关系型数据,Hibernate可能更适合您。如果您需要更细粒度地控制SQL执行细节或对SQL调优有特殊需求,MyBatis可能更适合您。 ### 回答2: Hibernate和MyBatis都是Java中的ORM(对象关系映射)框架,用于处理Java对象和数据库之间的数据映射关系。它们有各自的特点和适用场景。 Hibernate是一个全自动的ORM框架,它提供了大量的高级特性和功能,可以轻松处理复杂的映射关系,使开发者可以更快速地开发和维护数据库相关的代码。Hibernate具有良好的透明性,开发者不需要编写大量的SQL语句,只需对实体类进行简单配置和映射,就可以完成对数据库的操作。它也提供了一级、二级和查询缓存等缓存机制,可以提高系统的性能。 然而,Hibernate的配置和学习曲线相对较 steepend,对于初学者来说可能比较复杂。Hibernate对于简单查询的性能比MyBatis稍弱,因为它会将查询语句翻译为完全通用SQL,而不是针对特定的查询进行优化。 相比之下,MyBatis是一个轻量级的ORM框架,它倾向于将数据库操作的控制权交给开发者。MyBatis使用XML或注解配置数据库操作语句,使开发者可以灵活地编写SQL语句,更好地优化和控制查询性能。MyBatis较为适用于对数据库操作较为熟悉的开发者,可以根据需求自由地编写和优化SQL语句。 然而,MyBatis相对于Hibernate缺乏一些高级特性,如二级缓存和自动关联映射等。同时,MyBatis没有提供与数据库的直接交互,需要开发者手动编写和维护SQL语句。 综上所述,Hibernate适用于复杂的数据映射场景和初学者,可以快速开发和维护数据库相关的代码。而MyBatis适用于对SQL优化和灵活性要求较高的开发者,可以更好地控制查询性能和SQL语句。具体选择哪个框架取决于项目需求和开发者的技术水平。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值