张二狗和苗翠花 2024-01-16 16:49 采纳率: 100%
浏览 14
已结题

mybatis是否会对Bean的封装性进行破坏?

今天碰到一个问题,我有一个java Bean在业务中需要限制除了第一次初始化,之后不允许修改其值,正常的只需要将这个属性的访问权限设置为private,然后不写set方法,只在构造器中初始化,也就是只有在创建这个对象时才会对这个属性进行赋值,就可以将这个属性进行封装。
后面再引入mybatis,它的原理是先用bean的无参构造器进行对象创建,然后调用属性的set方法进行映射赋值,那么我这个类就没法做封装了,这里是不是可以说mybatis强制性破坏了这个类的封装。

解决办法:
1.建两个类,一个仅用于mybatis映射返回对象,然后再手动包装到具备封装性的类,相当于做一个类包装,Bean.class convert BeanWarpper.class
2.mybatis能不能通过有参构造器进行映射,查询的列名按照构造器的参数名进行映射?

  • 写回答

2条回答 默认 最新

  • 叫兽-郭老师 新星创作者: Java技术领域 2024-01-16 16:57
    关注

    对于你的问题,有两个可行的解决方案:

    使用有参构造器映射:从 MyBatis 3.4.2 版本开始,MyBatis 支持通过构造器注入的方式进行映射。这样你就可以在构造函数中对字段进行初始化,而不需要提供 setter 方法。你可以在 sql 映射文件中使用

    创建两个类:正如你自己提到的,可以创建两个类,一个类只包含 getter 和 setter 方法,用于 MyBatis 的数据映射;另外一个类用于业务逻辑处理,只暴露需要的 getter 方法,规避了封装性破坏的问题。

    以上两种方法都是可行的,可以根据你的实际业务需求进行选择。如果你对于封装性有严格要求,并且愿意为此付出额外的开发成本,那么第二种方案无疑是更好的选择。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月24日
  • 已采纳回答 1月16日
  • 创建了问题 1月16日