本篇的目标是介绍使用 spring boot + mybatis-plus + freemarker + lombok实现一个三层架构例子
先说明一下用到的组件:
mybatis-plus是mybatis为了配合spring-boot官方出的一个版本
freemarker是现在较为流行的一种面向开发者的前端展示框架,这里要特别说明它是不面向用户的,编写SSM的时候我们前端一般用的jsp,但是有一个问题,对于JAVA-Web开发者来说,写jsp意味着要注意很多东西,比如web.xml、jsp标签约束等等一度繁重的东西,且就算写jsp,也只是为了测试后台返回的结果,真正用在项目上时前端是专门的前端开发工程师负责,作为后端只需要配合前端提供后台支持就行,这样一来jsp对于java工程师来说就成了一种负担,而freemarker就解决了这一问题,它不需要复杂配置,更是提供了相对便捷的标签,使得我们很轻松的达到测试目的,同时对于开发人员来说其本身也是代替了spring mvc
lombok是一个类的特殊方法生成插件,在SSM时我们要对不同的类做很多重复的操作,比如对bean实体生成getter、setter方法等,而lombok插件为我们免除了这一过程,它帮助我们以注解的方式,代替这类重复的代码
现在我们开始写代码
第一步:首先需要新建一个项目,因为上面的插件需要一些配置支持
勾选web支持
勾选freemarker支持
第二步:pom文件中添加如下依赖
org.projectlombok
lombok
true
com.baomidou
mybatis-plus-boot-starter
3.3.2
mysql
mysql-connector-java
com.baomidou
mybatis-plus-generator
3.3.2
org.apache.velocity
velocity-engine-core
2.2
org.freemarker
freemarker
2.3.30
添加后大家可以回过头注意一下你当前的pom,你会发现比较与知识点1少了一个spring-boot-starter这个是因为当你选择web支持后spring-boot-starter-web会通过依赖传递默认导入spring-boot-starter不需要在pom中体现,这和知识点1中提到的spring boot内嵌了web服务器有关。
第三步:建立三层架构需要的包
com.wy.scjg.bean com.wy.scjg.controller com.wy.scjg.service com.wy.scjg.mapper
第四步:配置spring boot配置文件
#服务的端口号
server.port=91
#服务的访问地址
#server.servlet.context-path=/helloboot
#数据库驱动程序,如果你使用的驱动是包括5.1以及之前的就使用com.mysql.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库的连接地址
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=UTF8&userSSL=false&serverTimezone=GMT%2B8
#数据库的用户名
spring.datasource.username=root
#数据库的密码
spring.datasource.password=123456
#数据库类型
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
#打印sql语句
#日志配置
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#配置文件读取的位置
mybatis-plus.mapper-locations=classpath:mappers
private Long id;
private String name;
private Integer age;
private String email;
}
这里解释一下三个用到的lombok插件注解,Data为该类提供get、set方法,EqualsAndHashCode为该类提供equals和hashCode比较方法,callSuper 参数默认false时表示比较方法所用的属性来自于当前类本身,而非父类,Accessors是对生成的get、set方法做必要的空值,chain默认false时表示get、set方法是无返回值的,反之则返回当前对象
第七步:Dao层,既Mapper层开发对应的User数据接口,并在mappers文件下准备对应的xml
package com.wy.scjg.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.wy.scjg.bean.User; public interface UserMapper extends BaseMapper{ }
对应的mapper.xml文件
Dao层开发,一定要记得在spring boot的启动类中添加一个MapperScan注解,因为启动类会扫描子包,但是Dao层的构成由于没有注解所以不会生成spring的bean实例,所以需要另外告诉spring boot框架Dao层的包在哪里,这就跟SSM也需要特别配置Dao一样,不过spring boot将步骤缩减到只需要告诉他Dao层的接口在哪里就行,如下
package com.wy.scjg;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@MapperScan("com.wy.scjg.mapper")
public class ScjgApplication {
public static void main(String[] args) {
SpringApplication.run(ScjgApplication.class, args);
}
}
第八步:service层开发对应的UserService和实现类,并注入Dao层对象
package com.wy.scjg.service; import com.baomidou.mybatisplus.extension.service.IService; import com.wy.scjg.bean.User; public interface UserService extends IService{ }
对应的实现类
package com.wy.scjg.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.wy.scjg.bean.User; import com.wy.scjg.mapper.UserMapper; import com.wy.scjg.service.UserService; import org.springframework.stereotype.Service; @Service public class UserServiceImpl extends ServiceImplimplements UserService { }
第九步:controller层开发控制器
package com.wy.scjg.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wy.scjg.bean.User;
import com.wy.scjg.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/list")
public String list(HttpServletRequest request, @RequestParam(defaultValue = "1") long current, @RequestParam(defaultValue = "3") long size, User user){
//创建分页对象
Page page =new Page<>(current,size);
//创建查询条件对象
QueryWrapper wrapper = new QueryWrapper<>();
//执行分页查询
IPage pageInfo = userService.page(page, wrapper);
//存储到request中
request.setAttribute("pageInfo",pageInfo);
return "/user_list";//注意最后一步是返回到测试界面,且不用任何后缀
}
}
开发controller层,如果用到了mybatisplus自带的分页,一定要再启动类里实例化分页的配置类,如下
package com.wy.scjg;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@MapperScan("com.wy.scjg.mapper")
public class ScjgApplication {
public static void main(String[] args) {
SpringApplication.run(ScjgApplication.class, args);
}
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
}
第十步:开发freemarker插件的测试页面
欢迎进入user用户列表
| 序号 | 名称 | 年龄 | 邮箱 | 操作 | |||||
|---|---|---|---|---|---|---|---|---|---|
| ${user.id} | ${user.name!""} | ${user.age!""} | ${user.email!""} | 详情 修改 删除 | |||||
| 首页 上一页 下一页 尾页 | |||||||||
第十一步:启动程序,测试效果
最后说一下,在service和Dao层中我任何方法都没有写,但是却可以出现列表效果,这个是因为Service和Dao继承的父类中有自带的方法,并且在继承时进行了注入以及泛型了操作数据返回的类型User,所以初学阶段不要为了没有写代码,但出现了效果这个事费解,本篇大家知道SSM增删改查那一套,在spring boot里怎么操作流程是什么就可以了,详细的后面会说



