从零开始搭建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 TABLEmobile_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));

七、看一下效果

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值