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比较方便些吧?
请大神指教,谢谢
回答:
推荐在 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()方法就好了.
以上是 springboot连mysql,在mybatis的一个问题 的全部内容, 来源链接: utcz.com/p/944529.html