一、介紹
上2篇分別寫了Springboot入門以及給Springboot加swagger悦析,本篇將在此基礎(chǔ)上進(jìn)行DB操作
本文為整合springboot+mybatis+mysql+swagger3的示例,完整寫了一個(gè)關(guān)于用戶增刪改查的demo 整個(gè)示例采用rest api詳細(xì)完成了一個(gè)關(guān)于用戶的基本增(post)、刪(delete)矛洞、改(put)微姊、查(get)過程 另外其中詳細(xì)寫了采用mybatis進(jìn)行相關(guān)db處理
本文代碼git地址:https://gitee.com/jimmyTown_admin_admin/springboot-mybatis-mysql-demo.git
二酸茴、軟件架構(gòu)
1. 本demo使用時(shí)下最流程的rest架構(gòu)向外提供服務(wù),采用GET/POST/PUT/DELETE來完成demo的增刪改查
2. 采用2.5.5版本的sprintboot大大簡化開發(fā)過程
3. 本文內(nèi)部有關(guān)于springboot結(jié)合swagger3的整體使用兢交,除ui controller層有注釋外薪捍,同時(shí)將dto、entity等也加上對(duì)應(yīng)注釋配喳,便于理解
4. 本文結(jié)果sprintboot及mybatis完整demo演示
5. 本文中加入對(duì)應(yīng)的lombok組件酪穿,簡化了大量的get/set操作
三、準(zhǔn)確工作及說明
- 準(zhǔn)確數(shù)據(jù)庫腳本
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`age` int(0) NULL DEFAULT NULL,
`sex` varchar(8) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES (3, 'bob', '333666', 32, ' 男');
INSERT INTO `t_user` VALUES (4, 'ruby', '333333', 25, ' 女');
INSERT INTO `t_user` VALUES (5, 'test', '11', 11, '11');
INSERT INTO `t_user` VALUES (6, 'jimmy', '000000', 33, '男');
SET FOREIGN_KEY_CHECKS = 1;
-
大概運(yùn)行的示例圖 image.png
-
Swagger運(yùn)行結(jié)果 image.png
-
項(xiàng)目代碼結(jié)構(gòu) image.png
四晴裹、整體代碼詳細(xì)說明
- 本文是采用springboot+mybatis+mysql+swagger3來做的被济,故第一步在建springboot項(xiàng)目時(shí),需要添加相關(guān)spring web息拜、Thymeleaf溉潭、Mybatis Framework、MySQL Driver少欺,另外為了文件也添加了Lombok喳瓣,故最終pom中依賴代碼如下:
<dependencies>
<!--springboot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--加入thymeleaf-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--加入mybatis支持-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!--加入mysql數(shù)據(jù)庫依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--加入lombok支持-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--加入swagger3支持-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
相關(guān)依賴添加ok后,采用mvn reimport使依賴包正常拉取并編譯成功
- 按項(xiàng)目代碼結(jié)構(gòu)中赞别,我們依次講解相關(guān)代碼
- controller層
該處用于向外提供接口服務(wù)畏陕,此處添加UserController的api接口,實(shí)現(xiàn)增刪改查仿滔,相關(guān)注解詳細(xì)請參看上2篇說明惠毁,此處先貼入代碼
- controller層
/**
* 在接口類上添加@Api(tags = "操作接口")犹芹,tags的值是該類的作用,在文檔頁面會(huì)顯示鞠绰,value不會(huì)顯示
* 在需要生成文檔的接口上添加注解@ApiOperation
* 對(duì)請求參數(shù)添加@ApiParam
*/
@Api(tags = "用戶控制器")
@RestController
@RequestMapping("user")
public class UserController {
// 接口服務(wù)注入
@Autowired
private UserService userService;
@ApiOperation("查找所有用戶列表")
@GetMapping(value = {"/getUserList"})
public List<User> getUserList() {
return userService.getUserList();
}
@ApiOperation("通過用戶Id查找用戶信息")
@GetMapping(value = {"/getUser"})
public User getUser(@ApiParam(name = "id", value = "用戶Id") int id) {
return userService.getUser(id);
}
@ApiOperation("通過用戶姓名查詢用戶列表")
@GetMapping("/getUserByUserName")
public List<User> getUserByUserName(@ApiParam(name = "userName", value = "用戶姓名") String userName) {
return userService.getUserByUserName(userName);
}
@ApiOperation("添加用戶信息")
@PostMapping("/addUser")
public String Add(@ApiParam(name = "user", value = "用戶信息") UserRequestDto user) throws Exception {
try {
// 先判斷用戶名存在不存在如果存在腰埂,則報(bào)錯(cuò),否則添加
if (null == user || "".equals(user.getUsername())) {
return "用戶或用戶信息不得為空";
}
List<User> users = userService.getUserByUserName(user.getUsername());
if (null != users && users.size() > 0) {
return "用戶名已存在";
}
User userItem = new User();
userItem.setUsername(user.getUsername());
userItem.setPassword(user.getPassword());
userItem.setAge(user.getAge());
userItem.setSex(user.getSex());
userService.addUser(userItem);
return "用戶" + user.getUsername() + "添加成功";
} catch (Exception ex) {
return "異常信息:" + ex.getMessage();
}
}
@ApiOperation("更新用戶信息")
@PutMapping("/updateUser")
public String Update(@ApiParam(name = "user", value = "用戶信息") User user) throws Exception {
try {
if (null == user || "".equals(user.getUsername()) || 0 == user.getId()) {
return "用戶或用戶信息不得為空";
}
if ("".equals(user.getPassword()) || user.getPassword().length() < 5) {
return "用戶密碼至少為5位";
}
User userItem = userService.getUser(user.getId());
if (null == userItem) {
return "用戶不存在蜈膨,無法更新屿笼,請先添加";
}
userService.updateUser(user);
return "用戶" + user.getUsername() + "信息更新成功";
} catch (Exception ex) {
return "異常信息:" + ex.getMessage();
}
}
@ApiOperation("刪除用戶信息")
@DeleteMapping("/delete")
public ApiResult delete(@ApiParam(name = "id", value = "用戶Id") @RequestParam(value = "id") int id) {
ApiResult result = new ApiResult();
if (id <= 0) {
result.setCode("-1");
result.setMessage("非法id");
return result;
}
return userService.delete(id);
}
}
- service
service層一般包括接口服務(wù),接口服務(wù)實(shí)現(xiàn)類翁巍,一般主要用于業(yè)務(wù)服務(wù)實(shí)現(xiàn)驴一,這里service層包括服務(wù)實(shí)現(xiàn)類UserServiceImpl以及接口UserService,代碼分別如下:- UserService代碼
public interface UserService {
/**
* 通過所有用戶列表
*
* @return
*/
List<User> getUserList();
/**
* 通過用戶id查詢用戶信息
*
* @param id
* @return
*/
User getUser(int id);
/**
* 通過用戶姓名查詢用戶信息
*
* @param userName
* @return
*/
List<User> getUserByUserName(String userName);
/**
* 添加新用戶
*
* @param user
*/
void addUser(User user);
/**
* 更新用戶信息
*
* @param user
*/
void updateUser(User user) throws Exception;
/**
* 刪除用戶信息
*
* @param id
* @return
*/
ApiResult delete(int id);
}
UserService代碼
// 加入service灶壶,將實(shí)現(xiàn)交給spring來管理
@Service
public class UserServiceImpl implements UserService {
// 加入dao的注入
@Autowired
private UserDao userDao;
/**
* 獲取所有用戶列表
*
* @return
*/
@Override
public List<User> getUserList() {
return userDao.getUserList();
}
/**
* 通過用戶id查詢用戶信息
*
* @param id
* @return
*/
@Override
public User getUser(int id) {
return userDao.getUserById(id);
}
/**
* 通過用戶姓名查詢用戶信息
*
* @param userName
* @return
*/
@Override
public List<User> getUserByUserName(String userName) {
return userDao.getUserByUserName(userName);
}
/**
* 添加新用戶
*
* @param user
*/
@Override
public void addUser(User user) {
userDao.addUser(user);
}
/**
* 添加新用戶
*
* @param user
*/
@Override
public void updateUser(User user) throws Exception {
if (null == user || "".equals(user.getUsername())) throw new Exception("用戶信息不得為空");
User userOriginal = userDao.getUserById(user.getId());
if (null == userOriginal) throw new Exception("當(dāng)前用戶不存在");
userOriginal.setAge(user.getAge());
userOriginal.setSex(user.getSex());
userOriginal.setUsername(user.getUsername());
userOriginal.setPassword(user.getPassword());
userDao.updateUser(userOriginal);
}
@Override
public ApiResult delete(int id) {
userDao.delete(id);
ApiResult apiResult = new ApiResult();
apiResult.setSuccess(true);
apiResult.setCode("200");
return apiResult;
}
}
- dao
dao層為數(shù)據(jù)訪問層肝断,主要是用于與數(shù)據(jù)庫交互的,類似于倉儲(chǔ)層驰凛,這里UserDao主要是處理對(duì)應(yīng)的數(shù)據(jù)庫與用戶信息的交互胸懈,具體代碼如下:
/**
* 用戶映射接口(@Repository注解是把這個(gè)接口的一個(gè)實(shí)現(xiàn)類交給spring管理)
*/
@Repository
public interface UserDao {
/**
* 查找所有用戶列表
*
* @return
*/
List<User> getUserList();
/**
* 通過id查找用戶
*
* @param id
* @return
*/
User getUserById(int id);
/**
* 通過用戶名查詢用戶列表
*
* @param userName
* @return
*/
List<User> getUserByUserName(String userName);
/**
* 添加新用戶
*
* @param user
*/
void addUser(User user);
/**
* 更新用戶信息
*
* @param user
*/
void updateUser(User user);
/**
* 刪除用戶信息
* @param id
*/
void delete(int id);
}
- mapper
mapper主要是添加相關(guān)映射關(guān)系,來實(shí)現(xiàn)數(shù)據(jù)庫的增刪改查功能洒嗤,采用mybatis的mapper文件配置方式箫荡,不使用dao接口注解方式,此處的UserMapper.xml渔隶,在resources下新建mapper包羔挡,新建一個(gè)UserMapper.xml文件,用來處理數(shù)據(jù)庫用戶信息的增刪改查间唉,具體配置如下
<?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.jimmy.springbootmybatismysqldemo.dao.UserDao">
<select id="getUserList" resultType="com.jimmy.springbootmybatismysqldemo.entity.User">
SELECT * FROM t_user
</select>
<select id="getUserById" parameterType="Integer" resultType="com.jimmy.springbootmybatismysqldemo.entity.User">
SELECT * FROM t_user WHERE id = #{id}
</select>
<select id="getUserByUserName" parameterType="String" resultType="com.jimmy.springbootmybatismysqldemo.entity.User">
SELECT * FROM t_user WHERE userName = #{userName}
</select>
<insert id="addUser" parameterType="User" useGeneratedKeys="true" keyColumn="id">
insert into t_user(username, password,age, sex) values(#{username},#{password}, #{age}, #{sex})
</insert>
<update id="updateUser" parameterType="User">
update t_user set username=#{username}, password=#{password}, age=#{age}, sex=#{sex} where id=#{id}
</update>
<delete id="delete" parameterType="Integer">
delete from t_user where id=#{id}
</delete>
</mapper>
- entity
entity層一般用來存放實(shí)體绞灼,該部分一般即是用來完成數(shù)據(jù)庫對(duì)象與實(shí)體對(duì)象轉(zhuǎn)換的橋梁,這里實(shí)體User呈野,為了方便以及考慮后面Swagger中注釋的顯示問題低矮,需引入lombok及swagger相關(guān)包,可以詳細(xì)看代碼被冒,不贅述军掂,實(shí)體代碼如下:
@Data
@ApiModel(value = "User", description = "用戶信息")
public class User {
/**
* 用戶id
*/
@ApiModelProperty("用戶id")
private int id;
/**
* 用戶姓名
*/
@ApiModelProperty("用戶姓名")
private String username;
/**
* 用戶密碼
*/
@ApiModelProperty("用戶密碼")
private String password;
/**
* 年齡
*/
@ApiModelProperty("年齡")
private int age;
/**
* 性別
*/
@ApiModelProperty("性別")
private String sex;
}
- utils
utils中一般用于處理通用功能、幫助類等的昨悼,此處我們只是添加swagger3蝗锥,代碼上期說過,這里就直接貼代碼
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
//swagger設(shè)置率触,基本信息终议,要解析的接口及路徑等
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
//設(shè)置通過什么方式定位需要自動(dòng)生成文檔的接口,這里定位方法上的@ApiOperation注解
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
//接口URI路徑設(shè)置,any是全路徑穴张,也可以通過PathSelectors.regex()正則匹配
.paths(PathSelectors.any())
.build();
}
//生成接口信息细燎,包括標(biāo)題、聯(lián)系人皂甘,聯(lián)系方式等
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Swagger3接口文檔")
.description("如有疑問玻驻,請聯(lián)系開發(fā)工程師")
.contact(new Contact("jimmy", "http://www.reibang.com/u/6800502d6a89", "52247053@qq.com"))
.version("1.0")
.build();
}
}
- dto
dto層一般存儲(chǔ)的為接口交互的數(shù)據(jù)傳輸對(duì)象,用來方便輸入輸出對(duì)象封裝等偿枕,這里主要有2個(gè)击狮,一個(gè)用戶的dto:UserRequestDto,一個(gè)接口服務(wù)返回的結(jié)果:ApiResult益老,具體代碼如下:
@Data
@ApiModel(value = "User", description = "用戶信息")
public class UserRequestDto {
/**
* 用戶姓名
*/
@ApiModelProperty("用戶姓名")
private String username;
/**
* 用戶密碼
*/
@ApiModelProperty("用戶密碼")
private String password;
/**
* 年齡
*/
@ApiModelProperty("年齡")
private int age;
/**
* 性別
*/
@ApiModelProperty("性別")
private String sex;
}
@Data
@ApiModel(value = "服務(wù)執(zhí)行結(jié)果", description = "服務(wù)執(zhí)行結(jié)果")
public class ApiResult {
@ApiModelProperty("是否執(zhí)行成功")
private boolean isSuccess;
@ApiModelProperty("執(zhí)行結(jié)果編碼")
private String code;
@ApiModelProperty("錯(cuò)誤信息")
private String message;
}
五、具體代碼已上傳git
git地址:https://gitee.com/jimmyTown_admin_admin/springboot-mybatis-mysql-demo
六寸莫、文章參考文獻(xiàn)地址:
- SpringBoot整合Mybatis完整詳細(xì)版:https://blog.csdn.net/iku5200/article/details/82856621
- Mybatis配置文件詳解(4):http://www.reibang.com/p/5448403c6e3d