springboot连mysql,在mybatis的一个问题

一、背景
sql表 -> animal
id name type age
1 白胖 cat 12
2 泰哥 cat 10
3 大G dog 9
4 墨宝 sheep 6

二、问题
假如有个mapper方法,很明确的要从这张表里获取所有关于type=cat的数据,queryCatFromXXX();

那么sql语句那里应该带上条件 type=cat -> select * from animal where type="cat";

此时 cat这个内容是写死在sql好些(硬编码),还是在service或者controller一路传到mapper对应的sql好些?

我理解如果是方法比较明确是用来查询cat相关的数据,那直接写死在sql比较方便些吧?

请大神指教,谢谢

阅读 1.9k
4 个回答

推荐在 Mapper 中方法做成传 type 参数获取数据。
在 Service 层再去考虑要不要做成更灵活的方法,要不要做成灵活的方法取决于方法复杂度。
需要更灵活的方法:
比如题主业务场景只是单纯根据 一个类型参数来获取数据,则没有必要 硬编码 只获取 cat 数据。完全可以在 Service 层做一个根据类型枚举来获取数据方法。这样指定了参数可选值,也利于调用者清楚需要怎么做。
Controller 直接调用方法传 cat 值枚举即可。
不需要更灵活的方法:
比如现在有一个转移动物需求,需求是 年龄大于 3 岁且小于 10 岁的 cat 类型动物。这样就可以做一个获取转移动物数据方法。方法内部实现了条件筛查。而转移功能只需调用方法即可获取需要转移动物的数据。这样就很清晰了。

新手上路,请多包涵

新手可以硬编码,
等你后面要获取所有关于type=dog,或所有关于type=pig的数据的时候 就会开始考虑硬编码的不灵活.
建议后面改成:
<select 属性略>
select * from animal where type=#{type}
</select>

因为sql是可以复用的,不建议写死在sql里,后续如果想要type=dog,可以使用同一个sql,提高代码的可维护性

可以写一个公共方法getAnimalByType接收type参数,getAnimalByType内部再把type传进mapper中

mapper里面可以用 #{type}, 写一个getCat()方法, 在方法里面设置type.
以后想要dog的时候直接写个getDog()方法就好了.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏