likes
comments
collection
share

从零开始一个 SpringBoot + Mybatis 项目

作者站长头像
站长
· 阅读数 8

本文面向初学 Java 和 Spring Boot 集成 Mybatis 项目。万事开头难,当我们熟练的搭建好架子之后,就可以顺畅的开启编程之路了。

简介

从零开始一个 SpringBoot + Mybatis 项目

一、为什么 Spring Boot + MyBatis ?

不是其他语言更具性价比,因为 Spring Boot 这套技术在商业技术上成熟并且稳定且广泛。

二、这样跑通 Spring Boot MyBatis 项目

从零开始一个 SpringBoot + Mybatis 项目

三、基础环境和常用工具

从零开始一个 SpringBoot + Mybatis 项目

开发 Java 对编程环境没有限制,使用 Windows、Linux、或者MacOS 都是可以的。

  • Java 如果对 Java 基础还不了解,可以先熟悉 Java 基础语法、看到 Java 类型觉得复杂的不要怕、学多了就很简单了。
  • Spring 系列 Spring 系列中 Spring Boot 是简化了 Spring 程序的开发。
  • MySQL MySQL 是流行的关系型数据库,主流的数据库你学编程你跑不掉。
  • Maven 项目(包)管理工具
  • ideaVSCode等,使用它们你将拥有一个趁手的工具。
  • postman 拥有它你将拥有一个趁手的 API 测试工具(当然也有其他的)
  • navicatmysql workbench 数据库设计工具

需要注意的是: idea、navicat 等都是收费的,推荐根据主流的工具走,出现问题能更好的找到答案。安装部分只介绍 Java 本身和 Maven 等。

四、语言基础和工具使用

  • 熟悉Java或类似语言的语法(基础语法、类型系统、注解(装饰器)等语法特性)。
  • 熟悉面向对象编程思维。
  • 熟悉基于 maven 的 Spring Boot 工程化。
  • 熟悉 Mybatis 作为数据持久层。
  • 熟悉基本分层架构设计(IoC, AOP、Dao、控制层、服务层、模型层、关系映射等)。
  • 熟悉工程化中约定大于配置编程思想。
  • 熟悉 SQL 语句基本特点。
  • 熟悉数据库基本设计(表和字段设计)。
  • 熟悉使用 yaml/yml 最为配置语言。
  • 熟悉基本 xml 语法(Java 体系使用 xml 配置文件居多)。
  • 熟悉编程 idea 等 IDE 的基本使用方法(基本功能、插件用法)。

写完了还挺多了,如果是编程纯新手,内容还真有点多。

五、安装 Java

以 Windows 为例,安装 Java 环境一般分为三个步骤:

  • 下载并安装 JDK
    • 官方下载
    • 第三方下载
  • 配置环境变量
    • JAVA_HOME: JDK 安装的位置
    • 系统变量中 Path 添加 ;%JAVA_HOME%\bin;
  • 测试是否完成
    • java 命令用于运行 java 程序
    • javac命令用于编译 java 程序

推荐使用 Java8, 这里有一个篇文章说 为什么使用 Java8?

六、安装 Maven

Maven 在 idea 中集成,如果是一个 maven 项目,会在项目左边显示maven管理图标。

Maven 是一个项目管理工具,项目的配置文件写在 pom.xml 中。虽然 Maven 提供了命令行,但是在主流基于 IDE 编程环境中,Maven 已经被内置于 ide 中,使用非常方便。

6.1)手动下载 maven

maven 下载地址 Maven 是 Java 写的,所以需要 Java 环境

6.2)配置环境便令

  • MAVEN_HOME 安装命令
  • Path中的 ;%MAVEN_HOME%\bin

6.3)Maven 配置项目

Maven 使用 pom.xml (也就是工程对象模型 Project Object Model)进行配置,xml 文件写配置:

  • 项目坐标(Group ID、Artifact ID、Version): 用于唯一标识项目和生成的构建产物。
  • 项目描述和名称: 提供对项目的简要描述。
  • 依赖配置: 使用 <dependencies> 元素添加项目的依赖。
  • 构建配置: 包括 Maven 编译插件和打包插件的配

以下是一个简单的 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>org.mg</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>demo</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <!-- 其他以来 -->
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

6.4)settings.xml 配置

settings.xml 包含 Maven 的全局配置中,像仓库地址,代理设置,镜像设置。其中代理可能是我们需要关注的,我们镜像配置:

这里我们给一个来源配置:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

    <mirrors>
        <mirror>
            <id>aliyun</id>
            <url>https://maven.aliyun.com/repository/public/</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>

    <profiles>
        <profile>
            <id>default</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <repositories>
                <repository>
                    <id>thu</id>
                    <url>https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven2/</url>
                </repository>
            </repositories>
        </profile>
    </profiles>

</settings>

如果你的初始项目,下载依赖很慢,不妨切换到自定义源。

七、Spring Boot 简介

Spring Boot 是一个简化 Spring 应用程序的 Java 框架。使用 Spring Boot 可以:

  • 简化配置: 约定大于配置,内置大量 starter。
  • 自动配置: 类路径条件、 beans 和属性值,Spring Boot 自动配置相应组件, 直接业务写代码。
  • 起步依赖: 内置常用依赖库。
  • 内置容器: Tomcat、Jetty 等等。
  • 微服务:Spring Boot 可以方便的继承到微服务架构中。

八、MyBatis 简介

MyBatis 是一个专注于 SQL 解决方案,能最大程度的与 Java 和 SQL 语句之间解耦,从能够更加专注于业务逻辑和 sql 优化。Mybatis 具有以下优点:

  • API 轻量级
  • SQL 映射解耦代码
  • 动态 SQL 语句
  • JDBC 封装
  • 方便的集成工具

九、使用 Idea 快速开始一个 Spring Boot + MyBatis 项目

这里我们假定已经安装了以上推荐的工具。在 idea 中开始配置一个项目

从零开始一个 SpringBoot + Mybatis 项目

  • 新建 -> 项目 -> Spring Initializr

从零开始一个 SpringBoot + Mybatis 项目

  • 位置:项目要创建的位置
  • 类型:Maven
  • JDK: 17
  • 打包:Jar

9.1)Spring Boot 选择相关

从零开始一个 SpringBoot + Mybatis 项目

注意:依赖中的 MySQL 驱动和 MyBatis 框架

  • 开发者工具
    • Spring Boot DevTools: 热启动
    • Lombok:注解自动生成getter/setter
  • Web
    • Spring Web
  • 模板引擎
    • Thymeleaf
  • SQL
    • MyBatis Framework
    • MySQL Driver

因为是初级项目,使用 Spring Boot 对 MySQL 数据库进行基础操作,这些配置足以完成这些基本任务。

9.2)自定义配置

idea 一般会自动下载如果下载很慢可以自己手动的添加配置

从零开始一个 SpringBoot + Mybatis 项目

Tips: setting.xml 配置阿里云在上面已经讲解

9.3)生成目录结构

从零开始一个 SpringBoot + Mybatis 项目

十、Spring 配置文件

Spring Boot 初始化的项目大概使用的是 properties 文件作为配置文件,但是还是推荐使用 yml(yaml) 文件进行配置,原因也很简单,配置文件简洁。

十一、应用程序分层

Spring Boot 项目使用 AOP 和 IoC 分层,当然不同的人,不同的团队有不同的标准,下面的分层是一种方法,可供参考:

11.1)本文以用户表为例进行测试

11.2)定义数据表

本文基于 MySQL 进行数据设计,我们可以使用 mysql 的命令行,配合 SQL 语句进行配置。当然如果你喜欢命令行也可以使用 MySQL 相关的软件或者图形化工具进行设计:

  • SQL 语句
CREATE TABLE `choices` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  `age` int(20) NOT NULL,
  `email` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `created_at` timestamp,
  `updated_at` timestamp,
);
  • 使用 navicate 进行配置

从零开始一个 SpringBoot + Mybatis 项目

11.3)Pojo 层(关联数据库模型

pojo 层定义 User 类,需要配合数据中的字段

package com.example.demo.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;
    private String username;
    private Integer age;
    private String email;
    private String password;
    private Date created_at;
    private Date updated_at;
}

项目使用 lombok 进行注解生成 getter 和 setter 方法。

11.4)Dao 数据传输层

Dao 是 Java 接口与 mybatis 进行映射:

package com.example.demo.dao;

import com.example.demo.pojo.User;
import com.example.demo.pojo.query.UserQuery;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
@Repository
public interface UserDao {
    public List<User> listUser();
    public List<User> listUserByName(UserQuery userQuery);
    public User queryUserById(Integer id);
    public int deleteUserById(Integer id);
    public int updateUser(User user);
    public int addUser(User user);
}
  • @Mapper注解用于标识一个接口是MyBatis的映射器。
  • @Repository注解表示该类是Spring的数据访问对象(DAO)。

11.5)Service 服务层

Service 一般有两个文件,一个是接口,一个接口的实现:

  • 接口
package com.example.demo.service;

import com.example.demo.pojo.User;
import com.example.demo.pojo.query.UserQuery;

import java.util.List;

public interface UserService {
    public List<User> listUser();
    public List<User> listUserByName(UserQuery userQuery);
    public boolean deleteUserById(Integer id);
    public User queryUserById(Integer id);
    public boolean updateUser(User user);
    public boolean addUser(User user);
}
  • 接口实现
package com.example.demo.service;

import com.example.demo.dao.UserDao;
import com.example.demo.pojo.User;
import com.example.demo.pojo.query.UserQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public List<User> listUser() {
        return userDao.listUser();
    }

    @Override
    public List<User> listUserByName(UserQuery userQuery) {
        return userDao.listUserByName(userQuery);
    }
    
    @Override
    public boolean deleteUserById(Integer id) {
        System.out.println(id);
        int i = userDao.deleteUserById(id);
        return i > 0;
    }

    @Override
    public User queryUserById(Integer id) {
        return userDao.queryUserById(id);
    }

    @Override
    public boolean updateUser(User user) {
        int i = userDao.updateUser(user);
        return i > 0;
    }

    @Override
    public boolean addUser(User user) {
        System.out.println(user);
        int i = userDao.addUser(user);
        return i > 0;
    }
}

我们看到 UserService 中调用了 Dao 中的方法,实现与 mybatis 数据库操作的映射

11.6)View 视图层

视图层需要指定模板引擎,thymeleaf 就是 Spring Boot 项目中常见的模板引擎,可选的配置如下:

server:
  port: 8899
spring:
  thymeleaf:
    cache: false
    prefix: classpath:/templates/
    encoding: UTF-8
    suffix: .html
    mode: HTML

11.7)Controller 控制器层

package com.example.demo.controller;

import com.example.demo.pojo.User;
import com.example.demo.pojo.query.UserQuery;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
public class UserController {

    @Autowired
     private UserService userService;

    @GetMapping("/")
    public String index_home() {
        return "index";
    }

    @GetMapping("/test")
    public String test() {
        return "test";
    }

    /**
     * 获取列表
     * @return
     */
    @GetMapping("/list")
    @ResponseBody
    public List<User> index() {
        return userService.listUser();
    }

    /**
     * 模糊查找
     * @param userQuery
     * @return
     */
    @GetMapping("/list-search")
    @ResponseBody
    public List<User> search(UserQuery userQuery) {
        System.out.println(userQuery);
        return userService.listUserByName(userQuery);
    }
    
    @PostMapping("/add")
    @ResponseBody
    public String add(User user) {

        boolean b = userService.addUser(user);
        return b ? "ok" : "fail";
    }

    @DeleteMapping("/delete/{id}")
    @ResponseBody
    public String delete(@PathVariable("id") Integer id) {

        boolean b = userService.deleteUserById(id);
        return b ? "ok" : "fail";
    }


    @PatchMapping("/edit/{id}")
    @ResponseBody
    public String update(User user) {
        boolean b = userService.updateUser(user);
        return b ? "ok" : "fail";
    }
}

控制器放在 controller 文件夹下面,使用 @Controller 注解,会被自动扫描到。

  • @Autowired 自动注入类
  • @GetMapping 表示 get 请求,可以传递请求路径
  • @ResponseBody 表示

11.8)Mybatis 映射层

Mybatis 映射层其实与Dao层进行映射,名字都要基本相同

        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.dao.UserDao">
    <select id="listUser" resultType="com.example.demo.pojo.User">
        select *
        from test.user;
    </select>
    <select id="listUserByName" parameterType="com.example.demo.pojo.query.UserQuery" resultType="com.example.demo.pojo.User">
        select *
        from test.user
        <where>
            <if test="username != null and username != ''">
                and `username` like concat('%',#{username},'%')
            </if>
        </where>
    </select>
    <insert id="addUser">
        insert into test.user(username, password, email, age)
        values (#{username}, #{password}, #{email}, #{age})
    </insert>
    <delete id="deleteUserById" parameterType="int">
        delete from test.user where id=#{id}
    </delete>
    <update id="updateUser" parameterType="com.example.demo.pojo.User">
        update test.user
        set username = #{username},password = #{password}, email=#{email}, age=#{age}
        where id = #{id}
    </update>
</mapper>
  • select 标签中写 select 语句, id 映射Dao层对应的方法,resultType 是函数的返回值 parameterType 是参数,当然可以没有,这样构成映射管理。

其他的标签: <insert>/<update>/<delete>/<where>/<if> 等等内容。更加细节的 mybatis 的xml配置就再赘述。

当然还有测试层,这里暂时不关注测试层的内容。

十二、启动 Spring 服务并测试Postman 进行接口测试

从零开始一个 SpringBoot + Mybatis 项目

十三、欢迎 Star

十四、展望

一些基础的内容已经处理好了,写业务的可能还需要很多的辅助可以,当然这些不在本文的讨论具体的范围,但是有一些具体的内容:

  • JSON 序列化
  • 统一的返回
  • 拦截器
  • 中间件(当然在 Java 可能不能叫中间件)
  • 过滤器
  • 分页
  • 辅助库
  • 更好的接口设计
  • 前后端分离
  • 更加深入的学习...

十五、小结

本文主要套讨论了如何开始一个 Spring Boot + MyBatis 项目。一些经验之谈,需要有编程思想,适合初学 Spring Boot 项目。初学者需要除了学习 Java 和 Spring Boot 项目。