封装Freemarker实现类似MyBatais
项目名称:DynamicHibernate
项目Gitee开源链接:DynamicHibernate
该项目由作者“汉源魂”在Gitee上开源,其核心价值在于提供一个非商业性的学习资源,旨在帮助广大开发者更加便捷地整合并优化Hibernate的使用体验。该项目通过一种基于FreeMarker
技术的创新方式,对Hibernate的传统查询方式进行扩展和封装,主要特点如下:
-
灵活查询:提供了不同于Hibernate原生查询方式的灵活查询机制,用户可以根据需求自定义和管理QL(SQL或HQL)语句。
-
语句管理:采用类似MyBatis的配置文件样式,利用Freemarker模板技术,支持包含if、for等标签的复杂逻辑编写,简化了SQL/HQL语句的组织与维护。
-
动态执行:项目会动态读取模板缓存文件中的SQL或HQL语句,并交由Hibernate引擎执行,从而避免了硬编码SQL/HQL带来的维护难题。
-
泛型应用:项目广泛运用了泛型技术,特别是在数据结果集的封装方面,确保了查询操作的通用性和可扩展性。
-
CRUD支持:实现了基础的创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)功能,降低了编码复杂度,使得代码更易于管理和维护。
总结来说,DynamicHibernate通过结合Freemarker模板引擎和Hibernate ORM框架,提升了数据库操作的灵活性和代码整洁度,有助于提升开发效率和降低后期维护成本。
QQ:1099532501
职业:JAVA DEVELOPER
ArrayList
普通字段筛选条件
String id = "06f8f0ef-0916-40c7-a354-2457e628293f";
conditions.add(new Condition("id",id, Op.EQ, OpType.AND));
关联对象字段筛选条件
String deptName = "研发部2";
conditions.add(new Condition("dept.name",deptName, Op.EQ, OpType.AND));
多字段组合条件 column ="xxx,xxx,xxx" 中间用英文逗号隔开即可。 意思为需要满足当前where 1=1 and (name='wstv' and sex='wstv')
//如果是 GROUP_AND_OR = where 1=1 or (name='wstv' or sex='wstv')
conditions.add(new Condition("name,sex","1", Op.EQ, OpType.GROUP_AND_AND));
List<Employee> list = employeeService.findList(conditions, null);
System.out.println(JSON.toJSONString(list));
order by 用法
conditions.add(new Condition("name","1", Op.EQ, OpType.AND));
LinkedHashMap<String, OrderType> orderby = new LinkedHashMap<String, OrderType>();
orderby.put("name",OrderType.ASC);
List<Employee> list = employeeService.findList(null, orderby);
System.out.println(JSON.toJSONString(list));
分页用法
conditions.add(new Condition("dept.name","研发部2", Op.EQ, OpType.AND));
LinkedHashMap<String, OrderType> orderby = new LinkedHashMap<String, OrderType>();
orderby.put("name",OrderType.ASC);
//pageIndex 第几页 pageSize = 每页要显示多少条
PageBean<Employee> page = employeeService.findPage(conditions, orderby, 1, 10);
System.out.println(JSON.toJSONString(page));
动态模板的用法 hql方式
String queryName = "emp.findById";
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("id","06f8f0ef-0916-40c7-a354-2457e628293f");
PageBean<Employee> pageBean = baseDao.queryByDynamicName(queryName, 1,10, Employee.class,null, parameters);
List<Employee> data = pageBean.getData();
if (data!=null && !data.isEmpty()){
System.out.println(JSON.toJSONString(data));
}
动态模板的用法 sql 方式
//动态模板语句返回的字段,需要和模板的sql字段顺序保持一致
String[] fields = new String[]{
"id",
"name"
};
String queryName = "emp.findByName";
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("id","06f8f0ef-0916-40c7-a354-2457e628293f");
PageBean<Map<String, Object>> pageBean = employeeService.findByNamedQuery(queryName, 1, 10, fields, parameters);
List<Map<String, Object>> data = pageBean.getData();
if (data!=null && !data.isEmpty()){
for(Map map : data){
System.out.println(map.get("id"));
}
}
<?xml version="1.0" encoding="utf-8"?>
<!--
<!DOCTYPE dynamic-statement SYSTEM "http://localhost:8080/dynamic-statement-1.0.dtd">
-->
<dynamic-statement>
<sql-query name="emp.findByName">
<![CDATA[
select
id as id,
name as name
from
oa.employee
where 1=1
<#if name != "">
and name like '${name}%'
</#if>
group by
id
]]>
</sql-query>
<sql-query name="emp.deleteEmp">
<![CDATA[
delete from oa.employee where id=${id}
]]>
</sql-query>
<hql-query name="emp.findById">
<![CDATA[
from com.hyaroma.domain.Employee where 1=1
<#if id !="" && id!="0">
and id='${id}'
</#if>
]]>
</hql-query>
</dynamic-statement>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!