Mybatis primary practice 5: one to one association query

itread01 2021-01-21 13:49:59
mybatis primary practice association query


### Welcome to my GitHub[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) Content : All original articles classified summary and supporting original code , involve Java、Docker、Kubernetes、DevOPS etc. ;### An overview of this article - This article is about 《MyBatis Primary combat 》 Part five of the series , Getting data from multiple tables is a common scenario , There are generally two ways :- Joint table query :join operation , One query complete - Multiple queries : Use the result of the first query as a condition , Make another inquiry (MyBatis It's called nested query )- The content of this article is learning MyBatis Support for the above two queries , The full text consists of the following chapters :1. Prepare information ;2. The actual combat is java engineering 3. The simplest join table ( The data of the two tables are stored in different fields of an entity class );4. One to one join table query ( The data of the two tables are stored in different entity classes , Suppose it is A and B,A yes B Member variables for )5. One to one nested query ( The data of the two tables are stored in different entity classes , Suppose it is A and B,A yes B Member variables for )### Source code download 1. If you don't want to code , Can be in GitHub Download all the source code , The address and link information is shown in the table below (https://github.com/zq2599/blog_demos):| Name | Link to | Note || :-------- | :----| :----|| Project home page | https://github.com/zq2599/blog_demos | The project is in GitHub Home page on || git Warehouse address (https)| https://github.com/zq2599/blog_demos.git | The warehouse address of the project source code ,https Agreement || git Warehouse address (ssh)| [email protected]:zq2599/blog_demos.git | The warehouse address of the project source code ,ssh Agreement |2. This git There are multiple folders in the project , The application of this chapter is in mybatis Under folder , As shown in the red box below :![ Insert picture description here ](https://img2020.cnblogs.com/other/485422/202101/485422-20210121082516339-304561694.png)3. mybatis It's a parent project , There are several sub projects in it , The source code of this article is relatedoperation In the subproject , As shown in the red box below :![ Insert picture description here ](https://img2020.cnblogs.com/other/485422/202101/485422-20210121082519889-1247316723.jpg)### Prepare information 1. This actual battle , In the name of mybatis Create two tables in the database of ( As like as two peas in the previous articles ):user and log surface ;2. user Table records user information , Very simple , There are only three fields : Primary key 、 Name 、 Age 3. log Tables record user behavior , Four fields : Primary key 、 Users id、 Behavior description 、 Behavior time 4. user and log The relationship is shown in the figure below :![ Insert picture description here ](https://img2020.cnblogs.com/other/485422/202101/485422-20210121082520138-74316177.jpg)5. The statements for creating tables and adding data are as follows :```sqluse mybatis;DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` int(32) NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL, `age` int(32) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `log`;CREATE TABLE `log` ( `id` int(32) NOT NULL AUTO_INCREMENT, `user_id` int(32), `action` varchar(255) NOT NULL, `create_time` datetime not null, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;INSERT INTO mybatis.user (id, name, age) VALUES (3, 'tom', 11);INSERT INTO mybatis.log (id, user_id, action, create_time) VALUES (3, 3, 'read book', '2020-08-07 08:18:16');INSERT INTO mybatis.log (id, user_id, action, create_time) VALUES (4, 3, 'go to the cinema', '2020-09-02 20:00:00');INSERT INTO mybatis.log (id, user_id, action, create_time) VALUES (5, 3, 'have a meal', '2020-10-05 12:03:36');INSERT INTO mybatis.log (id, user_id, action, create_time) VALUES (6, 3, 'have a sleep', '2020-10-06 13:00:12');INSERT INTO mybatis.log (id, user_id, action, create_time) VALUES (7, 3, 'write', '2020-10-08 09:21:11');```### The actual combat is java engineering 1. In the parent project mybatis Next new sub project relatedoperation,pom.xml as follows :```xml```2. Basic configuration file application.yml:```ymlserver: port: 8080spring: #1.JDBC Source datasource: username: root password: 123456 url: jdbc:mysql://192.168.50.43:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver #2. Connection pool configuration druid: # Initialize the number of connections in the connection pool size , Minimum , Maximum initial-size: 5 min-idle: 5 max-active: 20 # Configure the timeout for getting the connection max-wait: 60000 # How often is the configuration interval checked , Detect idle connections that need to be closed , It's in milliseconds time-between-eviction-runs-millis: 60000 # Configure the minimum lifetime of a connection in the pool , It's in milliseconds min-evictable-idle-time-millis: 30000 # Configure the maximum lifetime of a connection in the pool , It's in milliseconds max-evictable-idle-time-millis: 300000 validation-query: SELECT 1 FROM user test-while-idle: true test-on-borrow: true test-on-return: false # Whether to cache preparedStatement, That is to say PSCache Official advice MySQL The next suggestion is to close I suggest that if you want to use SQL Firewall Recommended on pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 # Configure monitoring statistics to intercept filters, Remove the monitor interface sql Can't count ,'wall' For firewalls filters: stat,wall,slf4j filter: stat: merge-sql: true slow-sql-millis: 5000 #3. Basic monitoring configuration web-stat-filter: enabled: true url-pattern: /* # Set not to count which URL exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" session-stat-enable: true session-stat-max-count: 100 stat-view-servlet: enabled: true url-pattern: /druid/* reset-enable: true # Set the login name and password of the monitoring page login-username: admin login-password: admin allow: 127.0.0.1 #deny: 192.168.1.100# mybatis To configure mybatis: # Configuration file location config-location: classpath:mybatis-config.xml # The location of the mapping file mapper-locations: classpath:mappers/*Mapper.xml# Log configuration logging: level: root: INFO com: bolingcavalry: relatedoperation: mapper: debug```3. And we're going to call it application-test.yml Configuration file of , This is used when performing unit tests , and application.yml The difference is spring.datasource.druid.web-stat-filter.enabled The configuration is set to false;4. mybatis Configuration file of mybatis-config.xml as follows :```xml```5. Data source configuration class DruidConfig.java:```javapackage com.bolingcavalry.relatedoperation;import com.alibaba.druid.pool.DruidDataSource;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class DruidConfig { private static final Logger logger = LoggerFactory.getLogger(DruidConfig.class); @Value("${spring.datasource.url}") private String dbUrl; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.driver-class-name}") private String driverClassName; @Value("${spring.datasource.druid.initial-size}") private int initialSize; @Value("${spring.datasource.druid.max-active}") private int maxActive; @Value("${spring.datasource.druid.min-idle}") private int minIdle; @Value("${spring.datasource.druid.max-wait}") private int maxWait; @Value("${spring.datasource.druid.pool-prepared-statements}") private boolean poolPreparedStatements; @Value("${spring.datasource.druid.max-pool-prepared-statement-per-connection-size}") private int maxPoolPreparedStatementPerConnectionSize; @Value("${spring.datasource.druid.time-between-eviction-runs-millis}") private int timeBetweenEvictionRunsMillis; @Value("${spring.datasource.druid.min-evictable-idle-time-millis}") private int minEvictableIdleTimeMillis; @Value("${spring.datasource.druid.max-evictable-idle-time-millis}") private int maxEvictableIdleTimeMillis; @Value("${spring.datasource.druid.validation-query}") private String validationQuery; @Value("${spring.datasource.druid.test-while-idle}") private boolean testWhileIdle; @Value("${spring.datasource.druid.test-on-borrow}") private boolean testOnBorrow; @Value("${spring.datasource.druid.test-on-return}") private boolean testOnReturn; @Value("${spring.datasource.druid.filters}") private String filters; @Value("{spring.datasource.druid.connection-properties}") private String connectionProperties; /** * Druid Connection pool configuration */ @Bean public DruidDataSource dataSource() { DruidDataSource datasource = new DruidDataSource(); datasource.setUrl(dbUrl); datasource.setUsername(username); datasource.setPassword(password); datasource.setDriverClassName(driverClassName); datasource.setInitialSize(initialSize); datasource.setMinIdle(minIdle); datasource.setMaxActive(maxActive); datasource.setMaxWait(maxWait); datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); datasource.setMaxEvictableIdleTimeMillis(minEvictableIdleTimeMillis); datasource.setValidationQuery(validationQuery); datasource.setTestWhileIdle(testWhileIdle); datasource.setTestOnBorrow(testOnBorrow); datasource.setTestOnReturn(testOnReturn); datasource.setPoolPreparedStatements(poolPreparedStatements); datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); try { datasource.setFilters(filters); } catch (Exception e) { logger.error("druid configuration initialization filter", e); } datasource.setConnectionProperties(connectionProperties); return datasource; }}```6. swagger Configuration class :```javapackage com.bolingcavalry.relatedoperation;import springfox.documentation.service.Contact;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import springfox.documentation.builders.ApiInfoBuilder;import springfox.documentation.builders.PathSelectors;import springfox.documentation.builders.RequestHandlerSelectors;import springfox.documentation.service.ApiInfo;import springfox.documentation.service.Tag;import springfox.documentation.spi.DocumentationType;import springfox.documentation.spring.web.plugins.Docket;import springfox.documentation.swagger2.annotations.EnableSwagger2;@Configuration@EnableSwagger2public class SwaggerConfig { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .tags(new Tag("UserController", " User services "), new Tag("LogController", " Logging services ")) .select() // Current package path .apis(RequestHandlerSelectors.basePackage("com.bolingcavalry.relatedoperation.controller")) .paths(PathSelectors.any()) .build(); } // Build api File details function , Note that the annotation here refers to which private ApiInfo apiInfo() { return new ApiInfoBuilder() // Page title .title("MyBatis CURD operation ") // Build people .contact(new Contact(" Programmer Xinchen ", "https://github.com/zq2599/blog_demos", " [email protected]")) // Version number .version("1.0") // describe .description("API describe ") .build(); }}```7. springboot Guide class :```javapackage com.bolingcavalry.relatedoperation;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@MapperScan("com.bolingcavalry.relatedoperation.mapper")public class RelatedOperationApplication { public static void main(String[] args) { SpringApplication.run(RelatedOperationApplication.class, args); }}```8. The entity class of the user table :```javapackage com.bolingcavalry.relatedoperation.entity;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import lombok.Data;import lombok.NoArgsConstructor;@Data@NoArgsConstructor@ApiModel(description = " User entity class ")public class User { @ApiModelProperty(value = " Users ID") private Integer id; @ApiModelProperty(value = " User name ", required = true) private String name; @ApiModelProperty(value = " User address ", required = false) private Integer age;}```9. The entity class of the log table :```javapackage com.bolingcavalry.relatedoperation.entity;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import lombok.Data;import lombok.NoArgsConstructor;import java.sql.Date;@Data@NoArgsConstructor@ApiModel(description = " Log entity class ")public class Log { @ApiModelProperty(value = " The Journal ID") private Integer id; @ApiModelProperty(value = " Users ID") private Integer userId; @ApiModelProperty(value = " Log content ") private String action; @ApiModelProperty(value = " Set up time ") private Date createTime;}```- The above is the preparation code of this article , Next, on this basis to achieve a variety of multi table Association query ### The simplest join table - First of all, the most common joint watch , As shown in the figure below , The query result is called LogExtend The entity class of , This class has 5 Fields , Four of them are from the log table log, One from the user table user:![ Insert picture description here ](https://img2020.cnblogs.com/other/485422/202101/485422-20210121082520332-1934786433.jpg)- Here's the development steps :![ Insert picture description here ](https://img2020.cnblogs.com/other/485422/202101/485422-20210121082520518-1632391366.jpg)1. Entity class LogExtend The original code of is as follows , Visible and Log It's more than userName Hurdles :```javapackage com.bolingcavalry.relatedoperation.entity;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import lombok.Data;import lombok.NoArgsConstructor;@Data@NoArgsConstructor@ApiModel(description = " Log entity class ( Fields with user tables )")public class LogExtend extends Log { @ApiModelProperty(value = " User name ") private String userName;}```2. newly build log The mapping file corresponding to the table LogMapper.xml, As shown below , It's through left join Syntax to perform a simple join table query , And the query result corresponding to resultMap Define :```xml```3. mapper Interface code :```javapackage com.bolingcavalry.relatedoperation.mapper;import com.bolingcavalry.relatedoperation.entity.LogAssociateUser;import com.bolingcavalry.relatedoperation.entity.LogExtend;import org.springframework.stereotype.Repository;@Repositorypublic interface LogMapper { LogExtend oneObjectSel(int id);}```4. service Layer code in LogService.java In Archives :```javapackage com.bolingcavalry.relatedoperation.service;import com.bolingcavalry.relatedoperation.entity.LogAssociateUser;import com.bolingcavalry.relatedoperation.entity.LogExtend;import com.bolingcavalry.relatedoperation.mapper.LogMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class LogService { @Autowired LogMapper logMapper; public LogExtend oneObjectSel(int id){ return logMapper.oneObjectSel(id); }}```5. controller Layer code in LogController.java In Archives :```java@RestController@RequestMapping("/log")@Api(tags = {"LogController"})public class LogController { @Autowired private LogService logService; @ApiOperation(value = " According to ID Query logging , Band userName Hurdles , This field is realized through linked table query ", notes=" According to ID Query logging , Band userName Hurdles , This field is realized through linked table query ") @ApiImplicitParam(name = "id", value = " The Journal ID", paramType = "path", required = true, dataType = "Integer") @RequestMapping(value = "/aggregate/{id}", method = RequestMethod.GET) public LogExtend oneObjectSel(@PathVariable int id){ return logService.oneObjectSel(id); }```6. Write unit test code ControllerTest.java, Because today's test involves user and log Two tables , So in the test class ControllerTest Two inner classes are prepared inside , For testing respectively user and log surface :```javapackage com.bolingcavalry.relatedoperation.controller;import lombok.extern.slf4j.Slf4j;import org.junit.jupiter.api.*;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.http.MediaType;import org.springframework.test.context.ActiveProfiles;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;@SpringBootTest@DisplayName("Web Unit testing of interfaces ")@AutoConfigureMockMvc@ActiveProfiles("test")@Slf4jpublic class ControllerTest { /** * Query method : Joint table */ final static String SEARCH_TYPE_LEFT_JOIN = "leftjoin"; /** * Query method : Nest like */ final static String SEARCH_TYPE_NESTED = "nested"; final static int TEST_USER_ID = 3; final static String TEST_USER_NAME = "tom"; @Autowired MockMvc mvc; @Nested @TestMethodOrder(MethodOrderer.OrderAnnotation.class) @DisplayName(" User services ") class User { } @Nested @TestMethodOrder(MethodOrderer.OrderAnnotation.class) @DisplayName(" Logging services ") class Log { final static int TEST_LOG_ID = 5; @Test @DisplayName(" Through the log ID Get log information , Band userName Hurdles , This field is realized through linked table query ") @Order(1) void oneObjectSel() throws Exception { mvc.perform(MockMvcRequestBuilders.get("/log/aggregate/" + TEST_LOG_ID) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.id").value(TEST_LOG_ID)) .andExpect(jsonPath("$.userName").value(TEST_USER_NAME)) .andDo(print()); } }}```7. Perform the above unit test method , The results are as follows , In the red box is controller Data returned by layer , It can be seen that it has passed Mybatis To succeed in LogExtend For example :![ Insert picture description here ](https://img2020.cnblogs.com/other/485422/202101/485422-20210121082520874-337907740.jpg)- The next stop is one-to-one table query ;### About two ways of one-to-one association - The previous query has a feature : Even though two tables were queried , But the results are all in different fields of the same entity class , The more logical relationship is log Class has a user Member variable of class , In the following form :```java@Data@NoArgsConstructor@ApiModel(description = " Log entity class ")public class LogAssociateUser { @ApiModelProperty(value = " The Journal ID") private Integer id; @ApiModelProperty(value = " User object ") private User user; @ApiModelProperty(value = " Log content ") private String action; @ApiModelProperty(value = " Set up time ") private Date createTime;}```- The next real battle is how to use MyBatis The above LogAssociateUser The result of type ;- There are two ways to realize one-to-one association: linked table and nested query , The difference between them is Mybatis It's reflected in association On the child nodes of :1. When linking tables ,association Internal use result Child node , Map the result of a join table query to an associated object ;2. Nest time ,association Internal use select Child node , Trigger a new query ;### One on one ( Joint table ) One on one , One object is associated with another object , For example, one log In the record , With corresponding user Information ;1. Here's the new entity class LogAssociateUser, This class corresponds to log Table records , There is one user Hurdles , Type is User thing :```java@Data@NoArgsConstructor@ApiModel(description = " Log entity class ")public class LogAssociateUser { @ApiModelProperty(value = " The Journal ID") private Integer id; @ApiModelProperty(value = " User object ") private User user; @ApiModelProperty(value = " Log content ") private String action; @ApiModelProperty(value = " Set up time ") private Date createTime;}```2. Mapping file LogMapper.xml in ,sql and resultMap as follows , When the query is visible, it will user All the fields in the table have been found out , And then in resultMap of use association Node to handle sql We found out that user Table information , Through javaType Property changed to User Class :```xml ```3. That's one-on-one ( Joint table ) The key point of , Next step by step in LogMapper、LogService、LogController Add a new method in the , Here is LogController Corresponding to web Interface , This interface will be called later in the unit test to verify :```java @ApiOperation(value = " According to ID Query logging , With user objects , Joint table query implementation ", notes=" According to ID Query logging , With user objects , Joint table query implementation ") @ApiImplicitParam(name = "id", value = " The Journal ID", paramType = "path", required = true, dataType = "Integer") @RequestMapping(value = "/leftjoin/{id}", method = RequestMethod.GET) public LogAssociateUser leftJoinSel(@PathVariable int id){ return logService.leftJoinSel(id); }```4. Finally, the code for unit testing (ControllerTest.java Archives ), To test whether the above code is valid , Note the following queryAndCheck Private method , In this method, the request is initiated and the result is verified :```java /** * Through the log ID There are two ways to get log information : Join table and nested query , * From the client side , Only part of it path Different , So encapsulate the request and check into a common method , * The call method only needs to specify a different segment path * @param subPath * @throws Exception */ private void queryAndCheck(String subPath) throws Exception { String queryPath = "/log/" + subPath + "/" + TEST_LOG_ID; log.info("query path [{}]", queryPath); mvc.perform(MockMvcRequestBuilders.get(queryPath) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.id").value(TEST_LOG_ID)) .andExpect(jsonPath("$.user.id").value(TEST_USER_ID)) .andDo(print()); } @Test @DisplayName(" Through the log ID Get log information ( Associated with the user ), Joint table query ") @Order(2) void leftJoinSel() throws Exception { queryAndCheck(SEARCH_TYPE_LEFT_JOIN); }```5. The unit test results are as follows , Visible : There's a nested one inside json thing , Namely user Table information :![ Insert picture description here ](https://img2020.cnblogs.com/other/485422/202101/485422-20210121082522389-99862093.jpg)### One on one ( Nest like )1. Next, try the nest like approach ;2. LogMapper.xml Corresponding to sql:```xml ```3. Above sql Corresponding resultMap as follows , Visible association One of the nodes is select Properties , This is MyBatis The key to supporting nested queries , The value of this property is select Node :```java ```4. In the above nodes select Value of property , Corresponding to one select Node , as follows :```xml ```5. That's one-on-one ( Nest like ) The key point of , Next step by step in LogMapper、LogService、LogController Add a new method in the , Here is LogController Corresponding to web Interface , This interface will be called later in the unit test to verify :```java @ApiOperation(value = " According to ID Query logging , With user objects , Nested query implementation ", notes=" According to ID Query logging , With user objects , Nested query implementation ") @ApiImplicitParam(name = "id", value = " The Journal ID", paramType = "path", required = true, dataType = "Integer") @RequestMapping(value = "/nested/{id}", method = RequestMethod.GET) public LogAssociateUser nestedSel(@PathVariable int id){ return logService.nestedSel(id); }```6. Finally, the code for unit testing (ControllerTest.java Archives ), To test whether the above code is valid , As can be seen below , Direct call to the front queryAndCheck To verify :```java @Test @DisplayName(" Through the log ID Get log information ( Associated with the user ), Nest query ") @Order(3) void nestedSel() throws Exception { queryAndCheck(SEARCH_TYPE_NESTED); }```7. Run the above unit test code , The results are as follows , It can be seen that nested query can also user The data of table was obtained successfully , Put in log In the member variable of an instance :![ Insert picture description here ](https://img2020.cnblogs.com/other/485422/202101/485422-20210121082522846-909187286.jpg)8. Finally, we compare the differences between join table and nested query , Let's first look at the query of linked tables MyBatis The Journal , As shown in the red box below , For once sql Inquire about :![ Insert picture description here ](https://img2020.cnblogs.com/other/485422/202101/485422-20210121082523338-2029184207.jpg)9. Look at the log of nested query , Here's the picture , The red box is the first query , In the end userid As a condition for the second query in the green box :![ Insert picture description here ](https://img2020.cnblogs.com/other/485422/202101/485422-20210121082523873-399309500.jpg)- thus , One to one multi table query is completed , The logic of this article is log The record is associated with a user Record , Next article , Let's learn one to many connection , That's a user There are many log Record ;### You're not alone , Xinchen's original works are accompanied all the way 1. [Java series ](https://xinchen.blog.csdn.net/article/details/105068742)2. [Spring series ](https://xinchen.blog.csdn.net/article/details/105086498)3. [Docker series ](https://xinchen.blog.csdn.net/article/details/105086732)4. [kubernetes series ](https://xinchen.blog.csdn.net/article/details/105086794)5. [ Database + Intermediary software series ](https://xinchen.blog.csdn.net/article/details/105086850)6. [DevOps series ](https://xinchen.blog.csdn.net/article/details/105086920)### Welcome to the public account : Programmer Xinchen > Wechat search 「 Programmer Xinchen 」, I'm Xinchen , Looking forward to traveling with you Java The world ...[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos)
版权声明
本文为[itread01]所创,转载请带上原文链接,感谢
https://javamana.com/2021/01/20210121134655982j.html

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云