版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
}