• Spring boot + Mybatis + SQLite 搭建blog API


    Spring boot + Mybatis + SQLite 搭建blog API

    一、准备环境

    二、创建一个SpringBoot项目

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

    使用IDEA创建一个springboot项目

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

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

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

    pom.xml文件依赖如下

    <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>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- SQLite 驱动 -->
        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <version>3.21.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.22</version>
        </dependency>
    </dependencies>
    

    四、创建sqlite数据库

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

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

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

    4、创建 d_user 表

    (1) 控制台创建表

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

    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 目录下

    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

    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

    <?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">
    
        <resultMap id="BaseResultMap" type="com.desire.entity.UserEntity">
            <result column="id" jdbcType="INTEGER" property="id" />
            <result column="userName" jdbcType="VARCHAR" property="userName" />
            <result column="password" jdbcType="VARCHAR" property="password" />
            <result column="start" jdbcType="INTEGER" property="start" />
            <result column="foundTime" jdbcType="VARCHAR" property="foundTime" />
        </resultMap>
    
        <select id="findUserById" resultType="com.desire.entity.UserEntity">
            select * from d_users where id = #{id}
        </select>
        <select id="findUserAll" resultMap="BaseResultMap" resultType="com.desire.entity.UserEntity">
            select * from d_users
        </select>
    </mapper>
    

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

    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

    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

    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

    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
    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
    package com.desire.common;
    import lombok.Getter;
    
    @Getter
    public enum ResultEnum {
        UNKONW_ERROR(1001, "未知错误"),
        SUCCESS(200, "成功")
        ;
    
        private Integer code;
    
        private String msg;
    
        ResultEnum(Integer code, String msg) {
            this.code = code;
            this.msg = msg;
        }
    }
    
    3) 为了防止多次出现new Result()的代码造成冗余,增加一个工具类ResultUtil.java
    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换成真实的接口。持续更新中,写的不好请给我提些建议。感谢看到最后。

  • 相关阅读:
    LeetCode18. 四数之和
    15. 三数之和
    LeetCode202. 快乐数
    LeetCode1. 两数之和
    LeetCode349. 两个数组的交集
    LeetCode242. 有效的字母异位词
    VSCode运行时弹出powershell
    关于cin, cin.get(), getchar(),getline()的字符问题
    剑指 Offer 27. 二叉树的镜像
    BFS zoj 1649
  • 原文地址:https://www.cnblogs.com/desireyang/p/13234985.html
Copyright © 2020-2023  润新知