资讯专栏INFORMATION COLUMN

mybatis使用的奇技淫巧

alexnevsky / 328人阅读

摘要:那么查询结果应该为张三服装茶具李四服装服装此处需要注意一点,的元素调用方法时,自动映射的属性名和列名应该保持一致,或者列表必须是数据库表中的字段名,而不是别名。

合并多行查询的结果 业务需求

商家可以根据商品类目分类,每位商家可以有多个商品类目,商品类目又跟运营类目有一种关联规则。此处暂且不说运营类目。根据业务,商家信息是一张表,商家与商品类目有一张关联表,商品类目有一张表,权且使用三张表。

其他不相干字段不展示

商家表(user)

uid username mobile
1 张三 12345678901
2 李四 12345600002

商品类目表(item_category)

icid name status parentid
1 服装 0 0
2 茶具 0 0
3 食品 0 0

商家与商品类目(user_item_cate_rel)

uid icid
1 1
1 2
2 1
2 3

如果我们需要在前端页面展示每个商家的商品类目,那么我们返回的结果中就需要每条商家数据中包含所属商品的类目。实现方式有很多种:1.一条sql语句可以实现,使用group_concat函数并根据uid分组2.先查询商家信息,再根据商家uid查询user_item_cate_rel和item_category表,再将结果在model中组合3.用mybatis的resultMap。此处只看1和3的实现方式。

展示需求:

# 商家ID 商家名 手机号码 商品类目 操作
1 1 张三 12345678901 服装,茶具 删除 修改
2 2 李四 12345600002 服装,食品 删除 修改
group_caoncat实现
SELECT u.*,group_concat(ic.name) categories FROM user 
LEFT JOIN user_item_cate_rel uicr
ON u.uid = uicr.uid
LEFT JOIN item_category ic
ON uicr.icid = ic.icid
WHERE ... # 查询条件
GROUP BY u.uid

大概就这样,可以把类目直接返回给前端,毫无疑问,这个实现是最快的。但是,当数据量大的时候,并且是查询列表的时候,全表扫描,就会出现慢查询。

巧妙使用Mybatis resultMap

创建User和Category POJO。User除了user表的字段作为属性外,外加一个private List categories属性。Category的字段分别为:icidname

mapper的xml中:

先定义一个id为user的resultMap:


    
        
        
    

实现select属性对应方法:此处select的id为上面id为user的resultMap中collection的select元素,参数#{uid}为column元素指定的字段。

获取指定条数的数据:mybatis可以根据传入的参数组装sql语句。

上面查询中,UserSearch是查询条件POJO,可以根据需要自定义过滤那些字段。其中有一个属性是icid,就是根据传入的一个商品类目查询商家信息。比如,要查询icid=1的商家,那么我们返回的数据不仅仅是icid=1的,还应该是icid=1商家的其他icid信息。

那么查询结果应该为:

[
    {
        "uid": 1,
        "username": "张三",
        "mobile": "12345678901",
        "categories": [
            {
                "icid": 1,
                "name": "服装"
            },
            {
                "icid": 2,
                "name": "茶具"
            }
        ]
    },
    {
        "uid": 2,
        "username": "李四",
        "mobile": "12345600002",
        "categories": [
            {
                "icid": 1,
                "name": "服装"
            },
            {
                "icid": 3,
                "name": "服装"
            }
        ]
    }
]

此处需要注意一点,resultMap的select元素调用getCategory方法时,自动映射的属性名和列名应该保持一致,或者列表必须是数据库表中的字段名,而不是别名。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66699.html

相关文章

  • 探讨奇技淫巧

    摘要:探讨奇技淫巧起源在工程实践中,我们常常会遇到一些奇技淫巧。所谓奇技淫巧,就是官方在设计或者实践中并未想象出的代码风格或者使用场景。那么究竟应不应在平时学习呢究竟应不应该在工程中使用呢,或者使用怎么样的奇技淫巧。 探讨奇技淫巧 起源 在工程实践中,我们常常会遇到一些奇技淫巧。所谓奇技淫巧,就是官方在设计或者实践中并未想象出的代码风格或者使用场景。其实也就是类似于 react 的 hoc,...

    soasme 评论0 收藏0
  • JavaScript 奇技淫巧

    摘要:这是一个长期更新的文章,欢迎大家补充的奇技淫巧个人建议一些奇技淫巧使得代码可读性较差,不建议使用两行写一个评分组件错误处理的正确姿势另外一种等价于论如何优雅的取整论如何优雅的交换数值用最短的代码实现数组去重 这是一个长期更新的文章,欢迎大家补充 JavaScript 的奇技淫巧 个人建议:一些奇技淫巧使得代码可读性较差,不建议使用 1. 两行写一个评分组件 let rate = 2 ★...

    luqiuwen 评论0 收藏0
  • 这不是“奇技淫巧” - Python中将字符串编译成表达式运行方法和使用场景

    摘要:的自带函数提供了一个非常有趣的特性,可以将给一个字符串当做一个表达式去执行。例如这种服务器自助运维的运维任务中的定义和判断 Python的自带函数 eval 提供了一个非常有趣的特性,可以将给一个字符串当做一个表达式去执行。先上一个例子: cond = compile(succ_rate

    ZweiZhao 评论0 收藏0
  • React 奇技淫巧 - defaultValue 和虚拟 dom diff 算法实现表单重置

    摘要:根据虚拟的算法,只要改变节点的类型就能促使在的时候重新创建虚拟。不过这个效果依赖于虚拟算法。如果使用时候出现什么副作用,鄙人概不负责。此技巧在写文章时正处于的版本 我们知道 React 的标准模式是单向数据流,而其表单项通常需要监听 onChange 事件,然后通过改变外部的 value 来回写表单项的 value,譬如如下 input class App extends React....

    paulquei 评论0 收藏0
  • 那些你可能不知道浏览器奇技淫巧

    摘要:比如经常逛知乎可以看到不少妹子自拍,比如这个问题打开控制台执行这个或者就可以将所有图片地址复制好了。另外关于知乎还有个隐藏技能,按可以打开快捷键帮助,不用鼠标也可以玩知乎了,微博也有这功能。平常工作少不了用浏览器,以下分享一些浏览器的使用技巧,更好的有助于你的工作。 ps: 以下技巧均在 Chrome 浏览器下测试的。 网页长截图 按 F12 弹出控制台,按 ctrl+shift+p 弹出...

    banana_pi 评论0 收藏0

发表评论

0条评论

alexnevsky

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<