【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
**开源地址:https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB **
<context:component-scan base-package=“com.sangeng”>
<context:exclude-filter type=“annotation” expression=“org.springframework.stereotype.Controller”></context:exclude-filter>
</context:component-scan>
<context:property-placeholder location=“classpath:jdbc.properties”></context:property-placeholder>
aop:aspectj-autoproxy</aop:aspectj-autoproxy>
<tx:annotation-driven transaction-manager=“transactionManager”></tx:annotation-driven>
- 这里 mapper 扫描配置的是扫描 com.sangeng.dao 这个包,所以我们新建 dao 包
- 在resources目录下创建jdbc.properties 文件,内容如下:
jdbc.url=jdbc:mysql://localhost:3306/mybatis_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=123456
- 在resources目录下创建mybatis-config.xml ,内容如下:
- 配置里面为 com.sangeng.domain 包配置了别名,所以我们在 com.sangeng 下建一个 domain 包
- 在resources目录下创建log4j.properties ,内容如下:
#将等级为DEBUG的日志信息输出到stdout,stdout定义在下面的代码
log4j.rootLogger=debug, stdout
#控制台输出的相关设置
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
#文件输出的相关设置
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=./log/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
②SpringMVC引入
- 在resources目录下创建spring-mvc.xml ,内容如下:
<beans xmlns=“http://www.springframework.org/schema/beans”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xmlns:context=“http://www.springframework.org/schema/context”
xmlns:mvc=“http://www.springframework.org/schema/mvc”
xsi:schemaLocation=“http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd”>
<context:component-scan base-package=“com.sangeng.controller”/>
mvc:default-servlet-handler/
mvc:annotation-driven
mvc:message-converters
</mvc:message-converters>
</mvc:annotation-driven>
- 上方配置了 SpringMVC 扫描 controller包 ,所以我们要在 sangeng 下新建包 controller
- 最后修改web.xml文件
<web-app xmlns=“http://xmlns.jcp.org/xml/ns/javaee”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd”
version=“4.0”>
DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
DispatcherServlet
/
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
CharacterEncodingFilter
/*
③Spring整合入web项目
让web项目启动的时候就能够创建Spring容器。可以使用Spring提供的监听器ContextLoaderListener,所以我们需要再 web.xml 中配置这个监听器,并且配置上Spring配置文件的路径。
contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener
这样我们的SSM整合配置层面就已经完成了,接下来我们编写测试
我们来编写根据id查询用户的接口来进行测试
先有 Controller,请求过来被 Controller 里面的 Handler 所处理,在 Handler中 通过 Service 处理,Service 内部又会依赖 dao 去进行数据库的查询,dao 是使用 Mybatis 的写法
所以我们先写 Controller, 再写Service接口,实现Service接口中的方法,并且在Service实现类中注入dao,再去写dao,再去写对应的xml映射文件
1.4.1、编写实体类domain
- com.sangeng.domain.User.java 代码如下
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
// 这里的属性和我们数据库的属性是一一对应的
private Integer id;
private String username;
private Integer age;
private String address;
}
1.4.2、编写Service
- com.sangeng.service.UserService 接口 ,代码如下
public interface UserService {
User findById(Integer id);
}
- com.sangeng.service.impl.UserServiceImpl 实现类代码如下
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public User findById(Integer id) {
return userDao.findById(id);
}
}
-
@Service
注解使用在Service层类上用于实例化Bean,设置该类为spring管理的bean -
@Autowired
注解使用在字段上上用于根据类型依赖注入,为了从Spring容器中获得此对象
1.4.3、编写dao
- com.sangeng.dao.UserDao接口,代码如下
public interface UserDao {
/**
-
根据id查询用户
-
@param id
-
@return
*/
User findById(Integer id);
}
- 针对接口生成对应的 mapper 映射文件,resources -> 右键 -> new Directory 生成对应的 mapper 目录
- 插件的存在可以帮我们一键生成 mapper.xml 映射文件,alt+回车 ,选择插件
- 选择 mapper.xml 生成的位置
- 之后继续在方法上 alt + 回车
- 这样我们只需要在生成的 mapper.xml 中写 sql 语句即可
- 所以 resources/com/sangeng/dao/UserDao.xml 代码如下:
select * from user where id = #{id}
1.4.4、1.4.4、编写Controller
需求:根据 id 去查询用户
-
Controller 是没法查询数据库的,需要依赖 service,所以需要先创建 service接口和实现类
-
service 实现类需要依赖 dao 层去查询数据库
-
dao 是用 mybatis 来查询数据库的操作
- 所以 com.sangeng.controller.UserController ,代码如下:
// @Controller + @ResponseBody = @RestController
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping(“/user/{id}”)
public User findById(@PathVariable Integer id){
User user = userService.findById(id);
return user;
}
}
-
加
@Controller
注解使用在web层类上用于实例化Bean,设置该类为springMVC管理的bean -
加
@ResponseBody
注解把返回值转换成 Json 格式放到响应体中。 -
@Controller
+@ResponseBody
=@RestController
-
加
@RequestMapping
注解是为了设置请求路径 -
加
@Autowired
注解使用在字段上上用于根据类型依赖注入,为了从Spring容器中获得此对象 -
加
@PathVariable
注解是获取请求路径的参数 -
最后我们在 pom.xml 中配置一下 tomcat插件
org.apache.tomcat.maven
tomcat7-maven-plugin
2.1
80
utf-8
访问测试:
当然我们也可以不配置 tomcat 插件,而是将 tomcat 集成到 IDEA 中启动
======================================================================
我们要保证一个项目中所有接口返回的数据格式的统一。这样无论是前端还是移动端开发获取到我们的数据后都能更方便的进行统一处理。我们这里是将所有的数据格式统一为 json 格式。
所以我们定义以下结果封装类 ResponseResult,由于格式统一是公用的,所以我们可以在 com.sangeng 下创建一个公共 common 包,在包下创建结果封装类 ResponseResult
@JsonInclude(JsonInclude.Include.NON_NULL)
注解表示如果某个属性的值不为NULL,才会将其转化为Json格式
// 加上此注解,如果某个属性的值不为NULL,才会将其转化为Json格式
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseResult {
/**
- 状态码
*/
private Integer code;
/**
- 提示信息,如果有错误时,前端可以获取该字段进行提示
*/
private String msg;
/**
- 查询到的结果数据(不同接口查询的类型不一样,所以我们可以设为泛型)
*/
private T data;
// 三个参数的有参构造(查询操作需要返回查询的数据data)
public ResponseResult(Integer code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
// 两个参数的有参构造(状态码和提示信息)
public ResponseResult(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
// 两个参数的有参构造(状态码和数据)
public ResponseResult(Integer code, T data) {
this.code = code;
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
所以我们将之前的 controller 查询 id 为1返回的查询数据进行封装,修改代码如下 :
- 返回类型为我们封装的结果集 ResponseResult 类型
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping(“/user/{id}”)
public ResponseResult findById(@PathVariable(“id”) Integer id){
User user = userService.findById(id);
if(user==null){
//说明没有对应的用户
return new ResponseResult(500,“没有该用户”);
}
return new ResponseResult(200,“操作成功”,user);
}
}
访问测试:
- tomcat 插件启动展示:
- IDEA 集成 tomcat 展示:
- 在Controller层调用Service中的方法
@RestController
public class UserController {
@Autowired
private UserService userService;
// 查询所有用户
@GetMapping(“/user”)
public ResponseResult findAll(){
List list = userService.findAll();
return new ResponseResult(200,“操作成功”,list);
}
}
- Service接口如下
public interface UserService {
// 根据 id 查询用户
User findById(Integer id);
// 查询所有用户
List findAll();
}
- 在Service实现类中调用dao中的方法
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
//省略其他无关代码
public List findAll() {
return userDao.findAll();
}
}
- dao层接口如下:
public interface UserDao {
// 查询所有用户
List findAll();
}
- dao层利用插件生成 mapper.xml 文件如下
select * from user
tomcat 插件启动展示:
IDEA 集成 tomcat 展示:
分页查询的结果除了要包含查到的用户数据外还要有当前页数,每页条数,总记录数这些分页数据。
所以我们在 common 包下新建分页封装类 PageResult,代码如下:
public class PageResult {
// 当前页数
private Integer currentPage;
// 每页条数
private Integer pageSize;
// 总记录数
private Integer total;
// 分页数据
private List data;
public PageResult(Integer currentPage, Integer pageSize, Integer total, List data) {
this.currentPage = currentPage;
this.pageSize = pageSize;
this.total = total;
this.data = data;
}
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public List getData() {
return data;
}
public void setData(List data) {
this.data = data;
}
}
- 编写Controller类,调用Service层的方法
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping(“/user/{pageSize}/{pageNum}”)
public ResponseResult findByPage(@PathVariable(“pageSize”) Integer pageSize,@PathVariable(“pageNum”) Integer pageNum){
PageResult pageResult = userService.findByPage(pageSize,pageNum);
return new ResponseResult(200,“操作成功”,pageResult);
}
}
- 编写Service实现类,调用Dao层的方法
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public PageResult findByPage(Integer pageSize, Integer pageNum) {
PageHelper.startPage(pageNum,pageSize);
List list = userDao.findAll();
PageInfo pageInfo = new PageInfo(list);
PageResult pageResult = new PageResult(pageInfo.getPageNum(),pageInfo.getPageSize(), (int) pageInfo.getTotal(),list);
return pageResult;
}
}
①编写 Controller 层,调用 service 层方法
- 我们是在请求体中传入Json格式的数据,
@RequestBody
注解可以获取请求体中的数据
// 插入用Post请求
@PostMapping(“/user”)
public ResponseResult insertUser(@RequestBody User user){
userService.insertUser(user);
return new ResponseResult(200,“操作成功”);
}
②编写 Service 层,在 service 实现类中调用 dao 方法
- 在Service接口中增加方法定义
void insertUser(User user);
- 实现类中实现该方法:
public void insertUser(User user) {
userDao.insertUser(user);
}
③编写 Dao 层,使用插件生成 mapper.xml 映射文件
- 在接口中定义方法
void insertUser(User user);
- 在mapper映射文件中