1. 程式人生 > 其它 >springboot + vue前後端分離後臺管理系統(二) -- 整合Mybatis Plus

springboot + vue前後端分離後臺管理系統(二) -- 整合Mybatis Plus

技術標籤:JAVAjavamysqlmybatis

前言

很多人喜歡使用JPA的快捷開發,個人喜歡mybatis可以自己寫sql。而mybaits plus可以很好的結合兩者的有點,有基礎的CRUD介面,還可以自定義mapper寫sql,比較靈活。get it !

準備工作

既然要引入mybatis plus,那麼久需要引入資料庫相關依賴,還有一些工具包。這邊還使用了lombok減少程式碼量,這個看情況引入,畢竟方便是方便,侵入性強一些,需要安裝外掛。然後開頭先弄個mybatis plus程式碼生成器,畢竟自己手動建檔案還是很累的。。。

引入maven依賴

完整的的pom.xml

<
dependencies
>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--mysql驅動--> <dependency> <groupId>mysql</groupId> <artifactId>
mysql-connector-java</artifactId> <version>8.0.22</version> </dependency> <!--druid資料來源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.4</version
>
</dependency> <!-- mybatis-plus 相關--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency> <!-- 程式碼生成器 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.4.1</version> </dependency> <!-- 模板引擎 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.2</version> </dependency> <!-- mybatis-plus 結束--> <!--以下是工具包--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.5.7</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.75</version> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> </dependencies>

新建user表

CREATE TABLE `user` (
  `id` varchar(32) NOT NULL,
  `username` varchar(32) NOT NULL COMMENT '使用者名稱',
  `password` varchar(64) NOT NULL COMMENT '密碼',
  `sex` char(1) DEFAULT NULL COMMENT '性別 0 女| 1 男',
  `locked` char(1) DEFAULT NULL COMMENT '是否鎖住 0 否 | 1 是',
  `create_time` datetime DEFAULT NULL COMMENT '建立時間',
  `create_by` varchar(32) DEFAULT NULL COMMENT '建立者',
  `update_time` datetime DEFAULT NULL COMMENT '更新時間',
  `update_by` varchar(32) DEFAULT NULL COMMENT '更新者',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

配置程式碼生成器

新建一個CodeGenerator.java

public class CodeGenerator {
    public static void create() throws FileNotFoundException {
        String projectPath = System.getProperty("user.dir");
         // 1、宣告程式碼生成器
         AutoGenerator generator = new AutoGenerator();
         // 2、全域性資訊配置
         GlobalConfig globalConfig = new GlobalConfig();
         globalConfig
                        // 輸出目錄
         .setOutputDir(projectPath + "/src/main/java")
                        // 是否覆蓋原有檔案 預設false
         .setFileOverride(true)
                        // 是否開啟輸出目錄 預設true
         .setOpen(false)
                        // 作者
         .setAuthor("ify")
                        // 設定實體類名稱
         .setEntityName("%s")
                        // 設定mapper 命名方式
         .setMapperName("%sDao")
                        // Mapper xml 命名方式
         .setXmlName("%sDao")
                        //service 命名方式
         .setServiceName("%sService")
                        //service impl 命名方式
         .setServiceImplName("%sServiceImpl")
                        //controller 命名方式
         .setControllerName("%sController")
                        // Mapper xml 生成基礎 查詢列 可以不設定
         .setBaseColumnList(true)
                        //Mapper xml 生成基礎返回map 可以不設定
         .setBaseResultMap(true);
         // 3、資料來源配置
         DataSourceConfig dataSourceConfig = new DataSourceConfig();
         // 設定資料庫型別和資料來源
         dataSourceConfig.setDbType(DbType.MYSQL)
                        .setDriverName("com.mysql.cj.jdbc.Driver")
                        .setUrl("jdbc:mysql://localhost:3306/sample-admin?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B8")
                        .setUsername("root")
                        .setPassword("123456");
         // 4、策略配置
         StrategyConfig strategyConfig = new StrategyConfig();
         strategyConfig
                        // 資料庫表對映實體 下劃線轉大寫,駝峰命名方式
         .setNaming(NamingStrategy.underline_to_camel)
                        // 資料庫欄位對映實體屬性 下劃線轉大寫,駝峰命名方式
         .setColumnNaming(NamingStrategy.underline_to_camel)
                        // 生成 @RestController 控制器
         .setRestControllerStyle(true)
                        // 設定controller繼承的父類
         .setSuperControllerClass(BaseController.class)
                        // entity繼承的父類
         .setSuperEntityClass(BaseEntity.class)
                        // entity繼承類的欄位
         .setSuperEntityColumns("id", "create_by", "create_time", "update_by", "update_time")
                        // 是否生成lombok模式
         .setEntityLombokModel(true)
                        //要生成的表名
         .setInclude("user");
         // 設定表字首,生成的實體名稱不包含字首
        //        if (StrUtil.isNotEmpty() {
        //            strategyConfig.setTablePrefix();
        //        }
         // 5、生成程式碼包資訊配置
         PackageConfig packageConfig = new PackageConfig();
         packageConfig
                        // 設定生成的包名的父類名稱
         .setParent("com.ify.sampleAdmin.web")
                        .setController("controller")
                        .setEntity("entity")
                        .setMapper("dao")
                        .setService("service")
                        .setServiceImpl("service.impl");
         //xml 自定義輸出到java 資料夾下,所以下面自定義輸出路徑
         //                .setXml(mapper");
         // 6、自定義要注入到模板的屬性
         InjectionConfig injectionConfig = new InjectionConfig() {
                    // 必須實現的方法, 內容可以放空
         @Override
         public void initMap() {
        //                Map<String, Object> map = new HashMap<>(4);
        //                map.put("moduleName", "");
        //                map.put("description", "");
        //                this.setMap(map);
         }
                };
         List<FileOutConfig> fileOutConfigList = new ArrayList<>();
         FileOutConfig fileOutConfig = new FileOutConfig("/templates/mapper.xml.vm") {
                    @Override
         public String outputFile(TableInfo tableInfo) {
                        return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Dao" + StringPool.DOT_XML;
         }
                };
         fileOutConfigList.add(fileOutConfig);
         injectionConfig.setFileOutConfigList(fileOutConfigList);
         // 7 自定義模板~~~~
         TemplateConfig templateConfig = new TemplateConfig();
         // xml自定義輸出路徑,所以設定為null
         templateConfig.setXml(null);
         // 8、整合配置
         generator.setGlobalConfig(globalConfig)
                        .setDataSource(dataSourceConfig)
                        .setStrategy(strategyConfig)
                        .setPackageInfo(packageConfig)
                        .setTemplate(templateConfig)
                        .setCfg(injectionConfig);
         //9、執行
         generator.execute();
    }
    public static void main(String[] args) throws FileNotFoundException {
        create();
    }
}

公共欄位提取到BaseEntity.java

@Data
public class BaseEntity {
    /**
     * id 生成策略為UUID
     */ @TableId(type = IdType.ASSIGN_UUID)
    private String id;
     /**
     * 建立者 填充策略為插入自動填充
     */
     @TableField(fill = FieldFill.INSERT)
    private String createBy;
     /**
     * 建立時間 填充策略為插入自動填充
     */
     @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
     /**
     * 更新者 填充策略為更新自動填充
     */
     @TableField(fill = FieldFill.UPDATE)
    private String updateBy;
     /**
     * 更新時間 填充策略為更新自動填充
     */
     @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;
}

然後新建一個自動填充策略類MpMetaObjectHandler.java

public class MpMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入時的填充策略
     * @param metaObject
     */
     @Override
     public void insertFill(MetaObject metaObject) {
            // 起始版本 3.3.0(推薦使用)
     this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
     this.strictInsertFill(metaObject, "createBy", String.class, "ify");
     }
        /**
     * 更新時的填充策略
     * @param metaObject
     */
     @Override
     public void updateFill(MetaObject metaObject) {
            // 起始版本 3.3.0(推薦)
     this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
     this.strictUpdateFill(metaObject, "updateBy", String.class, "ify");
     }
}

新建一個mybatis plus的配置類注入填充策略Bean

@Configuration
public class MybatisPlusConfig {
    /**
     * 相當於頂部的:@MapperScan("com.ify.sample.module.*.dao")
     * {@code @MapperScan("com.ify.sample.module.*.dao")}
     * 這裡可以擴充套件,比如使用配置檔案來配置掃描Mapper的路徑
     */
     @Bean
     public MapperScannerConfigurer mapperScannerConfigurer() {
            MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer();
     scannerConfigurer.setBasePackage("com.ify.sampleAdmin.web.dao");
     return scannerConfigurer;
     }
     
    /**
     * 新的分頁外掛,一緩和二緩遵循mybatis的規則,需要設定 MybatisConfiguration#useDeprecatedExecutor = false 避免快取出現問題(該屬性會在舊外掛移除後一同移除)
     */ @Bean
     public MybatisPlusInterceptor mybatisPlusInterceptor() {
            MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
     interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
     return interceptor;
     }
     
    /**
     * 公共欄位自動填充策略
     *
     * @return
     */
     @Bean
     public MpMetaObjectHandler mpMetaObjectHandler() {
            return new MpMetaObjectHandler();
     }
}

生成程式碼

User.java

@Data
@EqualsAndHashCode(callSuper = true)
@TableName("user")
public class User extends BaseEntity {
    private static final long serialVersionUID = 1L;
     /**
     * 使用者名稱
     */
     private String username;
     /**
     * 密碼
     */
     private String password;
     /**
     * 性別 0 女| 1 男
     */
     private String sex;
     /**
     * 是否鎖住 0 否 | 1 是
     */
     private String locked;
}

UserDao.java

public interface UserDao extends BaseMapper<User> {

}

UserService.java

public interface UserService extends IService<User> {

}

UserServiceImpl.java

@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {

}

UserController.java

@RestController
@RequestMapping("/user")
public class UserController extends BaseController {

}

測試使用Mybatis Plus

插入一條admin使用者,方便測試直接用get請求,

@Autowired
private UserService userService;

@GetMapping("users")
public void users() {
    User user = new User();
    user.setUsername("admin");
    user.setPassword("123456");
    user.setLocked("0");
    user.setSex("1");
    this.userService.save(user);
}

操作成功,id、建立者和建立時間自動填充
image.png

獲取使用者列表

@Autowired
private UserService userService;

@GetMapping("users")
public String users() {
    List<User> userList = this.userService.list();
    return JSONObject.toJSONString(userList);
}

image.png

完美!~~~~