阅读 282

Spring MVC +Spring Boot + Mybatis项目整合

开发环境使用IDEA

  • 通过IDEA新建项目

在这里插入图片描述
点击下一步:
在这里插入图片描述
填写完成项目名之后点击下一步:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击下一步:
在这里插入图片描述
点击完成之后便开始创建项目了,项目的目录结构如下:
在这里插入图片描述
删掉一些不需要的文件夹,并在pom文件中添加我们需要的依赖: 添加mysql和mybatis的依赖:
在这里插入图片描述
删除掉reources文件夹下面暂时不需要的目录,新建mapper文件夹和mybatis-config.xml文件:

在这里插入图片描述
mybatis-config.xml文件文件中主要写一些java类型的别名:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias  alias="Integer" type="java.lang.Integer"/>
        <typeAlias alias="Long" type="java.lang.Long" />
        <typeAlias alias="HashMap" type="java.util.HashMap" />
        <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
        <typeAlias alias="ArrayList" type="java.util.ArrayList" />
        <typeAlias alias="LinkedList" type="java.util.LinkedList" />
    </typeAliases>
</configuration>
复制代码

之后进行application.properties文件配置,配置数据的连接信息和mybatis配置文件的位置:

在这里插入图片描述
相关代码:

#mysql
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/ssmdome
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

#mybatis的文件位置
mybatis.mapper-locations=classpath:mapper/*.xml
复制代码

之后在src文件夹下面建立相关目录,按照MVC的思想进行建立controller、model、dao、service文件夹,同时service文件夹下面要建立impl的文件夹:

在这里插入图片描述
这几层相关知识点的见解:

controller(控制器): 接受相关请求中转到相关的service层,并且负责返回处理之后的数据。

service(业务层): 业务控制层,在这一层里面可以进行一些一些业务逻辑的处理,并进行数据层的访问操作。

model(对象模型层): 数据对象的一种介质,类似以Entity或者Java Bean。

dao(数据持久层):负责与数据库进行一个联系等操作。

在Application启动类中要添加两个东西,dao层和model层的扫描:

在这里插入图片描述
在model层中新建类实体类User: 不需要写get、set和构造方法,使用lombok的@Data注解

package com.ssm.model;

import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;

@Data
public class User {

    private Integer id;

    private String name;

    private String password;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birth;

    private String gender;
    
    private String email;
}

复制代码

dao层中创建UserDao接口:

package com.ssm.dao;

import com.ssm.model.User;
import java.util.List;

public interface UserDao {

    List<User> selectAll();
    
}
复制代码

service中UserService接口:

package com.ssm.service;

import com.ssm.model.User;
import java.util.List;

public interface UserService {

    List<User> selectAll();
}

复制代码

service层下的impl中的UserServiceImpl类

package com.ssm.service.impl;

import com.ssm.dao.UserDao;
import com.ssm.model.User;
import com.ssm.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    @Resource
    private UserDao userDao;

    @Override
    public List<User> selectAll() {
        return userDao.selectAll();
    }
}
复制代码

controller层中UserController类:

package com.ssm.controller;

import com.ssm.model.User;
import com.ssm.service.UserService;
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;

import javax.annotation.Resource;
import java.util.List;

@Controller
public class UserController {

    @Resource
    private UserService userService;

    /**
     * 查询所有的用户
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "/selectAll", method = RequestMethod.GET)
    public List<User> selectAllUser(){
        List<User> users = userService.selectAll();
        return users;
    }

}

复制代码

mapper文件夹下面的UserMapper.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.ssm.dao.UserDao">
    <resultMap id="userInfoMap" type="com.ssm.model.User">
        <id property="id" column="id" jdbcType="INTEGER"/>
        <result property="name" column="username" jdbcType="VARCHAR"/>
        <result property="password" column="passowrd" jdbcType="VARCHAR"/>
        <result property="birth" column="birth" jdbcType="DATE"/>
        <result property="gender" column="gender" jdbcType="VARCHAR"/>
        <result property="email" column="email" jdbcType="VARCHAR"/>
    </resultMap>
    <sql id="columns">
        id,
        username,
        password,
        birth,
        gender,
        email
    </sql>
    <select id="selectAll" resultMap="userInfoMap">
        select
        <include refid="columns"/>
        from user
    </select>
</mapper>
复制代码

启动项目:

在这里插入图片描述
显示正常:

使用调用接口的工具进行接口的调用:

在这里插入图片描述
可以进行数据的查询,但是有个问题,一般数返回的格式没有这样搞的,因此对数据的返回格式进行封装:

新建一个util的包:

在这里插入图片描述
MessageEntity类:

package com.ssm.util;
import lombok.Data;

@Data
public class MessageEntity<T> {

    private Integer code;
    private String msg;
    private T data;
    private Integer total;

}
复制代码

MessageCode类:

package com.ssm.util;

public enum MessageCode {

    SYSTEM_CODE(500, "系统错误");

    private Integer code;
    private String message;

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    MessageCode(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

复制代码

ResultForma类:

package com.ssm.util;

public class ResultFormat {

    public static MessageEntity success() {
        return success(null);
    }

    public static <T> MessageEntity<T> success(T t){
        MessageEntity msg = new MessageEntity();
        msg.setCode(200);
        msg.setMsg("操作成功");
        msg.setData(t);
        return msg;
    }

    public static  MessageEntity error(MessageCode message) {
        MessageEntity msg = new MessageEntity();
        msg.setCode(message.getCode());
        msg.setMsg(message.getMessage());
        return msg;
    }
}
复制代码

UserController类中进行修改:

package com.ssm.controller;

import com.ssm.model.User;
import com.ssm.service.UserService;
import com.ssm.util.MessageCode;
import com.ssm.util.MessageEntity;
import com.ssm.util.ResultFormat;
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;

import javax.annotation.Resource;
import java.util.List;

@Controller
public class UserController {

    @Resource
    private UserService userService;

    /**
     * 查询所有的用户
     * @return
     */
    @ResponseBody
    @RequestMapping(value = "/selectAll", method = RequestMethod.GET)
    public MessageEntity selectAllUser(){
        List<User> users = userService.selectAll();
        if(users.size() > 0){
            return ResultFormat.success(users);
        }else{
            return ResultFormat.error(MessageCode.SYSTEM_CODE);
        }
    }

}

复制代码

接口调用结果如下:

在这里插入图片描述

在前后端的分离的项目开发中需要解决的问题是:跨域(CORS方式)

新加一个包进行跨域操作

在这里插入图片描述
SimpleCORSFilter类:

package com.ssm.filter;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class SimpleCORSFilter {

    private CorsConfiguration buildConfig(){
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址
        corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
        corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法
        return corsConfiguration;
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", buildConfig()); // 4 对接口配置跨域设置
        return new CorsFilter(source);
    }

}

复制代码