SpringBoot是默认整合了Spring、SpringMVC及相关常用框架的一个综合性框架,大量的减少了相关的配置,使得创建项目和使用变得更加简单。在常规配置方面,SpringBoot的思想是“约定大于配置”,即:大多数开发者都会使用某种配置方式的话,则SpringBoot就会直接配置成那个样子,然后,开发者在使用SpringBoot时就不用再进行相关配置,只需要知道已经被配置为那个样子了就可以了!
1.打开浏览器,访问 https://start.spring.io,并填写相关配置,可以同时选择相关依赖,配置完成后,点击【Generate the project】即可生成项目
2.项目下载结束后,将其放在eclipse工作空间中,并导入,注意,此处导入为【Existing Maven Projects】
3.导入成功后,初始项目结构如下图
此时需要等待其下载所需要的maven配置,因此此时电脑必须能正常连接maven服务器,依赖下载结束后,项目结构正常。
在【src/main/resources】下默认已经存在【static】的文件夹,该文件是SpringBoot项目用于存放静态资源的文件夹,例如存放【html】文件、图片、【CSS】文件、【JS】文件等,相当于传统项目中的webapp文件夹,则可以在static创建【index.html】欢迎页面。
在src/main/java下默认已经存在【cn.hzxh.spring.sample
】包,该包名是根据创建项目时的参数决定的,这个包就是当前项目的根包(Base-Package),并且在该包下已经存在【SampleApplication.java
】文件,该文件的名称也是根据创建项目时填写的artifact决定的,该文件中包含【main
】方法,直接执行main()
方法就可以启动当前项目,所以,该类也是SpringBoot的启动类!
SpringBoot项目在启动时会启动内置的Tomcat,默认占用【8080】端口,如果此前该端口已经处于占用状态,则项目会启动失败!通过【http://localhost:8080
】即可访问所涉及的网页,由于SpringBoot项目内置Tomcat,该Tomcat只为当前项目服务,所以启动时设置的Context Path是空字符串,在访问时URL中不必添加项目名称,而index.html是默认的欢迎页面,其文件名也不必体现在URL中。
启动成功,访问主页
SpringBoot项目默认没有集成持久层相关依赖,需要手动补充,或者创建项目时就选中。手动添加,打开【pom.xml】文件,添加依赖坐标。
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.0
mysql
mysql-connector-java
runtime
关于依赖版本号,一般依赖的版本更新我们都说是不知道有什么区别的,SpringBoot会选择一个较为合适的依赖,添加至项目中,无其他情况,我们直接使用提供的依赖即可。
当添加以上依赖之后,SpringBoot项目再启动时就会尝试读取连接数据库的相关配置,如果还没有配置,则会启动失败!
在src/main/resources下有application.properties,该文件就是SpringBoot的配置文件,在该文件中添加配置:
spring.datasource.url=jdbc:mysql://localhost:3306/db_ums?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
需要注意的是,此文件配置结束后,SpringBoot并不会按照配置信息进行连接,只是读取该文件,检查是否有相关配置,也就意味着,即使配置错误,项目启动也并不会失败,具体错误会在后面的单元测试中体现。
一般情况下,不需要配置连接数据库的driverClassName,因为SpringBoot会自动从jar中读取!
在src/test/java下,默认已经存在项目的根包及测试类,且测试类中已经存在一个空的测试方法:
可以先执行以上contextLoads()
方法的单元测试,如果测试出错,一定是测试环境或者框架环境有问题,多考虑为jar包已经损坏,应该重新下载或者更换版本!
在该类中添加【getConnection】方法,用于测试数据库连接
@Autowired
private DataSource dataSource;
@Test
public void getConnection() throws SQLException {
Connection conn = dataSource.getConnection();
System.err.println(conn);
}
【@Autowired】注解会自动将值注入对应的对象中,如果此单元测试通过,则数据库连接配置文件配置正确。
先创建与数据表对应的实体类cn.hzxh.springboot.sample.entity.User
:
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private Integer id;
private String username;
private String password;
private Integer age;
private String phone;
private String email;
private Integer isDelete;
private Integer departmentId;
//SET/GET/ToString...
}
然后,创建持久层接口cn.tedu.springboot.sample.mapper.UserMapper
可以在每一个抽象方法之前使用注解配置所对应的SQL语句,例如:
public interface UserMapper {
@Insert("insert into t_user ("
+ "username,password,"age,address,"email,department"
+ ") values ("
+ "#{username},#{password},#{age},#{address},#{email},#{department})")
@Options(useGeneratedKeys=true,keyProperty="id")
Integer insert(User user);
User findByUsername(String username);
}
这种做法是MyBatis本身就支持的,并不是SpringBoot所特有的!这种做法最大的优点在于:对应关系非常直观。主要的缺陷在于:配置长篇的SQL语句时,代码不易于阅读和维护!所以,一般仍然推荐使用XML配置映射的SQL语句!
为了保证MyBatis框架能确定接口文件的位置,可以在接口的声明之前添加【@Mapper
】注解,不过,这样的做法就要求每一个持久层接口之前都需要添加该注解,也可以在启动类【SampleApplication
】之前添加【@MapperScan
】注解进行配置,则后续只需要把持久层接口都放在这个包中就可以了,无需反复添加注解:
@SpringBootApplication
@MapperScan("cn.hzxh.springboot.sample.mapper")
public class SampleApplication {
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
}
}
与此前一样,在【src/main/resources】下创建名为【mappers】的文件夹,然后使用【UserMapper.xml】进行配置。
INSERT INTO t_user (
username, password,
age, phone,
email, is_delete,
department_id
) VALUES (
#{username}, #{password},
#{age}, #{phone},
#{email}, #{isDelete},
#{departmentId}
)
另外,还需要配置XML文件的位置,则打开【application.properties】文件添加配置:
mybatis.mapper-locations=classpath:mappers/*.xml
在【src/test/java】下创建【cn.hzxh.springboot.sample.mapper.UserMapperTests
】单元测试类,将默认存在的【SampleApplicationTests
】类之前的2行注解复制到【UserMapperTest
】类之前:
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTests {
//凡是在SSM中,能通过getBean的方式获取的对象,SpringBoot中都可以通过添加此注解来实现自动装配
@Autowired
private UserMapper userMapper;
@Test
public void insert() {
User user = new User();
user.setUsername("SpringBoot");
user.setPassword("root");
Integer rows = userMapper.insert(user);
System.err.println("rows:" + rows);
}
@Test
public void findByUsername() {
String username = "SpringBoot";
User user = userMapper.findByUsername(username);
System.err.println("user:" + user);
}
}
创建控制器处理请求后的返回结果对象的类型【cn.hzxh.springboot.sample.util.JsonResult
】
public class JsonResult {
private Integer state;
private String message;
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
创建【cn.hzxh.springboot.sample.controller.UserController
】控制器类
/**
* 使用@RestController相当于@Controller和@ResponseBody的组合使用方式
* 当使用了@RestController时,该控制器类中所有处理请求的方法都是相当于添加了@ResponseBody注解的!
* 一旦使用了该注解,该控制器类中的方法将不可以转发或者重定向,
* 如果一定要转发或者重定向,必须使用ModelAndView作为处理请求的方法的返回值!
*/
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserMapper userMapper;
//在SpringBoot项目中,默认已经将DispatcherServlet映射的路径配置为/*,即所有请求,无需写reg.do
@RequestMapping("reg")
public JsonResult reg(User user) {
JsonResult js = new JsonResult();
User u = userMapper.findByUsername(user.getUsername());
if(u != null) {//该用户已经被注册
js.setState(1);
js.setMessage("注册失败,该用户已经被注册");
}else {//可以注册,执行注册
userMapper.insert(user);
js.setState(2);
js.setMessage("注册成功");
}
return js;
}
}
SpringBoot项目不需要开发者配置组件扫描,它默认的组件扫描就是项目的根包,即【cn.hzxh.springboot.sample
】包,当前项目中所有的组件都必须在这个包或者其子包下!
完成后,通过启动类启动项目,打开浏览器,输入以下内容进行测试。
http://localhost:8080/user/reg?username=junit&password=1234
用户注册
测试通过