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

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日

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?