重点技术-20180707-仿MyBatis实现Hibernate版本的动态SQL

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/namelessfighter/article/details/80955371

背景:MyBaits有动态SQL功能,可以根据输入参数进行条件判断动态拼接SQL,实现动态SQL效果。Hibernate虽然有HQL,但是HQL本身设置参数后,参数就必须要传,不然会报错。该功能大量用于报表查询功能、列表页面数据接口,可以动态决定拼接SQL语句。

为此,设计一个简要的动态SQL模型。


----------------使用样例----------------

List<Member> memberList = memberDAO.findByPage(memberDAO.getQuery_MemberList(model),1,20);

----------------对象模型定义----------------

public class Member
{
    private Integer memberId;//会员ID
    private Integer theName;//会员名
    private Integer theState;//状态

    public static String GetHQL()
    {
        StringBuffer sqlStr = new StringBuffer();

        sqlStr.append("from Member where 1=1");
        sqlStr.append("<#if adminId??> and adminId=:adminId</#if>");
        sqlStr.append("<#if theName??> and theName=:theName</#if>");
        sqlStr.append("<#if theState??> and theState=:theState</#if>");


        return sqlStr.toString();
    }
}

----------------MemberDAO定义----------------
public Query getQuery_MemberList(AdminForm model) throws Exception
{
    return getQuery(Member.GetHQL(), model);
}

----------------BaseDAO定义----------------

private static Configuration cfg;

private static StringTemplateLoader stringLoader;
static
{
    stringLoader = new StringTemplateLoader();

    cfg = new Configuration(Configuration.getVersion());
    cfg.setTemplateLoader(stringLoader);
}
public String getHql(String sqlStr, BaseForm model) throws Exception
{
    String nowTimeStampStr = System.currentTimeMillis()+"";
    stringLoader.putTemplate(nowTimeStampStr, sqlStr);
    Template template = cfg.getTemplate(nowTimeStampStr, "utf-8");

    StringWriter stringWriter = new StringWriter();
    template.process(model, stringWriter);

    return stringWriter.toString();
}
public Query getQuery(String sqlStr, BaseForm model) throws Exception
{
    return getCurrentSession().createQuery(getHql(sqlStr, model)).setProperties(model);

}

public List findByPage(Query query, Integer pageNumber, Integer countPerPage)
{
    if (pageNumber != null && pageNumber > 0)
    {
        query.setFirstResult(countPerPage * pageNumber - countPerPage);
        query.setMaxResults(countPerPage);
    }

    return query.list();
}

猜你喜欢

转载自blog.csdn.net/namelessfighter/article/details/80955371