使用intellij idea创建springboot项目

首先建议参考如文章以及各种网络教程

如果头铁想看笔者所写,就要做好翻车的准备(笔者老cv大师了)

新建一个项目,选择Spring Initializr(demo_back是我起的名字

项目架构前后端图片react_mybatis

选择依赖(感觉Thymeleaf不要也罢,JDBC API好像也没用到,算啦,宁滥毋缺吧)

项目架构前后端图片react_java_02

项目架构前后端图片react_mysql_03

新建完成后,耐心等一会maven的下载(虽然我用了很多次maven了,但依然浑浑噩噩,果然该去学一学了)

(不知为何今天格外慢,明明都在本地仓库的说)

项目架构前后端图片react_项目架构前后端图片react_04

解析下载完以后看看右边的maven,基本是能导包的,如果没有,点一下重新加载(左上角的刷新按钮

项目架构前后端图片react_java_05

然后打开application.properties写入数据库配置和端口配置(这里我重构为了yml,因为好写)

项目架构前后端图片react_项目架构前后端图片react_06

这里我把项目的运行端口设置为了8081,因为我前端vue项目是在8080运行的,总之是不冲突即可

spring:
  datasource:
    name: demo  #数据库名
    url: jdbc:mysql://localhost:3306/demo?serverTimezone=GMT%2B8 #url,这个serverTimezone可能报错可能不报错,比较随缘,我碰到的需要加上的情况多
    username: root  #用户名
    password: 123456  #密码,记得改成自己的
    driver-class-name: com.mysql.cj.jdbc.Driver  #数据库链接驱动,一般就是这个

server:
  port: 8081
  servlet:
    context-path: /

这里就不过家家式写个hello world了,没啥必要,开始连接数据库

点击右边的数据库,点击新建,这里以mysql为例是因为笔者只用过mysql

项目架构前后端图片react_mybatis_07

填写用户名和密码,以及自己的数据库名字(demo是我建的数据库名,character set建议采用utf8),然后测试连接,通过就ok了

serverTimezone也是有人要加有人不要,我是要加的,不然会测试连接报错

项目架构前后端图片react_mybatis_08

附上数据库:(工具使用navicat)

项目架构前后端图片react_mysql_09

能看到库的内容就成功

项目架构前后端图片react_项目架构前后端图片react_10

mybatis逆向生成实体类和mapper

导语:哎,我就头铁,我就非得用自动生成,感谢这篇文章的作者

把放实体类和mapper的包建立起来,我的目录如下:

其中软件包entity和mapper是放在项目目录下的,放mapper类的xml文件的mapper目录一定要放在resources下

项目架构前后端图片react_mysql_11

其中entity放生成的实体类文件,mapper类放生成的mapper类文件,而resources里面的mapper是放的各种xxxMapper.xml文件

第一件事呢,就是在application.yml里面加入配置(忘了直接gg)

mybatis:
  mapper-locations: classpath:mapper/*.xml  #配置映射文件
  type-aliases-package: com/example/demo/entity #配置实体类

然后开始搞这个鬼插件,先在pom.xml里面写入依赖

<!--mybatis自动生成-->
<dependency>
  <groupId>org.mybatis.generator</groupId>
  <artifactId>mybatis-generator-core</artifactId>
  <version>1.3.7</version>
</dependency>

题外话:如果spring-boot-starter-parent的依赖爆红,可以考虑把version 2.5.3改成2.5.2(我反正就很倒霉的红了)

新建一个mybatis-generator.xml

项目架构前后端图片react_项目架构前后端图片react_12

把这一大段给复制进去(可以参考上面博主的文章

别害怕,主要需要修改:

1.数据库的用户名和密码

2.生成的文件的包名(路径至少idea可以自动联想,基本不会配置错)

3.要生成的数据表的名字和对应的实体类名字

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <!-- 数据库驱动 -->
    <context id="DB2tables" targetRuntime="MyBatis3">

        <!-- 去掉生成出来的代码的注解 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
            <property name="suppressDate" value="true" />
        </commentGenerator>

        <!--数据库链接URL,用户名、密码 -->
<!--        记得修改!!!!!!-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/demo?serverTimezone=UTC" userId="root" password="123456">
            <property name="nullCatalogMeansCurrent" value="true" />
        </jdbcConnection>

        <!--类型解析-->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- 生成实体类和example类的包名和位置 -->
        <!--        记得修改!!!!!!-->

        <javaModelGenerator targetPackage="com.example.demo_back.entity" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <!--从数据库返回的值去除前后空格-->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!-- 生成映射文件的包名和位置 -->
        <!--        记得修改!!!!!!-->

        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>

        <!-- 生成mapper类的包名和位置 -->
        <!--        记得修改!!!!!!-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.demo_back.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名 要生成哪个表就写哪个 -->
        <!--        记得修改!!!!!!-->
        <table tableName="user" domainObjectName="User" />
    </context>
</generatorConfiguration>

注:如果这个连接显示URI未注册,可以把点击这个红连接,然后出现个红灯泡,然后获取外部资源,就好了

项目架构前后端图片react_spring boot_13

然后去pom.xml,在<plugins></plugins>里面添加插件的位置(原理不多赘述,好像还是和扫描有关,笔者是个不求甚解的人

<plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>

                <configuration>
                    <configurationFile>${basedir}/src/main/resources/mybatis-generator.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
<!--                mysql驱动有可能版本爆红,自己用的啥版本配置啥-->
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>8.0.22</version>
                        <scope>runtime</scope>
                    </dependency>
                </dependencies>
            </plugin>

刷新一下maven,然后双击这个新插件

项目架构前后端图片react_mybatis_14

出现build success就可以了,真刺激

项目架构前后端图片react_mysql_15

看一下工程目录,就能发现有了新文件

项目架构前后端图片react_项目架构前后端图片react_16

注意:如果改了库需要重新生成某张表的各类文件,最好(应该是必须)把这张表对应的mapper.xml文件删了重新生成,不然会重复写入报错。(比如我改了user表的内容,我就把UserMapper.xml删掉,其他的不用管直接就覆盖了)

编写后端逻辑

杂七杂八的事情搞好了,就要开始正经写后端接口了(我也不知道是不是叫接口)

这里采取自底向上的方式建立

先建立service包和UserService类

package com.example.demo_back.service;

public interface UserService
{
    boolean validateUser(String userName,String password);
}

然后在serviceImpl包里写对应的实现类

注意:

1.@Service("UserServiceImpl")需要写上,不然后面controller无法注入

2.mapper类均用@Resource注解注入,且不能实例化(实例化会出现一堆玩意

example类的用法建议找网上各种教程,反正挺方便的

package com.example.demo_back.serviceImpl;

import com.example.demo_back.entity.UserExample;
import com.example.demo_back.mapper.UserMapper;
import com.example.demo_back.service.UserService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service("UserServiceImpl")
public class UserServiceImpl implements UserService
{
    @Resource
    private UserMapper userMapper;
    @Override
    public boolean validateUser(String userName,String password)
    {
        UserExample userExample=new UserExample();
        UserExample.Criteria criteria=userExample.createCriteria();
        criteria.andUserNameEqualTo(userName);
        criteria.andPasswordEqualTo(password);
        return userMapper.selectByExample(userExample)==null;
    }
}

最后在controller包里建立一个controller类

注意:

1.需有@RestController注解,否则运行启动类的时候扫描不到

2.需有@CrossOrigin注解,否则无法跨域

3.使用@Autowired注入Service,且不可实例化(不要new

package com.example.demo_back.controller;

import com.example.demo_back.serviceImpl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@CrossOrigin
public class UserController
{
    @Autowired
    private UserServiceImpl userService;

    @RequestMapping("/validateUser")
    public boolean validateUser(@RequestParam(value = "userName") String userName,
                                @RequestParam(value = "password") String password)
    {
        return userService.validateUser(userName,password);
    }
}

总体目录结构如下:

项目架构前后端图片react_spring boot_17

运行xxxApplication启动类

项目架构前后端图片react_mybatis_18

然后打开postman

项目架构前后端图片react_项目架构前后端图片react_19

通过,好耶

废话连篇

至少从现在看来,一个算是能跑的后端项目建立了,以下是碰到的一些问题:

1.无法通过Autowired注入ServiceImpl类

项目架构前后端图片react_spring boot_20

原因:未在对应的ServiceImpl里面加入@Service注解

解决方法:

项目架构前后端图片react_java_21

2.mapper不存在

项目架构前后端图片react_java_22

原因:启动类未加@MapperScan注解

解决方法:

项目架构前后端图片react_mysql_23

3.mapper报空

项目架构前后端图片react_java_24

原因:使用mapper时未加Resource注解

解决方法:

项目架构前后端图片react_mybatis_25