十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本篇内容主要讲解“分析mybatis中@Mapper注解的componentModel属性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析mybatis中@Mapper注解的componentModel属性”吧!
成都创新互联公司专注于网站建设|网页维护|优化|托管以及网络推广,积累了大量的网站设计与制作经验,为许多企业提供了网站定制设计服务,案例作品覆盖自拌料搅拌车等行业。能根据企业所处的行业与销售的产品,结合品牌形象的塑造,量身策划品质网站。
一、准备工作
1.1、了解@Mapper 注解
从 mybatis3.4.0 开始加入的 @Mapper 注解,目的就是为了不再写mapper映射文件。
我们只需要在 dao 层定义的接口上使用注解就可以实现sql语句的编写,例如:
@Select("select * from user where name = #{name}") public User find(String name);
如上就是一个简单的使用,虽然简单,但也确实体现出了这个注解的优越性,至少少写了一个xml文件。
所以我就只是想说下 @Mapper 注解的 componentModel 属性,componentModel 属性用于指定自动生成的接口实现类的组件类型,这个属性支持四个值:
default: 这是默认的情况,mapstruct 不使用任何组件类型, 可以通过Mappers.getMapper(Class)方式获取自动生成的实例对象。
cdi: the generated mapper is an application-scoped CDI bean and can be retrieved via @Inject
spring: 生成的实现类上面会自动添加一个@Component注解,可以通过Spring的 @Autowired方式进行注入
jsr330: 生成的实现类上会添加@javax.inject.Named 和@Singleton注解,可以通过 @Inject注解获取
1.2、依赖包
首先需要把依赖包导入,主要由两个包组成:
org.mapstruct:mapstruct:包含了一些必要的注解,例如@Mapping。r若我们使用的JDK版本高于1.8,当我们在pom里面导入依赖时候,建议使用坐标是:org.mapstruct:mapstruct-jdk8,这可以帮助我们利用一些Java8的新特性。
org.mapstruct:mapstruct-processor:注解处理器,根据注解自动生成mapper的实现。
org.mapstruct mapstruct-jdk8 1.2.0.Final org.mapstruct mapstruct-processor 1.2.0.Final
好了,准备工作做完了,接下来我们就看看巧媳妇儿巧在什么地方吧。
二、先简单玩一把
2.1、定义实体类以及被映射类
// 实体类 @Data @NoArgsConstructor @AllArgsConstructor @Builder public class User { private Integer id; private String name; private String createTime; private LocalDateTime updateTime; } // 被映射类VO1:和实体类一模一样 @Data @NoArgsConstructor @AllArgsConstructor @Builder public class UserVO1 { private Integer id; private String name; private String createTime; private LocalDateTime updateTime; } // 被映射类VO1:比实体类少一个字段 @Data @NoArgsConstructor @AllArgsConstructor @Builder public class UserVO2 { private Integer id; private String name; private String createTime; }
2.2、定义接口:
当实体类和被映射对象属性相同或者被映射对象属性值少几个时:
@Mapper(componentModel = "spring") public interface UserCovertBasic { UserCovertBasic INSTANCE = Mappers.getMapper(UserCovertBasic.class); /** * 字段数量类型数量相同,利用工具BeanUtils也可以实现类似效果 * @param source * @return */ UserVO1 toConvertVO1(User source); User fromConvertEntity1(UserVO1 userVO1); /** * 字段数量类型相同,数量少:仅能让多的转换成少的,故没有fromConvertEntity2 * @param source * @return */ UserVO2 toConvertVO2(User source); }
从上面的代码可以看出:接口中声明了一个成员变量INSTANCE,母的是让客户端可以访问 Mapper 接口的实现。
2.3、使用
@RestController public class TestController { @GetMapping("convert") public Object convertEntity() { User user = User.builder() .id(1) .name("张三") .createTime("2020-04-01 11:05:07") .updateTime(LocalDateTime.now()) .build(); List