软件里各种模型应该怎样定义

网上搜索很多关于VO,PO,DTO等的概念但是还是不能完全理解
例如我有个客户表里面有个状态(假设有三个状态,状态A,状态B,状态C)
我用Spirng Boot,现在要写个根据条件搜索客户,但是客户字段里面有密码等敏感字段有不想返回
我的想法是Controller定义一个VO 来接收搜索条件(有些条件数据库对应的模型没有),但是这个VO 怎么传到mybatis层作为条件?,在dao层定义一个对象和VO一模一样吗?然后返回我是不是不能直接返回数据库的模型要自定义一个排除密码等字段的对象?不知道我的想法是否正确。还请多多指教。

搜索条件是一种约束、规则,也就是告诉数据库根据我们定义的规则进行搜索,因此DDD中规格Specification模式可用于创建搜索条件,当然规则模式本身也是一个值对象VO,你将这个VO作为mybatis的输入参数传入,然后再将这个VO转为SQL的Select中Where后面的条件字符串。
搜索查询结构也设计另外一个VO,这个VO的字段可以是是一个排除密码等字段的对象。

但是,关键点是:这两个VO在哪里创建就非常关键,都应该在聚合根或者业务实体或至少在业务层中创建,返回的VO可以有客户这个实体的一个方法使用克隆或者复制一个一个排除密码等字段的VO对象。

当然,以上前提条件是你搜索查询后是为了进一步写入,如果只是报表和数据分析的各种查询,则不必遵循DDD这些模式,根据需求任意组合即可