使用intellij idea创建springboot项目
首先建议参考如文章以及各种网络教程
如果头铁想看笔者所写,就要做好翻车的准备(笔者老cv大师了)
新建一个项目,选择Spring Initializr(demo_back是我起的名字
选择依赖(感觉Thymeleaf不要也罢,JDBC API好像也没用到,算啦,宁滥毋缺吧)
新建完成后,耐心等一会maven的下载(虽然我用了很多次maven了,但依然浑浑噩噩,果然该去学一学了)
(不知为何今天格外慢,明明都在本地仓库的说)
解析下载完以后看看右边的maven,基本是能导包的,如果没有,点一下重新加载(左上角的刷新按钮
然后打开application.properties写入数据库配置和端口配置(这里我重构为了yml,因为好写)
这里我把项目的运行端口设置为了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
填写用户名和密码,以及自己的数据库名字(demo是我建的数据库名,character set建议采用utf8),然后测试连接,通过就ok了
serverTimezone也是有人要加有人不要,我是要加的,不然会测试连接报错
附上数据库:(工具使用navicat)
能看到库的内容就成功
mybatis逆向生成实体类和mapper
导语:哎,我就头铁,我就非得用自动生成,感谢这篇文章的作者
把放实体类和mapper的包建立起来,我的目录如下:
其中软件包entity和mapper是放在项目目录下的,放mapper类的xml文件的mapper目录一定要放在resources下
其中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
把这一大段给复制进去(可以参考上面博主的文章
别害怕,主要需要修改:
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未注册,可以把点击这个红连接,然后出现个红灯泡,然后获取外部资源,就好了
然后去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,然后双击这个新插件
出现build success就可以了,真刺激
看一下工程目录,就能发现有了新文件
注意:如果改了库需要重新生成某张表的各类文件,最好(应该是必须)把这张表对应的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);
}
}
总体目录结构如下:
运行xxxApplication启动类
然后打开postman
通过,好耶
废话连篇
至少从现在看来,一个算是能跑的后端项目建立了,以下是碰到的一些问题:
1.无法通过Autowired注入ServiceImpl类
原因:未在对应的ServiceImpl里面加入@Service注解
解决方法:
2.mapper不存在
原因:启动类未加@MapperScan注解
解决方法:
3.mapper报空
原因:使用mapper时未加Resource注解
解决方法: