spring-boot-mybatis-plus

Spring-boot-Mybatis-Plus

Mybatis-Plus-Generator

// 代碼生成器
    AutoGenerator mpg = new AutoGenerator();

    // 全局配置
    GlobalConfig gc = new GlobalConfig();
    String projectPath = System.getProperty("user.dir");
    gc.setOutputDir(projectPath + "/spring/springboot/spring-boot-mybatis-plus/src/main/java");
    gc.setAuthor("shawn");
    gc.setOpen(false);
    gc.setServiceName("%sService");
    gc.setFileOverride(true);
    gc.setIdType(IdType.AUTO);
    gc.setDateType(DateType.ONLY_DATE);
    // gc.setSwagger2(true); 實體屬性 Swagger2 注解
    mpg.setGlobalConfig(gc);

    // 數(shù)據(jù)源配置
    DataSourceConfig dsc = new DataSourceConfig();
    dsc.setUrl(
        "jdbc:mysql://localhost:3306/spring-boot-demo?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai");
    // dsc.setSchemaName("public");
    dsc.setDriverName("com.mysql.cj.jdbc.Driver");
    dsc.setUsername("root");
    dsc.setPassword("Gepoint");
    dsc.setDbType(DbType.MYSQL);
    mpg.setDataSource(dsc);

    // 包配置
    PackageConfig pc = new PackageConfig();
    pc.setParent("com.shawn.spring.boot.mybatisplus");
    pc.setController("controller");
    pc.setService("service");
    pc.setEntity("entity");
    pc.setMapper("mapper");
    mpg.setPackageInfo(pc);

    // 策略配置
    StrategyConfig strategy = new StrategyConfig();
    strategy.setNaming(NamingStrategy.underline_to_camel);
    strategy.setColumnNaming(NamingStrategy.underline_to_camel);
    strategy.setControllerMappingHyphenStyle(true);
    strategy.setEntityLombokModel(true);
    strategy.setRestControllerStyle(true);
    strategy.setTablePrefix("t_");
    mpg.setStrategy(strategy);
    mpg.execute();

參考官方文檔

spring-boot-mybatis-plus

  1. pom.xml

    <dependencies>
        <dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        <dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>mybatis-plus-generator</artifactId>
        </dependency>
        <dependency>
          <groupId>org.apache.velocity</groupId>
          <artifactId>velocity-engine-core</artifactId>
        </dependency>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
        </dependency>
      </dependencies>
    
  2. application.yaml

    spring.datasource.url: jdbc:mysql://127.0.0.1:3306/spring-boot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8
    spring.datasource.username: root
    spring.datasource.password: Gepoint
    spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
    
    # mybatis-plus
    mybatis-plus.mapper-locations: classpath:mapper/**/*.xml
    mybatis-plus.type-aliases-package: com.shawn.spring.boot.mybatisplus.entity
    mybatis-plus.global-config.db-config.id-type: AUTO
    mybatis-plus.global-config.db-config.table-underline: true
    mybatis-plus.global-config.db-config.logic-delete-value: 1
    mybatis-plus.global-config.db-config.logic-not-delete-value: 0
    mybatis-plus.configuration.cache-enabled: true
    mybatis-plus.configuration.map-underscore-to-camel-case: true
    
  3. entity

    @Data
    @EqualsAndHashCode(callSuper = false)
    @TableName("t_menu")
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class Menu implements Serializable {
    
      private static final long serialVersionUID = 1L;
    
      @TableId(value = "menu_id", type = IdType.AUTO)
      private Long menuId;
    
      /** 父菜單ID痊末,一級菜單為0 */
      private Long parentId;
    
      /** 菜單名稱 */
      private String name;
    
      /** 菜單URL */
      private String url;
    
      /** 類型 0:目錄 1:菜單 2:按鈕 */
      private Integer type;
    
      /** 排序 */
      private Integer orderNum;
    
      /** 創(chuàng)建時間 */
      @TableField(fill = FieldFill.INSERT)
      private Date createTime;
    
      /** 修改時間 */
      @TableField(fill = FieldFill.INSERT_UPDATE)
      private Date updateTime;
    
      /** 狀態(tài) 0:禁用 1:正常 */
      @TableLogic private Integer isDeleted;
    }
    
  4. mapper

    public interface RoleMapper extends BaseMapper<Role> {
    
      @Insert({
        "insert into t_role (role_name, remark, ",
        "create_time, update_time, ",
        "is_deleted)",
        "values (#{roleName,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, ",
        "#{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, ",
        "#{isDeleted,jdbcType=TINYINT})"
      })
      @SelectKey(
          statement = "SELECT LAST_INSERT_ID()",
          keyProperty = "roleId",
          before = false,
          resultType = Long.class)
      int insertReturnKey(Role record);
    }
    
  5. service

    @Service
    public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {
    
      @Override
      public int saveReturnKey(Role role) {
        return getBaseMapper().insertReturnKey(role);
      }
    }
    
  6. config

    @Component
    @Slf4j
    public class MybatisPlusCommonFieldHandler implements MetaObjectHandler {
    
      @Override
      public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        Date time = Calendar.getInstance().getTime();
        this.setFieldValByName("createTime", time, metaObject);
        this.setFieldValByName("updateTime", time, metaObject);
      }
    
      @Override
      public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        this.setFieldValByName("updateTime", Calendar.getInstance().getTime(), metaObject);
      }
    }
    
    
    @Configuration
    @EnableTransactionManagement
    @MapperScan("com.shawn.spring.boot.mybatisplus.mapper")
    public class MybatisPlusConfig {
    
      // 分頁插件
      @Bean
      public PaginationInnerInterceptor paginationInterceptor() {
        PaginationInnerInterceptor interceptor = new PaginationInnerInterceptor();
        interceptor.setDbType(DbType.MYSQL);
        interceptor.setMaxLimit(500l);
        return interceptor;
      }
    
      @Bean
      public LogicDeleteByIdWithFill sqlInjector() {
        return new LogicDeleteByIdWithFill();
      }
    }
    
  7. runner

    @Component
    @Slf4j
    public class MybatisPlusRunner implements ApplicationRunner {
    
      @Autowired private UserService userService;
      @Autowired private RoleService roleService;
      @Autowired private MenuService menuService;
      @Autowired private RoleMenuService roleMenuService;
      @Autowired private UserRoleService userRoleService;
    
      @Override
      public void run(ApplicationArguments args) throws Exception {
        newMenu();
        queryMenuById();
        newRole();
        queryRoleById();
        queryByLikeName();
        queryMenuByRoleId();
        newUser();
        login();
        queryRolesByUserId();
        queryMenusByPid();
        testPageQuery();
      }
    
      public void newMenu() {
        Menu menu =
            Menu.builder()
                .name("系統(tǒng)管理")
                .orderNum(1)
                .parentId(Long.valueOf(0))
                .url("/")
                .type(MenuTypeEnum.CATALOG_TYPE.getCode())
                .isDeleted(0)
                .build();
        menuService.save(menu);
        log.info("success create new menu");
      }
    
      public void queryMenuById() {
        Menu menu = menuService.getById(1);
        log.info("queryMenuById: {}", menu.toString());
      }
    
      public void newRole() {
        Role role = Role.builder().remark("系統(tǒng)管理員").roleName("系統(tǒng)管理員").isDeleted(0).build();
        int key = roleService.saveReturnKey(role);
        roleMenuService.save(RoleMenu.builder().menuId(1l).roleId(Long.valueOf(key)).build());
        log.info("success create new role");
      }
    
      public void queryRoleById() {
        log.info("queryRoleById: {}", roleService.getById(2));
      }
    
      public void queryByLikeName() {
        QueryWrapper<Role> queryWrapper = new QueryWrapper<>();
        queryWrapper.like("role_name", "系統(tǒng)");
        roleService.list(queryWrapper);
        List<Role> roleList = roleService.list(queryWrapper);
        if (!CollectionUtils.isEmpty(roleList)) {
          roleList.forEach(role -> log.info("queryByLikeName: {}", role.toString()));
        }
      }
    
      public void queryMenuByRoleId() {
        QueryWrapper<RoleMenu> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("role_id", 2);
        List<RoleMenu> menuList = roleMenuService.list(queryWrapper);
        if (!CollectionUtils.isEmpty(menuList)) {
          menuList.forEach(menu -> log.info("queryMenuByRoleId: {}", menu.toString()));
        }
      }
    
      public void newUser() {
        User shawn =
            User.builder()
                .email("1111@qq.com")
                .mobile("12345678901")
                .password("123456")
                .salt("12345")
                .username("shawn")
                .isDeleted(0)
                .build();
        int i = userService.saveReturnKey(shawn);
        userRoleService.save(UserRole.builder().roleId(1l).userId(Long.valueOf(i)).build());
        log.info("success create new user");
      }
    
      public void login() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username", "admin").and(wrapper -> wrapper.eq("password", "123456"));
        List<User> list = userService.list(queryWrapper);
        if (CollectionUtils.isEmpty(list) || list.size() > 1) {
          log.error("login failed! username: {}, password: {}", "shawn", "123456");
        } else {
          User shawn = list.get(0);
          log.info("login success! {}", shawn.toString());
        }
      }
    
      public void queryRolesByUserId() {
        QueryWrapper<UserRole> wrapper = new QueryWrapper<>();
        wrapper.eq("user_id", 1l);
        List<UserRole> roleList = userRoleService.list(wrapper);
        if (!CollectionUtils.isEmpty(roleList)) {
          roleList.forEach(role -> log.info("queryRolesByUserId: {}", role.toString()));
        }
      }
    
      public void queryMenusByPid() {
        QueryWrapper<Menu> wrapper = new QueryWrapper<>();
        wrapper.eq("parent_id", 0);
        List<Menu> menuList = menuService.list(wrapper);
        if (!CollectionUtils.isEmpty(menuList)) {
          menuList.forEach(menu -> log.info("queryMenusByPid: {}", menu.toString()));
        }
      }
    
      public void testPageQuery() {
        Page<User> page = new Page<>(1, 3);
        userService.selectByPage(page);
        log.info("data: {}", page.getRecords());
        log.info("total: {}", page.getTotal());
      }
    }
    
  8. main class

@SpringBootApplication
public class MybatisPlusApplication {

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

上述代碼不全喉前,請參考源碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市魔眨,隨后出現(xiàn)的幾起案子棉安,更是在濱河造成了極大的恐慌底扳,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贡耽,死亡現(xiàn)場離奇詭異衷模,居然都是意外死亡,警方通過查閱死者的電腦和手機蒲赂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門阱冶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人滥嘴,你說我怎么就攤上這事木蹬。” “怎么了若皱?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵镊叁,是天一觀的道長。 經(jīng)常有香客問我走触,道長意系,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任饺汹,我火速辦了婚禮蛔添,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兜辞。我一直安慰自己迎瞧,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布逸吵。 她就那樣靜靜地躺著凶硅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扫皱。 梳的紋絲不亂的頭發(fā)上足绅,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天捷绑,我揣著相機與錄音,去河邊找鬼氢妈。 笑死粹污,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的首量。 我是一名探鬼主播壮吩,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼加缘!你這毒婦竟也來了鸭叙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤拣宏,失蹤者是張志新(化名)和其女友劉穎沈贝,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勋乾,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡缀程,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了市俊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡滤奈,死狀恐怖摆昧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜒程,我是刑警寧澤绅你,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站昭躺,受9級特大地震影響忌锯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜领炫,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一偶垮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帝洪,春花似錦似舵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至砰奕,卻和暖如春蛛芥,著一層夾襖步出監(jiān)牢的瞬間提鸟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工仅淑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留称勋,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓漓糙,卻偏偏與公主長得像铣缠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子昆禽,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345