小博Java面试路上的点点滴滴

篇章 小博博客地址
Java 面试之基础篇 点击前往
Java 面试之框架篇 点击前往
Java 面试之数据结构篇 点击前往
Java 面试之JVM篇 点击前往
Java 面试之多线程篇 点击前往
Java 面试之数据库篇 点击前往
Java 面试之计算机网络篇 点击前往
Java 面试之操作系统篇 点击前往
Java 面试之算法篇 点击前往
Java 面试之附加篇 点击前往

小博Spring Boot 入门教程

  相信小伙伴们在使用 Spring 或 SpringMVC 的过程中,或多或少会被各种配置问题所牵绊,这些配置不仅徒增工作量,而且在跨平台部署时容易出现问题。因此,Spring Boot 应运而生,它集成了大量常用的第三方库配置(例如 Jackson、JDBC、MongoDB、Redis、Mail 等等),这些第三方库几乎都可以零配置的开箱即用,可以帮助我们快速搭建一个项目,从而让开发者能够更加专注于业务逻辑。
  Spring Boot 的优点及特性,就不再逐一罗列了,针对 Spring Boot 的初学者,让我们先快速学会怎么用。

版本列表

名称 版本 备注
JDK 1.8.0
MySQL 5.7.15
IDEA Ultimate 2017.2 不能用社区版
Maven 3.5.2 可用阿里仓库提速
Spring Boot 1.5.9

快速构建项目

  关于 Spring Boot 项目的构建,IDEA 为我们提供了良好的支持,在 IDEA 中 New→Project→Spring Initializr→Next→Next(可自己填写相关信息)→选中 Web 栏目的 Web 依赖→Next→Finish(可自己填写相关信息),一个简单 Spring Boot 项目搭建好了。没错不用惊讶,搭好了。接下来我们看看 IDEA 自动生成目录结构(以读者填写的具体信息为准)。

  • main

    • java

      • xin.chung.springboot

        • SpringbootApplication.java(项目入口文件)
    • resources
      • static(静态资源包)
      • templates(页面模板包)
      • application.properties(项目属性配置文件)
  • test
    • java

      • xin.chung.springboot

        • SpringbootApplicationTests.java(测试文件)

  IDEA 自动为我们生成了几个文件,其中 application.properties 文件为项目属性配置文件,一般包含服务器、数据库、日志等方面的配置,以及一些自定义的属性。SpringbootApplicationTests.java 是 JUnit 测试类,用来进行开发过程中的单元测试。这两类文件,留待后面详细介绍。而至于这个 SpringbootApplication.java 文件,它其实是项目的入口文件,内容也非常简单,如下:

@SpringBootApplication
public class SpringbootApplication {public static void main(String[] args) {SpringApplication.run(SpringbootApplication.class, args);}
}

  当我们运行这个类或主方法时,框架就会自动为我们开启服务。若见日志打印如下,说明启动成功,从日志可以看到,我们的 Tomcat 8080 端口已经准备就绪。

  .   ____          _            __ _ _/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/  ___)| |_)| | | | | || (_| |  ) ) ) )'  |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot ::        (v1.5.9.RELEASE)······Tomcat started on port(s): 8080 (http)
Started SpringbootApplication in 4.694 seconds (JVM running for 7.789)

关于项目构建途径或项目启动的其他方式,大家可在读者圈一起交流。

项目属性配置

单元测试

  在后续话题开始之前,我们有必要先探讨下单元测试。以往我们写一段测试代码,有一个前置步骤:用ClassPathXmlApplicationContext装载上下文,然后用ApplicationContext对象获取 Bean 实例。接下来,才能进行我们的测试代码编写。
  而在 Spring Boot 中,极大简化了测试代码,它为我们提供了@RunWith注解和@SpringBootTest注解分别用来指定测试运行类和运行 Spring Boot 基础测试环境。此时,你可以直接使用@Resource@Autowired注入所需 Bean 并使用,示例如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class PropertiesTests {@Resourceprivate DemoService demoService;//仅作展示,还未编写@Testpublic void test() {System.out.println(demoService.getDemo().toString());}
}

由于单元测试贯穿本文,所以每个章节都会在相应的地方讨论 Spring Boot 中 JUnit 的具体使用方法,此处只写出最简单的使用示例。

属性配置

  在前面提到过的 application.properties 文件中,我们可以进行一些项目的配置,也可以自定义一些项目所需要的属性参数然后用@Value注解在Java文件中引用,例如:

# Server 服务相关
server.port=8080
server.context-path=/demo
# Log 日志相关
logging.path=/var/logs
logging.file=demo.log
# Other 自定义
author=chung
addr=http://example.cn/activity/5a444c451f6ee91a25846ac1

  我们可以编写如下测试代码,验证.properties文件中的值是否能被我们在 Java 文件中所使用,至于打印结果我就不贴出来了。

@RunWith(SpringRunner.class)
@SpringBootTest
public class PropertiesTests {@Value("${author}")private String author;@Value("${addr}")private String addr;@Testpublic void test() {System.out.println("author:" + author + "--addr:" + addr);}
}

  实际上,我们也可以使用 YAML 作为项目的配置文件,这种语言更加简洁明了。以上.properties文件,可等价如下.yml文件(切记:后面的空格不能少,同时注意每行的缩进):

# Server 服务相关
server:port: 8080context-path: /demo
# Log 日志相关
logging:path: /var/logsfile: demo.log
# Other 自定义
author: chung
addr: http://example.cn/activity/5a444c451f6ee91a25846ac1

  但是以上两种写法都有同一个弊端:项目里面自定义配置项往往会有很多,频繁使用@Value注入将给项目的后期维护带来极大不便。这个时候,我们就可以建立一个属性对象,利用@ConfigurationProperties注解来绑定属性,有效简化繁杂的注入操作。例如:

# Other
paper:author: chungaddr: http://example.cn/activity/5a444c451f6ee91a25846ac1
@Component
// prefix对应配置文件中的前缀
@ConfigurationProperties(prefix = "paper")
public class Paper {private String author;private String addr;/***省略Getter Setter***/
}

  同理,我们可以编写如下测试代码,验证这种属性对象的方式能否正常使用。

@Resource
private Paper paper;@Test
public void test() {System.out.println("author:" + paper.getAuthor() + " addr:" + paper.getAddr());
}

  可以看到,当属性越来越多,我们利用对象的方式优势也就越大,而至于.properties.yml选哪种,就看个人喜好了。

控制器基本用法

关于 Controller

  讨论完了项目的属性配置,让我们探讨一下在 Spring Boot 中如何使用控制器。在 Spring Boot Controller 的编码中,我们常用到的注解如下:

  • 标注控制层组件的注解@Controller@RestController
  • 配置URL映射的注解@RequestMapping
  • 获取参数的注解@PathVariable(URL中)、@RequestParam(HTTP 请求中)
  • 校验参数的注解@Valid

  相信以上那些,大家或多或少有点熟悉,其实还有一些简洁的组合注解,这些注解在配合使用RESTful API时,会非常优雅非常有逼格:

  • @GetMapping("")
  • @PostMapping("")
  • @PutMapping("")
  • @DeleteMapping("")

  而实际上,XXXMapping("YYY")@RequestMapping(value = "YYY",method = RequestMethod.XXX)没有区别,点进源码一切你就会恍然大悟。
  看完这些注解,接下来我们瞧瞧怎么把它们用进控制器。先拿@Controller@RestController来说,如果使用@Controller注解,表示控制器返回的是模板,而使用@RestController注解,则表示返回的可能是 JSON 或文本等等。
  见如下代码,编写完成后启动项目,浏览器访问 http://localhost:8080/demo/say,你会看到 Hello World!,就是这么简单粗暴,什么 Jackson 配置之类的,让框架替你解决就好了。

@RestController
public class DemoController {@RequestMapping("/say")public String sayHello() {return "Hello World!";}
}

注意

  • 项目配置文件选择 application.properties 与 application.yml 之一即可(删掉其中一个)
  • 若上一章中没有配置 server.context-path=/demo 或者 context-path: /demo,则应访问http://localhost:8080/say
  • 添加完依赖后,右键 pom.xml→Maven→ Reimport,重新导入

  至于@Controller注解,我们常用来和模板引擎Thymeleaf一起使用,这里我们不讨论模板引擎,简单看看@Controller的使用:

  1. 在 pom 文件中导入Thymeleaf依赖(IDEA 的提示功能很强大,好好利用)
  2. 编写 Controller 代码,返回 hello 页面模板
  3. 编写页面模板 hello.html
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
@Controller
public class DemoController {@RequestMapping("/say")public String sayHello() {return "hello";}
}
<html><head><title>Hello</title></head><body><p>Hello World!</p></body>
</html>

  同样,启动项目,访问 http://localhost:8080/demo/say,我们发现,Hello World! 还是那个 Hello World!,但是它们背后的故事可就大不相同了。

实际上,我们点进源码就会发现,@RestController其实就是@ResponseBody@Controller,玩到后来还是被套路了…

  再来看看控制器中其它注解的使用,就拿那几个代表性的传说中和RESTful完美搭配的那几个家伙为例,我们在@RestController注解标识的控制器中,编写如下方法:

@GetMapping("/getPaper/{id}")
public Paper getPaper(@PathVariable String id) {Paper paper = new Paper(null, "chung", new Date(), "http://example.cn/activity/" + id);return paper;
}

  其中@GetMapping表示此方法仅响应GET请求,其请求路径也附在括号内。而@PathVariable则获取了路径中的一个参数,这个参数在路径中用大括号标注。
  还要再编写实体类 Paper 如下:

public class Paper {private Integer id;private String author;private Date date;private String url;/***省略NoArgsConstructor AllArgsConstructor***//***省略Getter Setter***/
}

  此时重启项目,再访问http://localhost:8080/demo/getPaper/5a444c451f6ee91a25846ac1,就可以看到框架已经自动帮我们把对象转换为 JSON 显示在了浏览器,如下:

{"id": null,"author": "chung","date": 1514896266452,"url": "http://example.cn/activity/5a444c451f6ee91a25846ac1"
}

  在上面的例子中,我们用到了@PathVariable注解,它可以帮助我们从路径中获取参数。而与其不同的@RequestParam注解,它可以帮助我们从请求中获取参数,例如:

@GetMapping("/getPaper")
public Paper getPaperByRequestParam(@RequestParam(defaultValue = "5a444c451f6ee91a25846ac1") String id) {Paper paper = new Paper(null, "chung", new Date(), "http://example.cn/activity/" + id);return paper;
}

  此时重启项目,访问http://localhost:8080/demo/getPaper?id=5a444c451f6ee91a25846ac1也将得到同样的结果。

注意:如果缺少?id=*这段,访问时将会报错,为避免这样的问题,我们可以设置默认值@RequestParam(defaultValue = "5a444c451f6ee91a25846ac1")

单元测试

  在上一章我们讨论了 Spring Boot 中 JUnit 的简单写法,其实,我们可以使用 IDEA 插入单元测试,这样更加便捷,省去了我们新建包、新建文件、新建类的时间,步骤如下:

  1. 在代码中选中DemoController右键→Go To→Test→Create New Test→勾选需要测试的方法→OK;
  2. 这时 IDEA 已经在 test 目录下相应的包内为我们创建好了DemoControllerTest文件;
  3. 我们使用 Spring 提供的MockMvc类来完成测试,用@AutoConfigureMockMvc注解让框架自动配置,并使用@Resource注入 MockMvc;
  4. 编写接口测试代码并打印,测试代码及结果如下两段:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class DemoControllerTest {@Resourceprivate MockMvc mockMvc;@Testpublic void getPaperByRequestParam() throws Exception {mockMvc.perform(MockMvcRequestBuilders.get("/getPaper").param("id", "5a444c451f6ee91a25846ac1")).andDo(print()).andReturn();}
}
MockHttpServletResponse:Status = 200
Error message = nullHeaders = {Content-Type=[application/json;charset=UTF-8]}Content type = application/json;charset=UTF-8Body = {"author":"chung","date":1514893447007,"url":"http://example.cn/activity/5a444c451f6ee91a25846ac1"}
Forwarded URL = null
Redirected URL = nullCookies = []

  测试结果限于篇幅,我只贴出了一小部分,在真实测试日志中我们可以看到各种详细的数据,包括返回页面 Body 体的具体内容也打印了出来。这样的测试代码简单优雅而又霸气十足有木有。

数据库基本操作

关于 Repository

  看完了与前端交互的部分,我们来讨论下 Spring Boot 在数据库操作方面,提供了哪些逆天的功能。
  提到持久化,不得不提JPA(Java Persistence API),JPA 是一种规范或者说标准,Hibernate很好的实现了它,而我们使用到的Spring-Data-JPA则是SpringHibernate的整合。探讨实例之前,我们先做好如下准备:
  添加Spring-Data-JPA的依赖如下,注意:spring-boot-starter-data-jpa 千万不要写错

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

  做好数据库相关配置,URL 和用户名密码等。其中ddl-auto: update表示对于表结构,有则更新,无则创建,show-sql: true则表示在控制台打印执行的SQL语句。

spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/dbgirlusername: rootpassword: rootjpa:hibernate:ddl-auto: updateshow-sql: true

  我们最好还是自己提前建好相关数据库和表,SQL 语句如下:

CREATE TABLE `tbl_paper` (`id` int(8) unsigned NOT NULL AUTO_INCREMENT,`author` varchar(6) DEFAULT '',`date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,`url` varchar(255) DEFAULT '',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

  此时,对与前面提到的 Paper 实体类,我们又有必要进行一定的改造,看下面这段,其中@Entity注解表示实体类与数据库表的映射关系,@Id标识主键,@GeneratedValue标识生成规则,默认为AUTO,这些都是常见的了。

@Entity(name = "tbl_paper")
public class Paper {@Id@GeneratedValueprivate Integer id;private String author;private Date date;private String url;/***省略NoArgsConstructor AllArgsConstructor***//***省略Getter Setter***//***省略Override toString***/
}

  完成了以上步骤,接下来的重头戏,当然是我们的DAO层代码啦。你没看错,仅仅只是将接口继承自JpaRepository就好了,<1,2>中,1为实体类,2为主键类型。至此,我们便可以进行简单的数据库CURD操作了,简单不简单?粗暴不粗暴?心动不心动?

public interface PaperRepository extends JpaRepository<Paper, Integer> {}

单元测试

  话说回来,还是来测试测试DAO层代码吧。首先我们提前插入几条测试数据到到数据库中备用:

INSERT INTO `tbl_paper` VALUES ('1', 'chung', '2018-01-02 21:07:10', 'http://example.cn/activity/5a444c451f6ee91a25846ac1');
INSERT INTO `tbl_paper` VALUES ('2', 'chung', '2018-01-02 21:07:33', 'http://example.cn/activity/5a444c451f6ee91a25846ac1');
INSERT INTO `tbl_paper` VALUES ('3', 'charle', '2018-01-02 21:07:47', 'http://example.cn/activity/5a444c451f6ee91a25846ac1');

  接着,根据提到过的方法,自动生成测试文件,并编写代码如下,其中findAll()是框架为我们提供的查询所有数据的方法,它会返回一个实体对象的List。

@RunWith(SpringRunner.class)
@SpringBootTest
public class PaperRepositoryTest {@Resourceprivate PaperRepository paperRepository;@Testpublic void testFindAll(){List<Paper> all = paperRepository.findAll();System.out.println(all.toString());}
}

  我们可以看看测试结果,打印出的内容正是我们所插入的3条记录。

[Paper{id=1, author='chung', date=2018-01-02 21:07:10.0, url='http://example.cn/activity/5a444c451f6ee91a25846ac1'},
Paper{id=2, author='chung', date=2018-01-02 21:07:33.0, url='http://example.cn/activity/5a444c451f6ee91a25846ac1'},
Paper{id=3, author='charle', date=2018-01-02 21:07:47.0, url='http://example.cn/activity/5a444c451f6ee91a25846ac1'}]

  你也许会问,大工程里面,这么复杂的逻辑,仅仅使用框架提供的能够满足特定需求吗。不要怕,忘了告诉你,更逆天的是,JPA也支持自定义的数据库操作甚至自定义SQL语句。举个例子如下,简简单单定义好方法之后,你就可以使用它来根据author查找所有满足条件的Paper了。特别要注意的是,这个类和方法的名字可不是随便起的,它们的名称必须遵循Spring Data JPA的命名规范,而关于这个命名规范,大家可以自行查阅资料,就不在此赘述了。

public interface PaperRepository extends JpaRepository<Paper, Integer> {List<Paper> findPapersByAuthor(String author);
}

  同样,我们来测试下,这么简单的定义了一个方法之后,是否真的能够如愿满足我们的需求:

@Test
public void findPapersByAuthor() throws Exception {List<Paper> byAuthor = paperRepository.findPapersByAuthor("chung");System.out.println(byAuthor.toString());
}

  可以从打印出的内容中很明显的看到,这一次只有两个author值为chung的记录,说明我们的写法是可以完成查询特定条件的内容的。

[Paper{id=1, author='chung', date=2018-01-02 21:07:10.0, url='http://example.cn/activity/5a444c451f6ee91a25846ac1'},
Paper{id=2, author='chung', date=2018-01-02 21:07:33.0, url='http://example.cn/activity/5a444c451f6ee91a25846ac1'}]

  以上我们只是简单地讨论了JPA的使用,其他的CURD操作,大家可以举一反三。实际上JPA的功能远不止如此,我们可以自己写实现类来自定义操作,也可以自己写SQL语句配合@Query来查询,基本上来说,只有你想不到,没有它办不到。是不是霸气侧漏?

事务管理简介

关于Service

  前面我们讨论了和前端打交道的控制器,也讨论了和数据库打交道的持久层,是时候讨论业务层了。与Controller类似,Service类,也有一个自己的注解,叫做@Service,配合我们曾编写过的PaperRepository,我们可以编写一个简单的Service Demo,其中使用到了PaperRepository的save(),这个方法也是框架为我们提供的,代码如下:

@Service
public class PaperService {@Resourceprivate PaperRepository paperRepository;public void savePaper() {Paper paper1 = new Paper(null, "Zhang", new Date(), "http://example.cn/activity/5a444c451f6ee91a25846ac1");paperRepository.save(paper1);Paper paper2 = new Paper(1, "ZhangChong", new Date(), "http://example.cn/activity/5a444c451f6ee91a25846ac1");paperRepository.save(paper2);}
}

  这个时候我们测试PaperServicesavePaper(),代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class PaperServiceTest {@Resourceprivate PaperService paperService;@Testpublic void savePaper() throws Exception {paperService.savePaper();}
}

  测试完成后可以发现,数据库内只增加了一条记录。没关系,还记得我们前面设计数据库的时候,特意将author字段长度设置为6,这里由于我们插入的第二个实体对象author字段超长不符要求,所以导致第二条数据插入失败了,但是这并不影响我们判断:框架为我们提供的save()确实可用,而且一般情况下,添加异常处理之后,简单的Service层代码这么写,是没有问题的。

关于事务管理

  很多时候,我们的业务层逻辑复杂,很多操作都需要在同一事务中进行,这个时候,@Transactional注解就派上了用场。
它可以配置事务传播特性,默认是REQUIRED@Transactional的使用也非常简单,你只需要在你的方法上加上这个注解便可:

@Service
public class PaperService {@Resourceprivate PaperRepository paperRepository;@Transactionalpublic void savePaper() {Paper paper1 = new Paper(null, "Zhang", new Date(), "http://example.cn/activity/5a444c451f6ee91a25846ac1");paperRepository.save(paper1);Paper paper2 = new Paper(1, "ZhangChong", new Date(), "http://example.cn/activity/5a444c451f6ee91a25846ac1");paperRepository.save(paper2);}
}

  依旧使用savePaper()测试方法,只不过这一次我们测试的方法添加了@Transactional注解。

Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'author' at row 1at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3971)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)at com.mysql.jdbc.ConnectionImpl.execSQL......

  测试完我们发现,这一次日志中报错了,错误信息为Data too long for column 'author' at row 1。我们再去数据库查看,发现并没有任何新增的记录。对比上一次的测试结果可以知道,@Transactional将我们的两次插入操作置于同一事务中,当第二条数据插入失败时,进行了回滚操作,所以数据库不会有新增的记录。

拓展进阶

表单验证

  在接口开发的过程中,我们经常需要对提交的各种表单数据进行验证,这个时候,我们可以借助@Valid注解来轻松达到目的。话不多说,我们直接来看。再次改造Paper实体类,在author字段上添加@Size(min = 1, max = 6),他为我们限定了author字段的长度为1-6,在url字段上添加@NotNull(message = "url不能为空"),它为我们限制了url不能为null,并定义了错误信息。

@Entity(name = "tbl_paper")
public class Paper {@Id@GeneratedValueprivate Integer id;@Size(min = 1, max = 6)private String author;private Date date;@NotNull(message = "url不能为空")private String url;/***省略NoArgsConstructor AllArgsConstructor***//***省略Getter Setter***//***省略Override toString***/
}

  接下来在控制器中,我们这么使用@Valid注解:

@RestController
public class DemoController {@Resourceprivate PaperService paperService;@PostMapping("/paper")public Object addPaper(@Valid Paper paper,BindingResult bindingResult) {if (bindingResult.hasErrors()) {return bindingResult.getFieldError().getDefaultMessage();} else {return paperService.savePaper(paper);}}
}

  以上@Valid伴随的BindingResult对象中,携带校验的各种信息。我们可以利用这个对象很方便的判定表单是否验证通过。让我们测试测试:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class DemoControllerTest {@Resourceprivate MockMvc mockMvc;@Testpublic void testAddPaper() throws Exception {mockMvc.perform(MockMvcRequestBuilders.post("/paper").param("author", "ZhangChong").param("date", String.valueOf(new Date())).param("url", "http://example.cn/activity/5a444c451f6ee91a25846ac1")).andDo(print()).andReturn();}
}

  从上面的测试代码中看到,我们故意调用接口插入一条不符规则的记录。然后从下面测试日志的Body = size must be between 1 and 6可以看出,提交的参数校验失败了,最后再去看看数据库,发现并没有成功添加记录。这一系列的现象或结果说明一个很简单的道理:@Valid为我们立下了汗马功劳,简化了我们各种判断与校验的工作。

MockHttpServletResponse:Status = 200
Error message = nullHeaders = {Content-Type=[text/plain;charset=UTF-8], Content-Length=[28]}Content type = text/plain;charset=UTF-8Body = size must be between 1 and 6
Forwarded URL = null
Redirected URL = nullCookies = []

天猫超市优惠地址

Java 校招面经合集相关推荐

  1. Java校招面试汇总

    Java校招面试汇总 一.JavaSE Ⅰ.基础知识 1.Java中引用数据类型有哪些,它们与基本数据类型有什么区别? 2.Java中的自动装箱与拆箱 3.==和equals()的区别 4.stati ...

  2. Java归去来第2集:利用Eclipse创建Maven Web项目

    一.前言 如果还不了解剧情,请返回第一集的剧情          Java归去来第1集:手动给Eclipse配置Maven环境 二.利用Eclipse创建Maven Web项目 选择File-New- ...

  3. Java接口对Hadoop集群的操作

    Java接口对Hadoop集群的操作 首先要有一个配置好的Hadoop集群 这里是我在SSM框架搭建的项目的测试类中实现的 一.windows下配置环境变量 下载文件并解压到C盘或者其他目录. 链接: ...

  4. Java API访问HDFS集群(HA)

    title: Java API访问HDFS集群(HA) date: 2021-06-23 17:06:11 tags: HDFS hadoopV2版本及以后都是HA架构,active namenode ...

  5. 2017一季度JAVA面试题锦集

    转载自 2017一季度JAVA面试题锦集 1.如何实现分布式事务,你们公司是怎么解决的? 2.HashMap数据结构及实现原理,其链表是用来解决什么问题的 3.可以自定义java.lang.Strin ...

  6. JAVA将ResultSet结果集遍历到List中

    今天在使用jstl标签展示查询结果时遇到一个小问题,即如何将ResultSet对象传递给前台页面. 在默认情况中我们在使用数据库查询时 public List selectDataFromJdbc() ...

  7. java校招面试题_java校招面试编程题及答案.docx

    java校招面试编程题及答案 java校招面试编程题及答案 Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点.这里,我列出了一些关于Java集合的重要问题和答案. 集合框 ...

  8. java访问oracle集群,JAVA查询Oracle数据库集群连接字符串

    下载必备最新排行装机分类.游戏手机驱动源码LinuxMac小游戏.商城招聘百科知道软件盒子论坛3G版 本站搜索 新闻资讯 软件下载 当前位置: 网站首页 > 编程开发 > 编程语言 > ...

  9. Java归去来第3集:Eclipse中给动态模块升级

    一.前言 如果还不了解剧情,请返回第2集的剧情          Java归去来第2集:利用Eclipse创建Maven Web项目 二.开始升级动态模块 2.1:查看原来的版本 我们先来看看Ecli ...

最新文章

  1. java 取上下文路径_取Servlet上下文路径,取WebContent的路径
  2. 3篇量子计算里程碑论文同登Nature封面:保真度超99%,达到实用化水平
  3. C、C++中的逻辑运算符
  4. Android的AlertDialog详解
  5. target evaluations
  6. grep从文件末尾开始找_新人自学前端到什么程度才能找工作?
  7. 从ASP.NET Boilerplate v5 +到ABP框架的迁移
  8. Apache POI操作Excel的坑
  9. Python(^^^^^小技巧^^^^^——不定期更新)
  10. Clickhouse分片集群性能测试
  11. Web服务客户端应用程序
  12. JQuery中$(document)、$(document).ready()是什么意思?
  13. Hadoop 3.1 2.x新特性之har归档
  14. 自我介绍与学习linux运维决心书
  15. 造车失败后投身机器人和AI,我笑戴森太疯癫,戴森笑我看不穿
  16. SAP之FIORI(5)-对话框与提示框
  17. 在 cfx-solver 的 monitor 中'normal force' 与 'tangential force' ,'normal momen' 与 'tangential moment' 意义
  18. 耗时一周整体,这4款黑科技电脑软件,功能强大到离谱
  19. 电子技术——MOS管的小信号模型
  20. Python计算海水密度(S,T,P)

热门文章

  1. Unity 处理大量GCAlloc
  2. AI让城市交通管理更“智慧”
  3. 累计增量备份策略_RMAN增量备份中的差异增量和累积增量
  4. 2012年第三届C B组蓝桥杯省赛真题
  5. 百亿数据分库分表核心流程详解
  6. 广西出土明清巨棺 渗出大量不明液体(组图)
  7. 师生共话:研究生论文写作时间管理
  8. RPKM 的解释、计算
  9. Maven 3.9.1下载安装配置一条龙(无压力)亲测
  10. “元宇宙”忽然爆火,上万亿资本大量涌入,最后肥了谁的口袋?