來一個(gè)springboot+mybatis+mysql+swagger3的示例

一、介紹

  上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)確工作及說明

  1. 準(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;
  1. 大概運(yùn)行的示例圖
    image.png
  2. Swagger運(yùn)行結(jié)果
    image.png
  3. 項(xiàng)目代碼結(jié)構(gòu)
    image.png

四晴裹、整體代碼詳細(xì)說明

  1. 本文是采用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使依賴包正常拉取并編譯成功

  1. 按項(xiàng)目代碼結(jié)構(gòu)中赞别,我們依次講解相關(guān)代碼
    • controller層
      該處用于向外提供接口服務(wù)畏陕,此處添加UserController的api接口,實(shí)現(xiàn)增刪改查仿滔,相關(guān)注解詳細(xì)請參看上2篇說明惠毁,此處先貼入代碼
     /**
* 在接口類上添加@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)地址:

  1. SpringBoot整合Mybatis完整詳細(xì)版:https://blog.csdn.net/iku5200/article/details/82856621
  2. Mybatis配置文件詳解(4):http://www.reibang.com/p/5448403c6e3d
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捺萌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子膘茎,更是在濱河造成了極大的恐慌桃纯,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件披坏,死亡現(xiàn)場離奇詭異态坦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)棒拂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門伞梯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帚屉,你說我怎么就攤上這事谜诫。” “怎么了攻旦?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵喻旷,是天一觀的道長。 經(jīng)常有香客問我牢屋,道長且预,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任烙无,我火速辦了婚禮锋谐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘皱炉。我一直安慰自己怀估,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著多搀,像睡著了一般歧蕉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上康铭,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天惯退,我揣著相機(jī)與錄音,去河邊找鬼从藤。 笑死催跪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夷野。 我是一名探鬼主播懊蒸,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悯搔!你這毒婦竟也來了骑丸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤妒貌,失蹤者是張志新(化名)和其女友劉穎通危,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灌曙,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菊碟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了在刺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逆害。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖增炭,靈堂內(nèi)的尸體忽然破棺而出忍燥,到底是詐尸還是另有隱情,我是刑警寧澤隙姿,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布梅垄,位于F島的核電站,受9級(jí)特大地震影響输玷,放射性物質(zhì)發(fā)生泄漏队丝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一欲鹏、第九天 我趴在偏房一處隱蔽的房頂上張望机久。 院中可真熱鬧,春花似錦赔嚎、人聲如沸膘盖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侠畔。三九已至结缚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間软棺,已是汗流浹背红竭。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喘落,地道東北人茵宪。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像瘦棋,于是被迫代替她去往敵國和親稀火。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容