文档章节

BeetlSQL 实现 ORMapping查询

闲大赋
 闲大赋
发布于 2016/08/21 20:44
字数 1257
阅读 2092
收藏 0

我在 hibernate,mybatis,beetlsql 全面比较  中说明了BeetlSQL 在开发效率,维护性,跨数据库等各指标全面比hibernate 占优,但在ORM 方面不如Hibernate,这么多年来,hibernate已经成为Java的 ORMapping事实上的标准和方向,但我也在文章中指出,通过注解Annotation能指明java实体类的关系,但通过注解不能阐述所有的ORM查询,比如,我想查询跟订单关联的所有有效子订单,而不是所有子订单。 注解的表现力在ORMapping 中越来越不足,也使得大量ORMapping工具通过别的方式来实现ORM查询,让我们看看BeeetlSQL 新增的ORM查询是如何简单灵活的实现ORM查询的。

    如下一个常用场景,以用户为中心,一个用户关联到多个订单,一个用户属于一个部门,用户和角色是多对多的关系。这个场景涉及到了一对一,一对多,多对多。让我们看看BeetlSQL是如何轻松实现 ORM查询的。(不想看文字直接看代码的可以访问 https://code.csdn.net/xiandafu/beetlsql_orm_sample/tree/master)

 

BeetSQL 实现ORM查询是在sql查询语句里使用orm.single,orm.many 俩个函数,如下例子(位于src/main/resource/sql/user.md)

 

  1. queryUsers  
  2. ===  
  3.   
  4.     select #page("*")# from user where 1=1  
  5.     @if(!isEmpty()){  
  6.       and name=#name#  
  7.     @}  
  8.     @ orm.single({"departmentId":"id"},"Department");  
  9.     @ orm.many({"id":"userId"},"ProductOrder");  
  10.     @ orm.many({"id":"userId"},"user.selectRole","Role");  


queryUsers 是一个普通的sql查询,查询所有的用户,使用page函数来用于翻页查询,page函数可以转化成select count(1) 或者 select *,如果你不了解beetlsql 或者 支持的翻页查询函数page,可以查看beetlsql的文档,大概需要一早上就能看完。

这个普通的sql语句查询里,有使用了orm查询函数。一行一行解释如下:

orm.single({"departmentId":"id"},"Department"); 

single 说明user对象一对一关联到第二个参数指明的类Department。关联方式是将user对象的departmentId 属性 映射为Department的id属性。使用了 {“departmentId”:"id"},

beetlsql 看到此函数调用,将会在Department对象里发起一次单表查询,

第二个many也使用同样的方式查询ProudctOrder,关联方式是讲user对象的id属性映射到到ProductOrder 的userId属性

第三个many 是使用了一个sql查询user.selectRole 来查询用户关联的角色,输入的参数是将user的属性id映射为变量userId,传给user.selectRole查询语句

,通过查询user_role 和 role 表,语句如下

  1. selectRole  
  2. ===  
  3.   
  4.     select r.* from user_role ur, role r where ur.role_id=r.id and ur.user_id=#userId#  

orm函数可以放到sql语句的任何地方,建议放到sql语句开始部分或者结束部分,orm函数本身不影响sql语句,他只是记录了一下映射关系配置,然后在BeetSQL查询完毕后,发现如果有映射关系存在,再发起额外的ORM查询。

因为支持了ORM查询,User对象也需要改动,但不像hibernate那样,必须显示的增加Role,Department,ProudctOrder属性,BeetSQL不需要那么做,BeetSQL有个概念叫Tail属性,意思是在sql查询中,映射不到Pojo的字段的其他sql查询结果可以放到tail里,本质上是一个Map。实现tail方式有三种,User对象采用最简单的方式,User继承TailBean,代码如下:

  1. public class User   extends TailBean {  
  2.       
  3.     private Integer id ;  
  4.     private String name ;  
  5.     private Integer departmentId;  
  6.       
  7.     public User() {  
  8.     }  


因此,上面orm查询结果将放到tail属性里,其引用的名字默认是类首字母小写开头,即department,productOrder,role。 整个java代码如下

  1. UserDao userDao = sql.getMapper(UserDao.class);  
  2. //翻页查询  
  3. PageQuery query = new PageQuery();  
  4. // 查询user.md里面的user.queryUsers   
  5. userDao.queryUsers(query);  
  6. List<User> list = query.getList();  
  7. for(User user:list){  
  8.               
  9. //关联订单  
  10. List<ProductOrder> orders = (List<ProductOrder>)user.get("productOrder");  
  11. //关联部门  
  12. Department dept = (Department)user.get("department");  
  13. System.out.println("user:"+user.getName()+" department:"+dept.getName()+ " order total:"+orders.size());  
  14. //关联角色  
  15. List<Role> roles = (List<Role>)user.get("role");  
  16.     for(Role role:roles){  
  17.         System.out.println("====role:"+role.getName());  
  18.     }  
  19. }  

 

  如果你对Beetlsql 不熟悉,请参看官方文档,大概需要半天时间就能有初步掌握,比学其他ORM工具快多了

  BeetlSQL 的ORM查询就这点新鲜知识,实现起来非常简单且功能强大,而且,也很好理解,正是我们熟悉的的ORM查询思路。另外,他比基于注解的ORM查询灵活太多了而又没有任何副作用。是一种非常棒的ORM查询方式。尽管BeetlSQL 一直宣称自己是个DAO工具而非ORM框架,但通过orm 函数,也能轻易实现其他ORM框架的功能。

   如果你有兴趣了解BeetlSQl,可以查阅网站ibeetl.com,你可以直接访问 https://code.csdn.net/xiandafu/beetlsql_orm_sample/tree/master 下载代码尝试运行近一步了解BeetSQL.

© 著作权归作者所有

共有 人打赏支持
闲大赋

闲大赋

粉丝 1137
博文 90
码字总数 84738
作品 10
西城
架构师
加载中

评论(11)

g
git用户1059010

引用来自“夜雨寒枫”的评论

想请教一个问题,模糊查询如何实现,如上例中,建立关联关系后,查询role的name
模糊查询只要直接在条件上加就好,如id=#%+user_id+%#
夜雨寒枫
想请教一个问题,模糊查询如何实现,如上例中,建立关联关系后,查询role的name
闲大赋
闲大赋

引用来自“opera999”的评论

该方法未注册(FUNCTION_NOT_FOUND):orm.single 位于2行
这个是什么情况?
什么版本,代码样子,还有错误提示原文....
以和为贵_
以和为贵_
该方法未注册(FUNCTION_NOT_FOUND):orm.single 位于2行
这个是什么情况?
布布熊
布布熊
闲大赋
闲大赋

引用来自“代码天下”的评论

缺陷很多,还是mybatis更好
什么缺陷?
代码天下
代码天下
缺陷很多,还是mybatis更好
闲大赋
闲大赋
懒加载下个版本实现
紫电清霜
紫电清霜
另外有个问题,关联查询,支持懒加载吗
紫电清霜
紫电清霜
简直不能再帅
BeetlSQL 2.10.29 发布,Java Dao 工具

BeetlSQL 2.10.29 发布,更新如下: #IKPBA mapper 接口 支持default method,采用了liuzou1991 对mapper的优化,liuzhou也是提供BeetlSQL的Mapper功能作者之一 #IKPBB 代码生成优化,采用八...

闲大赋
06/27
0
0
BeetlSQL 2.10.34 发布,Java Dao 工具

BeetlSQL 2.10.34 发布,改进内容包括: #IMVHW execute查询添加pageQUery #IMVGL join函数 的bug ,原来不支持int[] Maven com.ibeetl beetlsql 2.10.34 Starter...

闲大赋
09/20
0
0
闲.大赋/dao-benchmark

dao-benchmark 项目介绍 dao 性能测试,包含jpa,myabtis,beetlsql等Dao工具,测试了插入,修改,查询,翻页查询等常用操作性能,以此来优化BeetlSQL性能 测试过程说明 采用H2内存数据库,如...

闲.大赋
05/22
0
0
Beetlsql扩展之自定义Mapper

BeetlSql 有一个BaseMapper,提供了很多内置的Dao操作,如增删改查等10几个方法,用户只需要些一个类继承此接口便能很快的完成一个Dao,比如 UserDao没有包含任何方法,但集成了BaseMapper,...

闲大赋
2017/09/26
0
0
BeetlSQL 2.10.33 发布,Java Dao 工具

本次发布对一个小功能做了性能优化 #IMMBL 使用Pagequery分页查询时,表里没有数据但是执行了分页查询 com.ibeetl beetlsql 2.10.33 BeetlSql 和 JPA,MyBatis 性能比较 BeetlSql 和 JPA,MyB...

闲大赋
09/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SAP不同的产品是如何支持用户创建自定义字段的

我们从SAP CRM,Cloud for Customer(简称C4C)和S/4HANA这三个产品分别来看看。 SAP CRM 我们使用所谓的Application Enhancement Tool(AET)来创建扩展字段。首先在Personalize里将Configu...

JerryWang_SAP
23分钟前
3
0
Vue-Element-Upload

记录一下文件上传封装Js 代码示例 封装:uploadFile.vue <template> <el-upload v-model="attachment" ref="upload" class="upload-demo" :action="uploadUrl" ......

华山猛男
30分钟前
2
0
AWVS破解及使用手册

1.安装 因为是windows软件,比较简单,此部分略: 破解插件下载: 链接: https://pan.baidu.com/s/1x9LK9F3KvqDgTvXDjoSZnQ 提取码: 7k4u 2.创建扫描目标 2-1.Targets->Add Target 2-2.对话框...

硅谷课堂
33分钟前
1
0
Centos 7 安装Zabbix 3.4

Zabbix 3.4 支持Centos 7。貌似不支持6.9. 更多详细内容请参考官方说明文档,详细的安装要求不贴出来了。 https://www.zabbix.com/documentation/3.4/zh/manual/installation/requirements 虚...

linjin200
38分钟前
1
0
阿里云数据库HybridDB for PostgreSQL使用教程

云数据库HybridDB for PostgreSQL(ApsaraDB HybridDB for PostgreSQL)是一种在线MPP大规模并行处理数据仓库服务。云数据库HybridDB for PostgreSQL基于Greenplum Database开源数据库项目,...

mcy0425
47分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部