从零开始一个 SpringBoot + Mybait 项目

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

简介

一、为什么 Spring Boot + MyBatis ?

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

二、这样跑通 Spring Boot 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 复制代码
<?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 的全局配置中,像仓库地址,代理设置,镜像设置。其中代理可能是我们需要关注的,我们镜像配置:

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

xml 复制代码
<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 中开始配置一个项目

  • 新建 -> 项目 -> Spring Initializr
  • 位置:项目要创建的位置
  • 类型:Maven
  • JDK: 17
  • 打包:Jar

9.1)Spring Boot 选择相关

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

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

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

9.2)自定义配置

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

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

9.3)生成目录结构

十、Spring 配置文件

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

十一、应用程序分层

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

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

11.2)定义数据表

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

  • SQL 语句
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 进行配置

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

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

java 复制代码
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 进行映射:

java 复制代码
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 一般有两个文件,一个是接口,一个接口的实现:

  • 接口
java 复制代码
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);
}
  • 接口实现
java 复制代码
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 项目中常见的模板引擎,可选的配置如下:

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

11.7)Controller 控制器层

java 复制代码
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层进行映射,名字都要基本相同

xml 复制代码
        "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 进行接口测试

十三、欢迎 Star

十四、展望

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

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

十五、小结

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

相关推荐
李慕婉学姐16 分钟前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
奋进的芋圆2 小时前
Java 延时任务实现方案详解(适用于 Spring Boot 3)
java·spring boot·redis·rabbitmq
sxlishaobin2 小时前
设计模式之桥接模式
java·设计模式·桥接模式
model20052 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
荒诞硬汉3 小时前
JavaBean相关补充
java·开发语言
提笔忘字的帝国3 小时前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
2501_941882483 小时前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
華勳全栈3 小时前
两天开发完成智能体平台
java·spring·go
alonewolf_993 小时前
Spring MVC重点功能底层源码深度解析
java·spring·mvc
沛沛老爹4 小时前
Java泛型擦除:原理、实践与应对策略
java·开发语言·人工智能·企业开发·发展趋势·技术原理