大家好,我是编程小6,很高兴遇见你,有问题可以及时留言哦。
Springboot是现在学习Java开发必备的一个技术点。讲真,这是一个非常简单的东西,只要花一点时间都可以非常愉快的把他用起来。但是现在教程一般都是两种,一种是使用idea直接创建就开始用,导致感觉懂了,但是又有很多细节流失。另一种是先讲大篇原理,半天不入门,让很多初学者摸不到头脑。 所以我想从使用层面入手,但是不丢失细节的方式来带大家入门。
本节与SpringBoot无关,已经了解Maven父子关系的同学可以忽略本章
咱们刚才说了,SpringBoot是使用maven(注:也可以使用Gradle)的方式对Spring应用开发进行进一步的封装和简化。所以咱们在学习SpringBoot前需要学习Maven,而在练习前咱们会创建多个练习demo,因此,在这里需要先进行Maven父子模块讲解(已经了解Maven父子模块可以忽略本章)
springboot-parent
springboot-hello-01
主要是分析两个
pom.xml
中的内容
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--组id-->
<groupId>cn.itsource</groupId>
<!--模块名称-->
<artifactId>springboot-parent</artifactId>
<!-- packaging jar === 当前项目打成jar包 war === 当前项目打成war包 pom === 当前项目不写java代码,权代表用于管理jar包 maven-plugin === 当前项目用于开发插件使用(暂时不用管) -->
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!--父项目中管理的所有子项目模块-->
<modules>
<!--管理的子项目模块,注意名称和子模块名称保持一致-->
<module>springboot-hello-01</module>
</modules>
</project>
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 当前子模块的pom.xml中没有声音自己的版本与主id 通过parent 引入父模块中的内容(这里是继承关系) -->
<parent>
<artifactId>springboot-parent</artifactId>
<groupId>cn.itsource</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<!--子模块的名称-->
<artifactId>springboot-hello-01</artifactId>
</project>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
pom.xml
中添加依赖<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
@Controller
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/01")
@ResponseBody
public String hello01(){
return "hello springboot";
}
}
特别注意:启动类必需在外层
//申明我当前是一个SpringBoot的应用
@SpringBootApplication
public class ApplicationConfig {
public static void main(String[] args) {
// 注:这里传入的字段码对象,必需是声明了@SpringBootApplication的类
//启动SpringBoot程序
SpringApplication.run(ApplicationConfig.class);
}
}
spring-boot-starter-parent
spring-boot-starter-web
是什么意思?
spring-boot-starter-xxx
spring-boot-starter-web
内嵌了一个tomcat插件最简单,咱们平时开发时也就这样直接运行
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
注:打包运行必需要引入插件 咱们以后开发项目放到服务器中运行,就可以使用这种方式
java -jar springboot-hello-01-1.0-SNAPSHOT.jar
ctrl+f9
进行编译<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
resources
中properties的配置咱们以前都已经学过,这里简单看一下端口修改的配置即可
server.port=80
server.servlet.path=/haha
yml是一种更加优雅的配置方式(有层次结构),之后咱们都直接使用yml的方式来做配置
server:
port: 8088
servlet:
path: /haha
name: "zhangsan \n lisi":输出;zhangsan 换行 lisi
name: "zhangsan \n lisi":输出;zhangsan \n lisi
注:以后配置文件中可能还会写数组,集合等,后面的课程涉及到会单独讲解,大家也可以自行在网上进行查找
咱们以后可能会遇到一个项目多个环境(开发,测试,上线等),为不同的环境会写一些不同的配置,那么就需要咱们做相应的环境之间的切换
# 确定哪一个模块为活动模块
spring:
profiles:
active: pro
---
#开发模块
server:
port: 8088
spring:
profiles: dev
---
#测试模块
server:
port: 8089
spring:
profiles: test
---
#在线模块
server:
port: 8099
spring:
profiles: pro
springboot-test
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
@SpringBootApplication //声明这是一个springboot应用
public class ApplicationConfig {
public static void main(String[] args) {
SpringApplication.run(ApplicationConfig.class,args);
}
}
//创建一个bean
@Component
public class MyBean {
}
@RunWith(SpringRunner.class)
//代表这是一个SpringBoot的测试
// classes对应的类必需是经过SpringBootApplication修饰的类
@SpringBootTest(classes=ApplicationConfig.class)
public class MyBeanTest {
@Autowired
private MyBean myBean;
@Test
public void test01(){
System.out.println(myBean);
}
}
RestController
注解方式RestController
是一个组合注解 它等于 (@Controller
+@ResponseBody
)咱们创建一个新的模块进行测试,下面为核心代码(基础代码此处省略)
@RestController
@RequestMapping("/json")
public class JsonController {
//返回普通数据
@RequestMapping("/01")
public String json01(){
return "hello json";
}
//返回对象
@RequestMapping("/02")
public Employee json02(){
return new Employee(1L,"小春风");
}
//返回集合
@RequestMapping("/03")
public List<Employee> json03(){
return Arrays.asList(
new Employee(1L,"令狐兄"),
new Employee(2L,"不群兄"),
new Employee(3L,"我行兄")
);
}
//返回map
@RequestMapping("/04")
public Map json04(){
Map map = new HashMap();
map.put("name","小飞侠");
map.put("age",24);
map.put("sex",false);
return map;
}
}
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入thymeleaf的支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
classpath:/templates/
,后缀.html
spring:
thymeleaf:
prefix: classpath:/templates/
suffix: .html
@Controller
public class HelloController {
@RequestMapping("/hello")
public String index(Model model){
model.addAttribute("msg","hello,Springboot");
return "index";
}
}
注:加上
xmlns:th="http://www.thymeleaf.org"
则会支持thymeleaf的提示
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--使用语法th:text 可以设置里面的文本内容 -->
<div th:text="${msg}">你好啊!兄弟!!!</div>
</body>
</html>
注: 练习前先准备相应的数据库与表数据
导入:数据库驱动包,springboot与jdbc集成包,mybatis与springboot集成包,springboot的web支持包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--数据库驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--springboot与jdbc集成包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--mybatis提供的与springboot集成包 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
spring:
datasource:
username: root
password: root
url: jdbc:mysql:///mytest
driver-class-name: com.mysql.jdbc.Driver
##mybatis的配置
mybatis:
# 扫描相应的映射文件
mapper-locations: classpath:cn/itsource/mapper/*.xml
# 该包下的对象取别名
type-aliases-package: cn.itsource.domain
##日志级别的打印(需要看日志的可以直接拷备使用:特别注意它的层级)
logging:
level:
cn:
itsource: trace
root: error
@SpringBootApplication
//进行相应的映射接口扫描
@MapperScan("cn.itsource.mapper")
public class ApplicationConfig {
public static void main(String[] args) {
SpringApplication.run(ApplicationConfig.class);
}
}
public interface UserMapper {
List<User> findAll();
void save(User user);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.itsource.mapper.UserMapper">
<select id="findAll" resultType="User">
select * from user
</select>
<insert id="save" parameterType="User">
insert into user (username) values (#{username})
</insert>
</mapper>
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ApplicationConfig.class)
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void mytest(){
userMapper.findAll().forEach(user -> {
System.out.println(user);
});
}
}
注:Springboot已经集成事务,咱们可以直接使用
1.IUserService代码
public interface IUserService {
List<User> findAll();
void save(User user);
}
2.UserServiceImpl功能实现
@Service
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
public class UserServiceImpl implements IUserService {
@Autowired
private UserMapper mapper;
@Override
public List<User> findAll() {
return mapper.findAll();
}
@Override
@Transactional
public void save(User user) {
mapper.save(user);
int i = 1/0;
}
}
3.测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ApplicationConfig.class)
public class UserServiceTest {
@Autowired
private IUserService userService;
@Test
public void save(){
User user = new User();
user.setUsername("虎子xx");
userService.save(user);
}
@Test
public void findAll(){
userService.findAll().forEach(user -> {
System.out.println(user);
});
}
}
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService userService;
@RequestMapping("/findAll")
public List<User> findAll(){
return userService.findAll();
}
}