本文面向初学 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 项目(包)管理工具
- idea、VSCode等,使用它们你将拥有一个趁手的工具。
- postman 拥有它你将拥有一个趁手的 API 测试工具(当然也有其他的)
- navicat、mysql 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 项目。