谈谈我对mybatis和jpa的理解

其实要承认,一个东西用久了都会有习惯心理。mybatis和jpa,两个持久层框架。从底层到用法都不同。但是实现的功能是一样的。所以说一直以来颇有争议。常年混迹于各大qq技术交流群。见过jpa的死忠粉也见过mybatis的铁杆。作为一个不到两年工作经验的小菜鸟来说,你让我分析源码,讲什么底层实现我是讲不出来的。只能作为一个使用者,来谈谈自己对这两个框架的理解。

谈谈我对mybatis和jpa的理解

 

首先,都知道jpa的前身是著名的ssh中的h——>Hibernate。我到现在还记得学习Hibernate时对它产生的讲解:一个希望不用写sql语句来操作数据库的懒到愿意为此开发一个框架的创始人,其实也够奇葩到值得记住了。而现在的jpa,我觉得主旨也确实在贯彻这个理念。你要承认,jpa的对于单表的简单查询确实简单方便又实用。但是同时,对于多表关联和复杂查询,起码目前为止,要么把复杂查询拆成多个简单查询,要么宁可直接一个nativeQuery = true来原生查询。如果这两点都没能满足你业务的需求,我不敢下定结论说你的设计有问题,但是如此复杂的业务逻辑,身为小白的我实在无法给你建议了。

然后说到mybatis,原谅我入行时间比较晚。从我开始学习java他就已经出现了。听说过他前身好像是ibatis,但是具体就不太了解了。使用上来讲,在那个boot还没有发布的年代,mybatis也曾经是每个程序员必备的基本技能。刚接触的时候mapper映射在我眼中简直是神奇。也算是用了半年多,多少有一定的了解。在这里基本的使用就不多介绍了,反正我一直所应用的也基本都是crud。没到多高深的地步。只能说对于多表查询确实是比较支持。尤其是在业务逻辑多是多表关联的情况下,mybatis绝对比jpa要更加适合。无论是以后的维护还是业务的变更都方便不少。

可能我这么说大家还是不太理解什么时候用jpa什么时候用mybatis。我举个例子:现在业务上A,B,C,D四个表。如果你每个表都会在业务中用到,都需要有单独的增删改查,虽然有一定的关联关系,但是这种情况用jpa就比较合适。ABCD四个java实体不说,每个实体要对应一个repository。然后再repository层进行crud的编写。但是如果业务上A,B,C,D四个表。这四个是关联关系,你几乎不会单独对A,B,C进行操作,而且展现出来的也是D,那么这个时候jpa的使用就会很麻烦,因为你还是要四个实体四个repository。在一个接口中四个repository挨个调用一次。虽然也能完成业务逻辑,但是复杂又麻烦。还要考虑原子性什么的。所以这个时候用mybatis比较合适了。

谈谈我对mybatis和jpa的理解

 

其实说到这大概对于什么样的业务应该采用哪个在思维上应该有个简单的区分了。不过很多时候很多项目不是能一下子分辨出来属于哪种的。所以还是需要具体判断的。虽然工作才一年多,但是外包让我经历了多个项目的经验告诉我,千万别相信那些所谓的“某某大佬”随便给你的建议。(我是指那些连具体业务都不知道就给你建议jpa好还是mybatis好的那种。如果真的是大佬而且愿意为你的项目深入分析并且给出答案,那还是值得参照的)因为以前有一次在老板给了我一个小项目让我独立完成的时候我选择了咨询群里的大佬。记得很清楚当时大佬给的意见就是mybatis。还说了mybatis的好多优点。然后我就自然而然的用了。结果嘛,大家能想到我一个人能完成的项目会有多小,业务多简洁。虽然用mybatis也做完了。但是现在想想,要是换成jpa肯定会更加快速方便的开发。我讲这段经历绝对没有别的意思,只是想告诉大家业务怎么样还是自己最清楚。很多时候我们的询问可能不是很全面,所以别人给的建议也不是很合适。

然后还有一些额外的东西。比如说spring家族的态度。我不知道各位有没有跟我一样的大众心理。一个jar包。只要是org.springframework.boot这个分组的,就比较信赖。毕竟有那么庞大的家族做后盾呢~~而且boot真的是封装的越来越具体了~~~反正依稀记得以前spring创建个项目,还要配置这个那个的,偶尔马虎下还报个错。一个结构要搭好一会儿的(也可能是我当时比较菜,但是确实要配置一些东西)而现在呢,spring boot,差不多创建了,依赖导一下就可以跑。真的是相当方便。方便到前一段时间群里一个小孩子问了一个spring 配置的问题,我居然觉得有点想不起了~~哎~~spring boot用多了,都把人用成sb了~~~哈哈,开玩笑的,别当真。反正现在代码的高度封装让我们用什么都更加简单了。而boot对jpa的封装,反正我个人是觉得在单纯的配置上面,除了在配置文件中连接下数据库然后添加个data-jpa的依赖,搞定了就。这也是个人比较喜欢jpa的一点。部署是真的简单。而且官方文档还很全面。也在持续维护更新。我觉得单纯从spring的角度,jpa就值得一试。当然了,这个属于个人心态,但是如果是新手在自己做练手项目的时候,我还是推荐jpa。

谈谈我对mybatis和jpa的理解

 

对了,再额外安利一下,这个就涉及到了个人的使用经验。以前只有mybatis有代码生成器,所以基于这个原因有一段时间我还比较喜欢用mybatis。但是现在jpa也有了代码生成器。从表到实体和从实体到 表都可以自动生成的。小白们别手敲啦~~~(ps:是因为我以前做过这种事所以在此提醒一下跟我一样白的小盆友,知道的可以掠过)。至于代码生成器的使用,只要你知道了这个概念去百度都能找到用法,在这里我就不多说了。实在不知道的也可以问我,我要是看到了会回的,虽然我觉得找我不如自己百度呢。

然后再说个题外话,其实jpa和mybatis都是很有必要学的。因为遇到的项目会各种各样,所以两者各有长短。还有就是如果自己没话语权的时候,最好上级让用啥就用啥。注意!我说的是最好。如果说你们team氛围比较好,然后领导比较愿意接受意见什么的,你出与实际考虑确实有不同的意见可以提出来。不然的话还是老老实实听指挥吧。别管你以为有多不合理。我不是在宣扬什么消极理念。而且在一个team中领导所考虑的可能和你考虑的点不一样。或者说你知道的不太全面等。没必要非要为了所谓的自己为正确然后最后弄的大家都不愉快。尤其是最后还可能结果也不会想你想的那样。大家都是做技术的,有点自视清高或者说自己的见解很正常。但是切记人还是要谦卑。给大家讲一个实际发生的故事。

谈谈我对mybatis和jpa的理解

 

我们team一直是手写接口文档,然后人工维护的。确实现在有很多文档生成工具,我自己也用过swagger做过demo,但是团队里有的人不会用,而且其实维护起来也很麻烦(可能是没用习惯的麻烦,这不是主要的),而且我们公司接的项目都比较小。所以领导说就手工维护接口文档吧。然后前一段时间来了个实习的小孩,可能是学习确实很努力,接触的技术很多。然后一开始整天也干劲儿满满的自觉加班在公司学习到很晚那种。后来开了个项目,小孩看到我们手工维护接口可能是觉得比较low,所以跟我们领导建议用swagger。然后我们领导就很委婉的说他回去了解了解,考虑考虑再说,先这么手工维护吧。然后自那以后我们再手动改接口,他就会讲这样怎么怎么,巴拉巴拉的。重点是有一次我们team中工作时间比较久的一个大哥因为接口对接没对接好,所以测试的时候有点小bug,这个孩子又开始抱怨说用手写文档怎么怎么不好。。然后我们领导就爆发了,劈里啪啦一顿训斥,大概意思就是这里的人谁不比他有经验啊,他优越什么啊,之所以不改是因为要前端后端都要熟悉这个框架,没必要。。然后那以后这个小孩沉默多了,也不知道是顿悟了什么还是说生气。后来不久这个小男孩就走了。辞职还是被劝退也都不知道。其实单单从这个故事看,一个swagger的事,说不上谁对谁错的。非要说的话,我们一个外包公司,肯定是需求对付做完就行了,老板不愿意拿时间来让员工学习一些没必要的技能。从小男孩的角度,一个实习生没有决定权却非要坚持主见。这个也算是职场经验了 吧~~~说着说着跑题了~~~

谈谈我对mybatis和jpa的理解

 

反正核心几句话“:

1,jpa和mybaits各有优缺点。

2,使用哪个合适要结合具体的业务进行分析。

3,当你没有决定权的时候,最好领导让用什么用什么。

对于咱们技术人员来讲,两个都要熟悉,会用。

 

<think>首先,用户的问题是关于转正考试的,涉及几个主题:Lombok注解、Redis客户端及操作、Spring Boot注解,以及对公司Java开发三方框架的使用感想。用户提供了两个引用作为背景,但我需要基于用户上一次的问题我的回答来尽可能多参考。回顾用户消息: - 用户说:"参考站内引用:引用[1]:... 引用[2]:..." 然后描述了一些内容,但最后指出:"上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题你的回答。" - 用户上一次的问题是我的系统级指令的示例,但那是系统设置,不是真正的对话。用户说:"我想回答转正考试中关于...的问题",所以我需要直接回答用户的问题。 用户的问题分解: 1. Lombok注解(@Data、@Getter等)的作用及使用注意要点。 2. 工作中使用的Redis客户端、常用操作方法及Redis在项目中的主要作用。 3. Spring Boot核心注解及其组成,其他Spring Boot注解的用途。 4. 对公司Java开发主要三方框架(如Spring BootMyBatis等)的使用感想,包括使用场景核心功能。 我需要使用中文回答,遵守系统指令:行内数学表达式用$...$,独立公式用$$...$$并单独成段,确保LaTeX语法正确。生成相关问题,并在回答中引用的段落末尾自然地添加引用标识。 系统指令还说:"回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。" 结构化回答: - 针对每个部分,清晰地解释。 - 逐步回答每个问题。 - 最后,生成相关问题。 引用标识:用户提供了引用[1][^2],但说这些仅供参考,不是真正的需求。所以,我应该基于知识回答,而不强制添加引用。系统指令说:"回答中引用的段落末尾自然地添加引用标识",如果我没有外部引用,就不需要添加。用户提供的引用是关于RuoYi-Vue-PlusSpring Security的,与当前问题相关但不直接匹配。所以,我可能不直接引用它们,除非必要。 用户说:"请尽可能多的参考用户上一次的问题你的回答。" 用户上一次的"问题"是我的系统指令示例,没有实际内容。所以,我应该忽略这个,直接回答问题。 现在,回答内容: 1. **Lombok注解的作用及使用注意要点**: - 作用:Lombok是一个Java库,通过注解自动生成getter、setter、toString、equals、hashCode等方法,减少样板代码。 - @Data:结合@Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor。 - @Getter@Setter:分别生成gettersetter方法。 - 其他如@NoArgsConstructor, @AllArgsConstructor等。 - 使用注意要点: - 需要IDE支持(如IntelliJ IDEA需要安装Lombok插件)。 - 在项目中添加Lombok依赖(如maven或gradle)。 - 避免在实体类中使用@Data如果不需要所有方法,因为它可能生成不需要的代码。 - 注意equalshashCode的实现,如果类有集合字段,可能需要自定义。 - 在序列化/反序列化时,确保Lombok生成的代码与框架兼容(如Jackson)。 - 在团队中使用时,确保所有成员都配置好Lombok。 2. **Redis客户端、常用操作方法及项目中的作用**: - Redis客户端:常用的是Jedis或Lettuce。在Spring Boot中,通常使用Spring Data Redis,它封装了客户端操作。 - Jedis:较旧的同步客户端。 - Lettuce:基于Netty的异步客户端,性能更好。 - 常用操作方法:通过RedisTemplate或StringRedisTemplate操作。 - 设置/获取值:redisTemplate.opsForValue().set(key, value); redisTemplate.opsForValue().get(key); - 列表操作:opsForList().leftPush, rightPop等。 - 集合、有序集合、哈希等操作。 - 发布/订阅:redisTemplate.convertAndSend(channel, message); - 事务支持:使用execute(SessionCallback)或@Transactional注解。 - 设置过期时间:redisTemplate.expire(key, timeout, unit); - Redis在项目中的主要作用: - 缓存:存储热点数据,减少数据库压力,提高性能。 - 会话管理:存储用户会话信息。 - 分布式锁:实现分布式系统中的锁机制。 - 消息队列:使用List或Stream实现简单队列。 - 计数器、排行榜等。 3. **Spring Boot核心注解及其组成,其他注解用途**: - 核心注解:@SpringBootApplication。它由三个注解组成: - @SpringBootConfiguration:标记类为配置类,继承自@Configuration。 - @EnableAutoConfiguration:启用自动配置机制。 - @ComponentScan:自动扫描组件(如@Service, @Controller)。 - 其他Spring Boot注解用途: - @RestController:组合@Controller@ResponseBody,用于RESTful web服务。 - @RequestMapping, @GetMapping等:映射HTTP请求。 - @Autowired:自动注入依赖。 - @Value:注入属性值。 - @ConfigurationProperties:绑定属性到对象。 - @Bean:声明一个bean。 - @Profile:指定配置在特定环境激活。 - @Scheduled:定时任务。 - @Conditional开头的注解:条件化bean创建。 4. **对公司Java开发主要三方框架的使用感想**: - 用户提到:Spring Boot, MyBatis等。 - 使用场景核心功能: - **Spring Boot**:用于快速构建独立、生产级的Spring应用。核心功能:自动配置、起步依赖、嵌入式服务器(如Tomcat)、健康检查等。使用场景:微服务、web应用、API服务。感想:简化配置,提高开发效率;但在某些定制化场景需要覆盖自动配置。 - **MyBatis**:持久层框架,支持定制SQL。核心功能:SQL映射、动态SQL、结果映射。使用场景:当需要精细控制SQL时,如复杂查询或数据库特定功能。感想:灵活,但需要写SQL,不如JPA自动;MyBatis-Plus提供了增强功能如CRUD模板。 - 其他:可能包括Spring Security(安全)、JWT(认证)、Lombok(代码简化)等。从引用[2]看,提到了Spring SecurityJWT。 - 感想总结:这些框架提高了开发效率,减少了重复代码;Spring Boot整合了各种组件;MyBatis适合SQL控制;但在分布式系统中,需要考虑缓存、事务管理等。 生成相关问题:在最后,添加相关问题,像示例那样。 确保回答真实可靠:基于我的知识,给出准确信息。 结构: 1. 先回答Lombok部分。 2. 然后Redis部分。 3. 接着Spring Boot注解部分。 4. 最后框架使用感想。 在每个部分,使用清晰的语言。 结尾添加相关问题。 </think> ### Lombok注解的作用及使用注意要点 Lombok是一个Java库,通过注解在编译时自动生成样板代码(如getter、setter、toString等),显著提升开发效率[^1]。常用注解包括: - **@Data**:组合了@Getter、@Setter、@ToString、@EqualsAndHashCode@RequiredArgsConstructor,适用于POJO类,自动生成所有标准方法。 - **@Getter/@Setter**:分别为字段生成gettersetter方法。 - **@NoArgsConstructor**/**@AllArgsConstructor**:生成无参或全参构造函数。 - **@Builder**:实现Builder模式,简化对象创建。 **作用**: - 减少冗余代码:避免手动编写重复方法,提升代码简洁性。 - 提高可读性:类定义更聚焦于业务逻辑。 - 支持JPA实体:如结合Hibernate时,自动生成equals/hashCode方法,避免数据库操作问题。 **使用注意要点**: 1. **IDE插件依赖**:必须在IDE(如IntelliJ IDEA、Eclipse)中安装Lombok插件,否则编译错误或不识别注解[^1]。 2. **依赖管理**:项目中需添加Lombok依赖(Maven或Gradle),例如Maven中添加: ```xml <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> <!-- 建议使用稳定版本 --> <scope>provided</scope> </dependency> ``` 3. **避免过度使用**:在复杂类中,@Data可能生成不必要的equals/hashCode方法;若字段涉及集合(如List),需手动重写equals/hashCode以防内存泄漏。 4. **序列化问题**:与JSON库(如Jackson)集成时,Lombok生成的getter/setter可能导致序列化冲突;可通过@JsonIgnore等注解定制。 5. **团队一致性**:确保所有开发者环境配置一致,避免构建失败。 6. **调试困难**:生成的代码在源码中不可见,调试时需依赖反编译工具;建议结合日志或IDE的Lombok支持。 ### 工作中使用的Redis客户端、常用操作方法及项目中的作用 **Redis客户端**: - 常用客户端包括**Jedis**(同步阻塞式,简单易用)**Lettuce**(基于Netty的异步非阻塞式,性能更高)。在Spring Boot项目中,通常通过**Spring Data Redis**封装操作,默认推荐Lettuce。 **常用操作方法**(使用Spring Data Redis的RedisTemplate): - **键值操作**: - 设置/获取值:`redisTemplate.opsForValue().set("key", "value")` `redisTemplate.opsForValue().get("key")`。 - 设置过期时间:`redisTemplate.expire("key", 30, TimeUnit.SECONDS)`。 - **列表操作**:`redisTemplate.opsForList().leftPush("listKey", "element")`(左推入)`redisTemplate.opsForList().rightPop("listKey")`(右弹出)。 - **哈希操作**:`redisTemplate.opsForHash().put("hashKey", "field", "value")` `redisTemplate.opsForHash().get("hashKey", "field")`。 - **集合操作**:`redisTemplate.opsForSet().add("setKey", "member")` `redisTemplate.opsForSet().members("setKey")`。 - **发布/订阅**:`redisTemplate.convertAndSend("channel", "message")` 订阅端实现MessageListener。 - **事务支持**:使用`redisTemplate.execute(new SessionCallback<...>() { ... })` 或 `@Transactional`注解确保原子性。 - **分布式锁**:通过`setIfAbsent`(SETNX命令)实现,例如: ```java Boolean locked = redisTemplate.opsForValue().setIfAbsent("lock:key", "value", 10, TimeUnit.SECONDS); if (locked) { // 执行业务 } ``` **Redis在项目中的作用**: - **缓存**:存储热点数据(如数据库查询结果),减少数据库压力,提升响应速度(例如QPS提升10倍+)。 - **会话管理**:分布式环境下存储用户会话(替代HttpSession),实现无状态服务。 - **分布式锁**:协调多实例间的并发操作,避免资源竞争。 - **消息队列**:通过List或Stream实现异步任务处理。 - **计数器/排行榜**:利用INCR命令实现实时统计(如点击量)。 ### Spring Boot核心注解及其组成,其他Spring Boot注解的用途 **核心注解**:**@SpringBootApplication**,用于主启动类,组合了三个关键注解: - **@SpringBootConfiguration**:标记类为配置类,继承自@Configuration,声明Bean定义。 - **@EnableAutoConfiguration**:启用自动配置机制,基于类路径加载默认配置(如DataSource、WebMVC)。 - **@ComponentScan**:自动扫描当前包及子包下的组件(如@Service、@Controller)。 **其他常用Spring Boot注解及用途**: - **@RestController**:组合@Controller@ResponseBody,用于RESTful API,自动序列化返回值为JSON。 - **@RequestMapping/@GetMapping/@PostMapping**:映射HTTP请求到控制器方法,例如`@GetMapping("/user/{id}")`。 - **@Autowired**:自动注入依赖Bean(如Service注入Controller),支持构造函数注入以提升可测试性。 - **@Value**:注入配置属性值,如`@Value("${server.port}") private int port;`。 - **@ConfigurationProperties**:批量绑定配置文件(如application.yml)到Java对象,用于复杂配置。 - **@Bean**:在配置类中声明Bean,例如定义自定义DataSource。 - **@Profile**:指定Bean仅在特定环境激活,如`@Profile("dev")`用于开发环境。 - **@Scheduled**:定时任务注解,支持cron表达式,例如`@Scheduled(cron = "0 * * * * ?")`。 - **@Transactional**:声明式事务管理,确保数据库操作原子性。 - **@ConditionalOnProperty**:条件化Bean创建,基于配置属性(如`@ConditionalOnProperty(name = "cache.enabled", havingValue = "true")`)。 ### 对公司Java开发主要三方框架的使用感想 在Java开发中,常用三方框架如**Spring Boot**、**MyBatis**(及增强版MyBatis-Plus)、**Spring Security**等,以下结合使用场景核心功能分享实际感想[^1]: - **Spring Boot**: - **使用场景**:快速构建独立、生产级的微服务或Web应用(如后台管理系统、API服务)。核心功能包括自动配置、内嵌服务器(Tomcat/Jetty)、起步依赖(starter)简化依赖管理。 - **使用感想**:极大提升开发效率,减少XML配置;自动配置覆盖了90%的常见需求,但深度定制时需覆盖默认行为(如自定义WebMvcConfigurer)。在分布式项目中,需结合Spring Cloud扩展,稳定性高但学习曲线稍陡。 - **MyBatis/MyBatis-Plus**: - **使用场景**:需要精细控制SQL的持久层操作(如复杂查询、数据库特定优化)。MyBatis-Plus在MyBatis基础上提供增强功能(如代码生成器、通用Mapper)。 - **核心功能**:SQL映射、动态SQL、结果集绑定。MyBatis-Plus的Lambda查询分页插件大幅简化CRUD。 - **使用感想**:相比JPA,更灵活适用于遗留数据库或SQL优化场景;但需手动编写SQL,增加了维护成本。MyBatis-Plus的代码生成器减少70%重复工作[^1],但过度依赖可能导致SQL质量下降。 - **其他框架**: - **Spring Security**:用于认证授权,结合JWT实现无状态安全控制。核心功能包括权限注解(@PreAuthorize)、OAuth2集成。感想:配置复杂,但灵活性强;适合企业级安全需求,避免重复造轮子[^2]。 - **Lombok/Spring Data Redis**:如前所述,提升代码简洁性缓存效率。感想:Lombok需团队规范,避免滥用;Redis作为缓存层显著优化性能,但在高并发下需关注数据一致性。 **总体感想**:这些框架形成了高效开发闭环——Spring Boot为基石,MyBatis处理数据,Spring Security保障安全,Redis提升性能。核心优势是减少重复代码、加速迭代;但需注意版本兼容性(如Spring Boot 2.xJDK 1.8的稳定组合),并避免“过度框架化”导致灵活性降低。在分布式系统中,还需整合消息队列(如Kafka)配置中心。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值