目录html
从SSM(spring spring MVC mybatis)到spring bootjava
本文前置知识点,spring, mybatis, tomcat等,这部分细节不在细讲mysql
spring是一个你们族,spring MVC, spring boot都是其中的一部分web
其中spring 提供了著名的IOC 和 AOPspring
IOC就是所谓控制反转,我要一个类,我不去本身new,而去拿一个,这样咱们就能够中框架的自动装配或者是xml配置下降耦合,提升效率。sql
AOP是面向切面编程,一种编程思路,咱们须要修改没写逻辑不去修改代码,而是添加执行该函数前作什么。减小对原代码的修改需求。数据库
spring MVC是一个web模块,在原来的SSM框架中,用户浏览器请求,交给spring MVC处理,返回页面。而如何处理,咱们单独出来一个业务层。这部分来写咱们的逻辑代码。apache
而业务层又但愿不用管数据库相关的问题,就多出了一个dao层,也就是数据可持久化层。编程
而spring boot视乎只是代替了原SSM层中 spring MVC的做用。他们对业务的抽象是同样的。浏览器
首先我须要准备
打开网站后填写信息,在右侧依赖添加
Web, DevTools, Aspects, Thymeleaf, Mysql, MyBatis
DevTools:热部署
Thymeleaf: 一种控制器数据交互方式
Mysql,MyBatis 数据库依赖
点击建立后,会自动下载一个包,用IDEA打开包里面的pom.xml便可打开项目
等待项目加载。。。
初始目录以下
cwl@cwl-PC:~/web/spring boot init$ tree . ├── mvnw ├── mvnw.cmd ├── pom.xml └── src ├── main │ ├── java │ │ └── com │ │ └── example │ │ └── demo │ │ └── DemoApplication.java │ └── resources │ ├── application.properties │ ├── static │ └── templates └── test └── java └── com └── example └── demo └── DemoApplicationTests.java 14 directories, 6 files
wenda数据库下的test表 +----------+----------+ | username | password | +----------+----------+ | cwl | cwl | +----------+----------+
最终咱们须要实现一个页面访问数据库的过程
用户发起浏览器请求页面,被咱们交给控制器处理
咱们添加项目结构文件夹
咱们在main.java.com.example.demo目录下建立四个文件夹
controller
dao
model
service
在main.resources下建立文件夹mapper后面放咱们的映射文件
controller是咱们的控制器,咱们在controller目录下建立一个类
MainController表明咱们的主页控制器
一个普通的类,咱们须要在类上面添加注解@Controller
而后编写一个方法,getMainWeb以下
MainController.java
package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MainController { @RequestMapping(path = "/", method = RequestMethod.GET) @ResponseBody public String getMainWeb() { return "main"; } }
@Controller表明咱们这是一个控制器
@RequestMapping(path = "/", method = RequestMethod.GET)
表明咱们浏览器访问“/"路径会被交给这个方法
@ResponseBody 表示返回的是字符串。也就是页面的字符串,
到这里咱们已经配置完页面了,都是因为咱们引入了数据库模块,可是咱们没有配置数据库,依旧跑步起来。因此咱们作先在appilcation.properties下填上一下内容,具体须要配置成你本地的参数
# mysql 配置 # 数据库配置 wenda是数据库的名字 spring.datasource.url=jdbc:mysql://localhost/wenda spring.datasource.username=root spring.datasource.password=1143316492 ## Mybatis 配置 # model要改为模型的包 # 映射的包 mybatis.typeAliasesPackage=com.webdemo.demo.model mybatis.mapperLocations=classpath:mapper/*.xml
数据库部分咱们先放一边,这么作只是为了框架不报错
这样运行项目输入localhost:8080 就能访问到一个只有”main“字符串的页面,咱们能够吧main换成html代码的字符串,当时这样未免太麻烦了。
因而:
咱们在resources目录下templates建立home.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Home</title> </head> <body> <h1>This is home pages</h1> </body> </html>
MainController.java
package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MainController { @RequestMapping(path = "/", method = RequestMethod.GET) //@ResponseBody public String getMainWeb() { return "home"; } }
注意上面咱们注释掉的部分,那部分的注释咱们是告诉框架咱们返回的是字符串,去掉后,框架就会去templates下面去找home文件。前缀后缀的具体细节能够在application.properties里面配置。
到这里咱们解决了Controller层的问题。
另外还有一些Controller层的细节
如何交互数据,这里咱们用的是thymeleaf模板的内容
package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MainController { @RequestMapping(path = "/", method = RequestMethod.GET) //@ResponseBody public String getMainWeb(Model model) { model.addAttribute("message", "this is main page"); return "home"; } }
咱们修改MainController的内容,注意咱们添加了一个参数列表,调用了一个addAttribute.这个意思是咱们加入了一个映射,在页面中咱们去message的值会编程后面那个字符串。具体怎么取,就是thymeleaf的定义了,咱们在html页面中修改
<h1 th:text="${message}"></h1>
这样控制层和页面的数据交互解决了。更多细节咱们去查那个框架便可。
数据访问层,dao层,有人人用mapper层,实际上是一个意思,为了方便,咱们演示的时候直接从控制层调用数据库部分
咱们添加模型类User数据,放在model文件夹下,类型根据咱们的数据库来,这部分是Mybatis的知识,这里不在赘述。
package com.example.demo.model; public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
在dao目录下咱们建立UserDao的接口
package com.example.demo.dao; import com.example.demo.model.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Repository; @Mapper @Repository public interface UserDao { @Select({"select username, password from test where username = #{name}"}) User getUserByUsername(String name); }
一些注解的说明
@Component ——表示一个自动扫描 component @Repository ——表示持久化层的 DAO component @Service ——表示业务逻辑层的 Service component @Controller ——表示表示层的 Controller component
@Mapper通过个人测试无效,不知道什么回事,若是只这样写会加载不到这个bean
另外一种解决方法是在入口处手动配置
package com.example.demo; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.example.demo.dao") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
上面的@MapperScan
而后在Controller层
package com.example.demo.controller; import com.example.demo.dao.UserDao; import com.example.demo.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class MainController { @Autowired UserDao userDao; @RequestMapping(path = "/", method = RequestMethod.GET) public String getMainWeb(Model model) { User user = userDao.getUserByUsername("cwl"); System.out.println(user.getUsername() + " " + user.getPassword()); return "home"; } }
上面的userDao是一个接口,可是咱们的框架会给咱们自动装载为bean
@Selcet替咱们实现方法,可是更复杂的部分须要用mapper手动写
咱们注释掉刚刚的@select
在mapper下添加xml,效果是同样的
<?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="com.example.demo.dao.UserDao"> <resultMap id="userResultMap" type="com.example.demo.model.User"> <result column="username" property="username" /> <result column="password" property="password" /> </resultMap> <select id="getUserByUsername" parameterType="com.example.demo.model.User" resultMap="userResultMap"> select * from test where username = #{name} </select> </mapper>
到这里咱们核心问题都解决了,上面咱们虽然经过controller调用dao层,可是核心已经出来了,添加业务中间层已经不是框架的问题了,不在细讲了。
最后项目结构
. ├── demo.iml ├── mvnw ├── mvnw.cmd ├── pom.xml ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── example │ │ │ └── demo │ │ │ ├── controller │ │ │ │ └── MainController.java │ │ │ ├── dao │ │ │ │ └── UserDao.java │ │ │ ├── DemoApplication.java │ │ │ ├── model │ │ │ │ └── User.java │ │ │ └── service │ │ └── resources │ │ ├── application.properties │ │ ├── mapper │ │ │ └── UserMapper.xml │ │ ├── static │ │ └── templates │ │ └── home.html │ └── test │ └── java │ └── com │ └── example │ └── demo │ └── DemoApplicationTests.java └── target ├── classes │ ├── application.properties │ ├── com │ │ └── example │ │ └── demo │ │ ├── controller │ │ │ └── MainController.class │ │ ├── dao │ │ │ └── UserDao.class │ │ ├── DemoApplication.class │ │ └── model │ │ └── User.class │ ├── mapper │ │ └── UserMapper.xml │ └── templates │ └── home.html ├── generated-sources │ └── annotations ├── generated-test-sources │ └── test-annotations └── test-classes └── com └── example └── demo └── DemoApplicationTests.class