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);

    // 数据源配置
    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;
    
      /** 创建时间 */
      @TableField(fill = FieldFill.INSERT)
      private Date createTime;
    
      /** 修改时间 */
      @TableField(fill = FieldFill.INSERT_UPDATE)
      private Date updateTime;
    
      /** 状态 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("系统管理")
                .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("系统管理员").roleName("系统管理员").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", "系统");
        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);
  }
}

上述代码不全,请参考源码

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345