Spring Boot入門系列(六)Spring Boot如何整合Mybatis【附詳細步驟】

  • 2020 年 3 月 16 日
  • 筆記

前面介紹了Spring Boot 中的整合Thymeleaf前端html框架,同時也介紹了Thymeleaf 的用法。不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html

今天主要講解Springboot整合Mybatis,並實現最基本的增刪改查功能。Spring Boot整合Mybatis的方式有兩種:一種是註解形式的,也就是沒有Mapper.xml文件,還有一種是XML形式的,我推薦的是使用註解形式,為什麼呢?因為更加的簡介,減少不必要的錯誤。

 

一、整合Mybatis

第一步:數據庫新建Person表

這個表結構很簡單,就是普通的用戶表。

CREATE TABLE `sys_user` (    `id` varchar(32) NOT NULL DEFAULT '',    `username` varchar(32) DEFAULT NULL,    `password` varchar(64) DEFAULT NULL,    `nickname` varchar(64) DEFAULT NULL,    `age` int(11) DEFAULT NULL,    `sex` int(11) DEFAULT NULL,    `job` int(11) DEFAULT NULL,    `face_image` varchar(6000) DEFAULT NULL,    `province` varchar(64) DEFAULT NULL,    `city` varchar(64) DEFAULT NULL,    `district` varchar(64) DEFAULT NULL,    `address` varchar(255) DEFAULT NULL,    `auth_salt` varchar(64) DEFAULT NULL,    `last_login_ip` varchar(64) DEFAULT NULL,    `last_login_time` datetime DEFAULT NULL,    `is_delete` int(11) DEFAULT NULL,    `regist_time` datetime DEFAULT NULL,    PRIMARY KEY (`id`)  ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 

第二步:增加mybatis相關依賴

我們只需要加上pom.xml文件這些依賴即可。

       <dependency>              <groupId>mysql</groupId>              <artifactId>mysql-connector-java</artifactId>              <version>5.1.41</version>          </dependency>          <!--mybatis-->          <dependency>              <groupId>org.mybatis.spring.boot</groupId>              <artifactId>mybatis-spring-boot-starter</artifactId>              <version>1.3.1</version>          </dependency>          <!--mapper-->          <dependency>              <groupId>tk.mybatis</groupId>              <artifactId>mapper-spring-boot-starter</artifactId>              <version>1.2.4</version>          </dependency>          <!-- pagehelper -->          <dependency>              <groupId>com.github.pagehelper</groupId>              <artifactId>pagehelper-spring-boot-starter</artifactId>              <version>1.2.3</version>          </dependency>          <!-- druid 數據庫連接框架-->          <dependency>              <groupId>com.alibaba</groupId>              <artifactId>druid-spring-boot-starter</artifactId>              <version>1.1.9</version>          </dependency>          <dependency>              <groupId>org.mybatis.generator</groupId>              <artifactId>mybatis-generator-core</artifactId>              <version>1.3.2</version>              <scope>compile</scope>              <optional>true</optional>          </dependency>

 

第三步:增加統一的mapper接口

在utils包中創建一個統一的mapper接口,
後面所有的mapper類都會繼承這個接口
package com.weiz.utils;    import tk.mybatis.mapper.common.Mapper;  import tk.mybatis.mapper.common.MySqlMapper;    /**   * 繼承自己的MyMapper   *   * @author weiz   * @since 2019-09-06 21:53   */  public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {      //TODO      //FIXME 特別注意,該接口不能被掃描到,否則會出錯  }

特別注意:該接口不能被掃描到,否則會出錯。所以我把這個接口放在了utils包中。

 

第四步:更改application.properties配置文件

主要是mybatis相關的數據庫配置。

############################################################  # 數據源相關配置,這裡用的是阿里的druid 數據源  ############################################################  spring.datasource.url=jdbc:mysql://localhost:3306/zwz_test  spring.datasource.username=root  spring.datasource.password=root  spring.datasource.driver-class-name=com.mysql.jdbc.Driver  spring.datasource.druid.initial-size=1  spring.datasource.druid.min-idle=1  spring.datasource.druid.max-active=20  spring.datasource.druid.test-on-borrow=true  spring.datasource.druid.stat-view-servlet.allow=true    ############################################################  # mybatis 相關配置  ############################################################  mybatis.type-aliases-package=com.weiz.pojo  mybatis.mapper-locations=classpath:mapper/*.xml  mapper.mappers=com.weiz.utils.MyMapper    #這個MyMapper 就是我之前創建的mapper統一接口。後面所有的mapper類都會繼承這個接口  mapper.not-empty=false  mapper.identity=MYSQL  # 分頁框架  pagehelper.helperDialect=mysql  pagehelper.reasonable=true  pagehelper.supportMethodsArguments=true  pagehelper.params=count=countSql

這裡的配置有點多,不過最基本的配置都在這。

 

二、代碼自動生成工具

Spring Boot有mybatis  generator自動生成代碼插件,能自動生成pojo實體類、接口、mapper.xml 文件,提高開發效率。這裡就不介紹怎麼安裝使用mybatis  generator插件。介紹一個簡單的GeneratorDisplay自動生成類。

第五步:創建GeneratorDisplay類

package com.weiz.utils;    import java.io.File;  import java.util.ArrayList;  import java.util.List;    import org.mybatis.generator.api.MyBatisGenerator;  import org.mybatis.generator.config.Configuration;  import org.mybatis.generator.config.xml.ConfigurationParser;  import org.mybatis.generator.internal.DefaultShellCallback;    public class GeneratorDisplay {        public void generator() throws Exception{            List<String> warnings = new ArrayList<String>();          boolean overwrite = true;          //指定 逆向工程配置文件          File configFile = new File("generatorConfig.xml");          ConfigurationParser cp = new ConfigurationParser(warnings);          Configuration config = cp.parseConfiguration(configFile);          DefaultShellCallback callback = new DefaultShellCallback(overwrite);          MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,                  callback, warnings);          myBatisGenerator.generate(null);        }        public static void main(String[] args) throws Exception {          try {              GeneratorDisplay generatorSqlmap = new GeneratorDisplay();              generatorSqlmap.generator();          } catch (Exception e) {              e.printStackTrace();          }        }  }

這個其實也是調用mybatis generator實現的。跟mybatis generator安裝插件是一樣的。

 

第六步:增加generatorConfig.xml配置文件

在resources文件下創建generatorConfig.xml文件,配置如下:

<?xml version="1.0" encoding="UTF-8"?>  <!DOCTYPE generatorConfiguration          PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"          "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">    <generatorConfiguration>      <context id="MysqlContext" targetRuntime="MyBatis3Simple" defaultModelType="flat">          <property name="beginningDelimiter" value="`"/>          <property name="endingDelimiter" value="`"/>            <plugin type="tk.mybatis.mapper.generator.MapperPlugin">              <property name="mappers" value="com.weiz.utils.MyMapper"/>          </plugin>       <!-- 數據庫連接配置-->           <jdbcConnection driverClass="com.mysql.jdbc.Driver"                          connectionURL="jdbc:mysql://localhost:3306/zwz_test"                          userId="root"                          password="root">          </jdbcConnection>            <!-- 對於生成的pojo所在包 -->          <javaModelGenerator targetPackage="com.weiz.pojo" targetProject="src/main/java"/>            <!-- 對於生成的mapper所在目錄 -->          <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/>            <!-- 配置mapper對應的java映射 -->          <javaClientGenerator targetPackage="com.weiz.mapper" targetProject="src/main/java"                               type="XMLMAPPER"/>              <table tableName="sys_user"></table>        </context>  </generatorConfiguration>

注意:利用Mybatis Generator自動生成代碼,對於已經存在的文件會存在覆蓋和在原有文件上追加的可能性,不宜多次生成。如需重新生成,需要刪除已生成的源文件。

 

第七步:Mybatis Generator自動生成代碼

運行GeneratorDisplay 如下圖所示,即可自動生成相關的代碼。

 

第八步:在service包下創建UserService及UserServiceImpl接口實現類

1. 創建com.weiz.service包,添加UserService接口類

package com.weiz.service;    import com.weiz.pojo.SysUser;    import java.util.List;    public interface UserService {        public void saveUser(SysUser user) throws Exception;        public void updateUser(SysUser user);        public void deleteUser(String userId);        public SysUser queryUserById(String userId);        public List<SysUser> queryUserList(SysUser user);        public List<SysUser> queryUserListPaged(SysUser user, Integer page, Integer pageSize);public void saveUserTransactional(SysUser user);  }

2. 創建com.weiz.service.impl包,並增加UserServiceImpl實現類
package com.weiz.service.impl;    import com.github.pagehelper.PageHelper;  import com.weiz.mapper.SysUserMapper;  import com.weiz.mapper.SysUserMapperCustom;  import com.weiz.pojo.SysUser;  import com.weiz.service.UserService;  import org.springframework.beans.factory.annotation.Autowired;  import org.springframework.stereotype.Service;  import org.thymeleaf.util.StringUtils;  import tk.mybatis.mapper.entity.Example;    import java.util.List;    @Service  public class UserServiceImpl implements UserService {        @Autowired      private SysUserMapper userMapper;        @Override      public void saveUser(SysUser user) throws Exception {          userMapper.insert(user);      }        @Override      public void updateUser(SysUser user) {          userMapper.updateByPrimaryKeySelective(user);      }        @Override      public void deleteUser(String userId) {          userMapper.deleteByPrimaryKey(userId);      }        @Override      public SysUser queryUserById(String userId) {          return userMapper.selectByPrimaryKey(userId);      }        @Override      public List<SysUser> queryUserList(SysUser user) {          return null;      }        @Override      public List<SysUser> queryUserListPaged(SysUser user, Integer page, Integer pageSize) {
     // 分頁功能實現 PageHelper.startPage(page,pageSize); Example example
= new Example(SysUser.class); Example.Criteria criteria = example.createCriteria(); if (!StringUtils.isEmptyOrWhitespace(user.getUsername())) { criteria.andLike("username", "%" + user.getUsername() + "%"); } if (!StringUtils.isEmptyOrWhitespace(user.getNickname())) { criteria.andLike("nickname", "%" + user.getNickname() + "%"); } List<SysUser> userList = userMapper.selectByExample(example); return userList; } @Override public void saveUserTransactional(SysUser user) { } }

 

第九步:編寫controller層,增加MybatisController控制器

package com.weiz.controller;    import com.weiz.utils.JSONResult;  import com.weiz.pojo.SysUser;  import com.weiz.service.UserService;  import org.n3r.idworker.Sid;  import org.springframework.beans.factory.annotation.Autowired;  import org.springframework.web.bind.annotation.RequestMapping;  import org.springframework.web.bind.annotation.RestController;    import java.util.Date;  import java.util.List;    @RestController  @RequestMapping("mybatis")  public class MyBatisCRUDController {        @Autowired      private UserService userService;        @Autowired      private Sid sid;        @RequestMapping("/saveUser")      public JSONResult saveUser() throws Exception {       // 自動生成ID,也可以直接用uuid          String userId = sid.nextShort();            SysUser user = new SysUser();          user.setId(userId);          user.setUsername("spring boot" + new Date());          user.setNickname("spring boot" + new Date());          user.setPassword("abc123");          user.setIsDelete(0);          user.setRegistTime(new Date());            userService.saveUser(user);            return JSONResult.ok("保存成功");      }        @RequestMapping("/updateUser")      public JSONResult updateUser() {            SysUser user = new SysUser();          user.setId("10011001");          user.setUsername("10011001-updated" + new Date());          user.setNickname("10011001-updated" + new Date());          user.setPassword("10011001-updated");          user.setIsDelete(0);          user.setRegistTime(new Date());            userService.updateUser(user);            return JSONResult.ok("保存成功");      }          @RequestMapping("/deleteUser")      public JSONResult deleteUser(String userId) {            userService.deleteUser(userId);            return JSONResult.ok("刪除成功");      }        @RequestMapping("/queryUserById")      public JSONResult queryUserById(String userId) {            return JSONResult.ok(userService.queryUserById(userId));      }        @RequestMapping("/queryUserList")      public JSONResult queryUserList() {            SysUser user = new SysUser();          user.setUsername("spring boot");          user.setNickname("lee");            List<SysUser> userList = userService.queryUserList(user);            return JSONResult.ok(userList);      }        @RequestMapping("/queryUserListPaged")      public JSONResult queryUserListPaged(Integer page) {          if (page == null) {              page = 1;          }            int pageSize = 10;            SysUser user = new SysUser();            List<SysUser> userList = userService.queryUserListPaged(user, page, pageSize);            return JSONResult.ok(userList);      }        @RequestMapping("/queryUserByIdCustom")      public JSONResult queryUserByIdCustom(String userId) {            return JSONResult.ok(userService.queryUserByIdCustom(userId));      }        @RequestMapping("/saveUserTransactional")      public JSONResult saveUserTransactional() {            String userId = sid.nextShort();            SysUser user = new SysUser();          user.setId(userId);          user.setUsername("lee" + new Date());          user.setNickname("lee" + new Date());          user.setPassword("abc123");          user.setIsDelete(0);          user.setRegistTime(new Date());            userService.saveUserTransactional(user);            return JSONResult.ok("保存成功");      }      }

 

第十步:在啟動主類添加掃描器

SpringBootStarterApplication 啟動類中增加包掃描器。

@SpringBootApplication
//掃描 mybatis mapper 包路徑
@MapperScan(basePackages = "com.weiz.mapper") // 這一步別忘了。
//掃描 所有需要的包, 包含一些自用的工具類包 所在的路徑
@ComponentScan(basePackages = {"com.weiz","org.n3r.idworker"})
public class SpringBootStarterApplication {

public static void main(String[] args) {
SpringApplication.run(SpringBootStarterApplication.class, args);
}

}

 

第十一步:測試

在瀏覽器輸入controller裏面定義的路徑即可。只要你按照上面的步驟一步一步來,基本上就沒問題,是不是特別簡單。

 

 

最後

以上,就把Spring Boot整合Mybatis及實現增刪改查介紹完了,Spring Boot 整合Mybatis 是整個Spring Boot 非常重要的功能,也是非常核心的基礎功能,希望大家能夠熟練掌握。後面會深入介紹Spring Boot的各個功能和用法。

這個系列課程的完整源碼,也會提供給大家。大家關注我的微信公眾號(架構師精進),回復:springboot源碼。獲取這個系列課程的完整源碼。