Spring boot + Mybatis + SQLite 搭建blog API

Spring boot + Mybatis + SQLite 搭建 blog API#

一、准备环境#

二、创建一个 SpringBoot 项目#

在此我就不再演示如何创建 SpringBoot 项目了,需要的请看【 码出精彩人生】这位大佬的博客

使用 IDEA 创建一个 springboot 项目

三、在 pom.xml 文件中添加所需要的依赖 jar#

使用 sqlite 数据库需要引入 sqlite-jdbc.jar 包#

Copy
<!-- SQLite 驱动 --> <dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version>3.21.0.1</version> </dependency>

pom.xml 文件依赖如下#

Copy
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency>
<span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.springframework.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>spring-boot-starter-test<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">scope</span>&gt;</span>test<span class="hljs-tag">&lt;/<span class="hljs-name">scope</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">exclusions</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">exclusion</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.junit.vintage<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>junit-vintage-engine<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">exclusion</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">exclusions</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
<span class="hljs-comment">&lt;!-- SQLite 驱动 --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.xerial<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>sqlite-jdbc<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>3.21.0.1<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.projectlombok<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>lombok<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>1.16.22<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>

</dependencies>

四、创建 sqlite 数据库#

1、在项目的根目录下创建文件 blog-db.sqlite (名字随便起)#

2、然后在 IDEA 右边边上有一个 Database,点击创建 SQLite 数据库#

3、File-->> 选择第一步创建的 blog-db.sqlite , 然后点击 Test Connection 测试是否连接成功#

4、创建 d_user 表#

(1) 控制台创建表

拷贝下面创建表语句,执行即可创建表

Copy
create table d_users ( id int constraint "d-users_pk" primary key, username text not null, password text not null, start int default 1 not null, foundTime text );
(2)手动创建

五、一切准备就绪开始写业务。#

1、添加配置文件 application.yaml#

把创建项目生成的.properties 配置文件删除,创建一个 application.yaml,配置文件放在 resources 目录下

Copy
server: port: 8989 # 端口号 spring: datasource: url: jdbc:sqlite:D:/Software/PycharmProjects/d-blog/blog-db.sqlite # 创建的 sqlite 数据库所在路径 username: # 因为没有用户名和密码,所以这两个参数就没有值 password: driver-class-name: org.sqlite.JDBC # sqlite 驱动

# mybatis 配置
mybatis:
mapper-locations: classpath:mybatis/mapper/*Mapper.xml # 配置 mapper.xml 文件路径
type-aliases-package: com.desire.entity # 实体类包名
# mybatis 打印 SQL, 配置后就会在控制台打印执行的 SQL 语句
logging:
level:
com.desire.dao: debug

2、根据数据库表创建实体类 --UserEntity.java#

Copy
package com.desire.entity;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class UserEntity {
private int id;
private String userName;
private String password;
private int start;
private String foundTime;
}

3、在 resources/mybatis/mapper 中创建表的映射 --UserMapper.xml#

Copy
<?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.desire.dao.IUserDao">
<span class="hljs-tag">&lt;<span class="hljs-name">resultMap</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"BaseResultMap"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"com.desire.entity.UserEntity"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">result</span> <span class="hljs-attr">column</span>=<span class="hljs-string">"id"</span> <span class="hljs-attr">jdbcType</span>=<span class="hljs-string">"INTEGER"</span> <span class="hljs-attr">property</span>=<span class="hljs-string">"id"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">result</span> <span class="hljs-attr">column</span>=<span class="hljs-string">"userName"</span> <span class="hljs-attr">jdbcType</span>=<span class="hljs-string">"VARCHAR"</span> <span class="hljs-attr">property</span>=<span class="hljs-string">"userName"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">result</span> <span class="hljs-attr">column</span>=<span class="hljs-string">"password"</span> <span class="hljs-attr">jdbcType</span>=<span class="hljs-string">"VARCHAR"</span> <span class="hljs-attr">property</span>=<span class="hljs-string">"password"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">result</span> <span class="hljs-attr">column</span>=<span class="hljs-string">"start"</span> <span class="hljs-attr">jdbcType</span>=<span class="hljs-string">"INTEGER"</span> <span class="hljs-attr">property</span>=<span class="hljs-string">"start"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">result</span> <span class="hljs-attr">column</span>=<span class="hljs-string">"foundTime"</span> <span class="hljs-attr">jdbcType</span>=<span class="hljs-string">"VARCHAR"</span> <span class="hljs-attr">property</span>=<span class="hljs-string">"foundTime"</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">resultMap</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">select</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"findUserById"</span> <span class="hljs-attr">resultType</span>=<span class="hljs-string">"com.desire.entity.UserEntity"</span>&gt;</span>
    select * from d_users where id = #{id}
<span class="hljs-tag">&lt;/<span class="hljs-name">select</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">select</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"findUserAll"</span> <span class="hljs-attr">resultMap</span>=<span class="hljs-string">"BaseResultMap"</span> <span class="hljs-attr">resultType</span>=<span class="hljs-string">"com.desire.entity.UserEntity"</span>&gt;</span>
    select * from d_users
<span class="hljs-tag">&lt;/<span class="hljs-name">select</span>&gt;</span>

</mapper>

4、创建表数据库访问层接口 --IUserDao.java#

Copy
package com.desire.dao;

import com.desire.entity.UserEntity;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**

  • (D_Users)表数据库访问层
    */
    @Mapper
    public interface IUserDao {
    UserEntity findUserById(int id);
    List<UserEntity> findUserAll();
    }

5、创建表服务接口 --IUserService.java#

Copy
package com.desire.service;

import com.desire.entity.UserEntity;

import java.util.List;

/**

  • (D_Users) 表服务接口
    */
    public interface IUserService {

    UserEntity findUserById(int id);

    List<UserEntity> findUserAll();
    }

6、创建表服务实现类 --UserServiceImpl.java#

Copy
package com.desire.service.impl;

import com.desire.dao.IUserDao;
import com.desire.entity.UserEntity;
import com.desire.service.IUserService;
import org.springframework.stereotype.Service;

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

/**

  • (D_Users) 表服务实现类
    */
    @Service
    public class UserServiceImpl implements IUserService {
    @Resource
    private IUserDao IUserDao;

    @Override
    public UserEntity findUserById(int id) {
    return IUserDao.findUserById(id);
    }

    @Override
    public List<UserEntity> findUserAll() {
    return IUserDao.findUserAll();
    }
    }

7、创建表控制层 Controller--UserController.java#

Copy
package com.desire.controller;

import com.desire.common.DateUtil;
import com.desire.common.Result;
import com.desire.common.ResultUtil;
import com.desire.entity.UserEntity;
import com.desire.service.IUserService;
import org.springframework.web.bind.annotation.*;

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

import static com.desire.common.ResultEnum.*;

/**

  • (D_Users) 表控制层
    /
    @RestController
    @RequestMapping("/user")
    public class UserController {
    /
    *

    • 服务对象
      */
      @Resource
      private IUserService userService;

    @RequestMapping("getUser/{id}")
    public Result<Object> getUser(@PathVariable int id) {
    UserEntity user = userService.findUserById(id);
    if (user != null) {
    user.setFoundTime(DateUtil.timeStamp2Date(user.getFoundTime(), null));
    return ResultUtil.success(SUCCESS, user);
    } else {
    return ResultUtil.error(USER_NOT_FOND);
    }

    }

    @RequestMapping("getUsers")
    public Result<Object> getUsers() {
    List<UserEntity> users = userService.findUserAll();
    for (UserEntity user : users) {
    user.setFoundTime(DateUtil.timeStamp2Date(user.getFoundTime(), null));
    }
    return ResultUtil.success(SUCCESS, users);
    }
    }

8、规范化封装统一返回数据格式#

1)定义 http 请求返回的最外层对象,封装返回数据的统一格式 --Result.java
Copy
package com.desire.common;

import lombok.Getter;
import lombok.Setter;

/**

  • http 请求返回的最外层对象

  • @param <T>
    /
    @Getter
    @Setter
    public class Result<T> {
    /
    *

    • 错误码.
      */
      private Integer code;

    /**

    • 提示信息.
      */
      private String msg;

    /**

    • 具体的内容.
      */
      private T data;
      }

2) 为了统一管理返回数据结果 code 和 message,新建一个枚举类 ResultEnum.java
Copy
package com.desire.common; import lombok.Getter;

@Getter
public enum ResultEnum {
UNKONW_ERROR(1001, "未知错误"),
SUCCESS(200, "成功")
;

<span class="hljs-keyword">private</span> Integer code;

<span class="hljs-keyword">private</span> String msg;

ResultEnum(Integer code, String msg) {
    <span class="hljs-built_in">this</span>.code = code;
    <span class="hljs-built_in">this</span>.msg = msg;
}

}

3)为了防止多次出现 new Result() 的代码造成冗余,增加一个工具类 ResultUtil.java
Copy
package com.desire.common;

/**

  • 为了避免出现代码冗余情况,应该增加工具类,封装请求失败和成功时候的方法,这里可使用静态方法
    */
    public class ResultUtil {
    public static Result<Object> success(ResultEnum resultEnum, Object object) {
    Result<Object> result = new Result<>();
    result.setCode(resultEnum.getCode());
    result.setMsg(resultEnum.getMsg());
    result.setData(object);
    return result;
    }

    public static Result<Object> error(ResultEnum resultEnum) {
    Result<Object> result = new Result<>();
    result.setCode(resultEnum.getCode());
    result.setMsg(resultEnum.getMsg());
    return result;
    }
    }

六、启动项目,验证写的是否正确 -- 成功#

七、写在最后#

这个例子只实现了两个接口

最近在写一个博客相关的项目,前端 vue 部分已经完成(感觉写的很 low),不过还有待继续改进,我也在继续学习 vue,所用接口,用的是 json server 做的服务。

有兴趣的可以看下,提点意见,【personal_blog

这个 SpringBoot 项目就是我做的博客的接口服务,后续要把前端中的 json server 换成真实的接口。持续更新中,写的不好请给我提些建议。感谢看到最后。