从零开始搭建Springboot工程
需求背景分析
在数据库中存在手机型号的一些信息,根据手机型号找到手机的其他信息,例如手机的归属,手机归属人的手机号,手机的编号等。
一、创建一个简单的springboot工程
请参考这篇文章,很简单,一直下一步就可以了,https://blog.csdn.net/wjg8209/article/details/94546110
二、搭建mysql
1.本地安装mysql
1、在mysql官网直接,下载mysql,直接安装上即可
2、这时候用可视化工具链接mysql是链接不上,需要重置一下密码
系统偏好设置-mysql
点击Initialize Database
输入你的新密码,记住这个密码,用于后期链接数据库的登陆使用。
选择‘Use legacy password‘。
重启mysql服务。
再用可视化工具去连就OK了
2.创建表和数据库
1、创建数据库,不写了
2、创建表和字段
CREATE TABLE
mobile_info(
idbigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
mobile_novarchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT '设备编号',
ownervarchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '手机持有者',
modelvarchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '手机型号',
create_timetimestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
update_timetimestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', PRIMARY KEY (
id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT=‘测试机信息表’;
AUTO_INCREMENT=1,主键从1开始自增。`
3、创建完后是这样的
三、springboot整合mybatis
这个章节主要实现springboot和mysql的联通
项目结构
如图:
文件特别说明
SptestApplication启动类,注意加这个注释哈,@MapperScan (“com.liu.sptest.mapper”),不然会报错
package com.liu.sptest;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan ("com.liu.sptest.mapper")
public class SptestApplication {
public static void main(String[] args) {
SpringApplication.run(SptestApplication.class, args);
}
}
MobileInfo类,与数据库字段一一对应,@Data注释可以自动生成get和set方法
package com.liu.sptest.bean;
import lombok.Data;
import java.util.Date;
@Data
public class MobileInfo {
/**
* 主键
*/
private Long id;
/**
* 设备编号
*/
private String mobileNo;
/**
* 手机持有者
*/
private String owner;
/**
* 持有者手机号
*/
private String phoneNo;
/**
* 手机型号
*/
private String model;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
}
controller—HelloMissLiu 控制层,尽量轻薄,
package com.liu.sptest.controller;
import com.liu.sptest.common.bean.Result;
import com.liu.sptest.common.enums.CodeMsg;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.liu.sptest.service.MobileInfoService;
import javax.annotation.Resource;
@RestController
@RequestMapping(value = "/beauty")
public class HelloMissLiu {
@Resource
private MobileInfoService mobileInfoService;
@GetMapping(value = "/getMobileInfoByModel")
public Result getHello(@RequestParam("model") String model) {
if(model.equals("")){
return Result.error(CodeMsg.VALIDATION_ERROR);
}
return Result.success(mobileInfoService.getMobileInfo(model));
}
}
mapper.MobileInfoMapper 用来映射真正的mysql语句而抽象出来的接口–非正式定义,就这么个意思。。。
package com.liu.sptest.mapper;
import org.springframework.stereotype.Repository;
import com.liu.sptest.bean.MobileInfo;
import java.util.List;
@Repository
public interface MobileInfoMapper {
//增加一条设备信息
int insertMobileInfo(MobileInfo mobileInfo);
//修改设备信息
int updateMobileInfo(String owner);
//根据型号查询设备信息
MobileInfo queryMobileByModel(String model);
//根据姓名查询设备信息
List<MobileInfo> queryMobileByOwner(String owner);
}
MobileInfoService 实现层,主要是业务逻辑的处理
package com.liu.sptest.service;
import com.liu.sptest.mapper.MobileInfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.liu.sptest.bean.MobileInfo;
/**
* @Author: beauty
* @Date: 2020/4/18 3:00 下午
*/
@Component
public class MobileInfoService {
@Autowired
private MobileInfoMapper mobileInfoMapper;
public MobileInfo getMobileInfo(String model) {
return mobileInfoMapper.queryMobileByModel(model);
}
}
MobileInfoMapper.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.liu.sptest.mapper.MobileInfoMapper">
<resultMap id="BaseResultMap" type="com.liu.sptest.bean.MobileInfo">
<result column="id" jdbcType="INTEGER" property="id" />
<result column="mobile_no" jdbcType="VARCHAR" property="mobileNo" />
<result column="owner" jdbcType="VARCHAR" property="owner" />
<result column="phone_no" jdbcType="VARCHAR" property="phoneNo" />
<result column="model" jdbcType="VARCHAR" property="model" />
<result column="create_time" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
</resultMap>
<sql id="Base_Column_List" >
id, mobile_no, owner, phone_no, model, create_time, update_time
</sql>
<select id="queryMobileByModel" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from mobile_infot where model = #{model}
</select>
</mapper>
application.yml 数据库的连接信息都在这里,这里注意空格,冒号后要有空格,在yml文件中,直到参数名字变色了才算有效
#数据库连接:注意要加上时区
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/tesmobile?serverTimezone=GMT%2B8
username: root
password: xxxxx
driver-class-name: com.mysql.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml
type-aliases-package: com.liu.sptest.bean
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>sp_test</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- 加载mybatis整合springboot-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- MySQL的jdbc驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<!--自动生成get和set方法-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
链接数据库单元测试
下面我们就写个单测看看有没有打通mysql,这里我遇到个问题,就是实体类中字段命名和数据库设计的不一致时候就取不出来,明明在MobileInfoMapper.xml使用resultMap做了一一映射怎么会匹配不到呢,后来改了MobileInfoMapper.xml文件,在select语句中加了resultMap=“BaseResultMap”,至于为什么这么干就可以取出库里面所有数据我也不知道,有知道的一定留言告诉我吖,select语句中至少配置resultType和resultMap其中的一个,我之前配置的resultType,后来删掉了配置了resultMap可以取出所有数据了。
package com.liu.sptest;
import com.alibaba.fastjson.JSON;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.liu.sptest.service.MobileInfoService;
import javax.annotation.Resource;
/**
* @Author: beauty
* @Date: 2020/4/23 11:22 上午
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class MysqlTest {
@Resource
private MobileInfoService mobileInfoService;
@Test
public void testMybatis() {
String str = JSON.toJSONString(mobileInfoService.getMobileInfo("oppo"));
System.out.println("==================" + str);
}
}
看下测试结果
四、编写你要实现的业务逻辑
代码如上边的MobileInfoService方法,实现了根据测试机型号查询测试机信息
五、单元测试
空
六、 统一封装返回值Result
具体我是参考https://www.jianshu.com/p/cfd66f651636 这篇文章的,代码没有完全复制,取了需要用的部分
创建Result的实体类
该实体类定义了返回结果的基本组成,包括返回的状态码,错误信息及具体的返回值,而且定义了正常请求时候的返回方法及错误请求返回的信息
package com.liu.sptest.common.bean;
import com.liu.sptest.common.enums.CodeMsg;
import lombok.Data;
import java.io.Serializable;
/**
* @Author: beauty
* @Date: 2020/4/26 11:06 上午
*/
@Data
public class Result<T> implements Serializable {
private int code;
private String msg;
private T data;
private Result(int code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public static <T> Result<T> success(T data){
return new Result<T>(0,"success",data);
}
public static <T> Result<T> error(CodeMsg cm){
return new Result<T>(cm.getCode(),cm.getMsg(),null);
}
}
错误信息定义
package com.liu.sptest.common.enums;
import lombok.Data;
/**
* @Author: beauty
* @Date: 2020/4/26 11:13 上午
*/
@Data
public class CodeMsg {
private int code;
private String msg;
/**
* 私有构造器
* @param code
* @param msg
*/
private CodeMsg(int code, String msg) {
this.code = code;
this.msg = msg;
}
/**
* 通用错误返回
*/
public static final CodeMsg SERVER_ERROR = new CodeMsg(60000,"服务器异常!");
public static final CodeMsg VALIDATION_ERROR = new CodeMsg(60001,"参数效验错误!");
// public static final CodeMsg BIZ_ERROR = new CodeMsg(60002,"业务异常:%s!");
}
mobileInfoService.getMobileInfo(model)为一个对象,直接放到success方法中就行了,不要放string,不然返回值格式不好看,而且有反斜杠
return Result.success(mobileInfoService.getMobileInfo(model));
七、看一下效果