• MyBatis Generator使用总结


    介绍

    MyBatis Generator (MBG) 是 MyBatis 的代码生成器。它能够根据数据库表,自动生成 java 实体类、dao 层接口(mapper 接口)及mapper.xml文件。

    具体使用

    数据准备

    创建数据库(8.0版本)mybatis,并添加一张表rbac_user,用于测试

    CREATE TABLE `rbac_user` (
      `id` int NOT NULL AUTO_INCREMENT COMMENT '主鍵',
      `name` varchar(100) DEFAULT NULL COMMENT '用户名',
      `email` varchar(100) DEFAULT NULL COMMENT '邮箱',
      `nick_name` varchar(100) DEFAULT NULL COMMENT '昵称',
      `remark` varchar(100) DEFAULT NULL COMMENT '备注',
      `create_time` date DEFAULT NULL COMMENT '创建时间',
      `status` char(1) DEFAULT NULL COMMENT '状态',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    如图所示:
    在这里插入图片描述

    插件引入

    创建一个SpringBoot项目这里使用的spring boot版本是2.1.3.RELEASE,将mybatis 插件引入

    		  
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-actuatorartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-aopartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
    
            
            <dependency>
                <groupId>org.mybatis.spring.bootgroupId>
                <artifactId>mybatis-spring-boot-starterartifactId>
                <version>2.2.2version>
            dependency>
            
            <dependency>
                <groupId>com.github.pagehelpergroupId>
                <artifactId>pagehelper-spring-boot-starterartifactId>
                <version>1.4.5version>
            dependency>
            
            <dependency>
                <groupId>com.alibabagroupId>
                <artifactId>druid-spring-boot-starterartifactId>
                <version>1.2.9version>
            dependency>
            
            <dependency>
                <groupId>org.mybatis.generatorgroupId>
                <artifactId>mybatis-generator-coreartifactId>
                <version>1.4.1version>
            dependency>
            
            <dependency>
                <groupId>mysqlgroupId>
                <artifactId>mysql-connector-javaartifactId>
                <version>8.0.15version>
            dependency>
            
            <dependency>
                <groupId>io.springfoxgroupId>
                <artifactId>springfox-swagger2artifactId>
                <version>2.9.2version>
            dependency>
            <dependency>
                <groupId>io.springfoxgroupId>
                <artifactId>springfox-swagger-uiartifactId>
                <version>2.9.2version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    配置

    1、对项目的application.yml进行配置:

    server:
      port: 8080
    
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
        username: root
        password: root
      mvc:
        pathmatch:
          matching-strategy: ANT_PATH_MATCHER
    
    mybatis:
      mapper-locations:
        - classpath:dao/*.xml
      configuration:
        # 下划线自动转驼峰
        map-underscore-to-camel-case: true
    
    logging:
      level:
        root: info
        com.sheep: debug
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    2、创建配置文件为generator.properties,添加数据库配置信息,用于代码生成器配置使用:

    jdbc.driverClass=com.mysql.cj.jdbc.Driver
    jdbc.connectionURL=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    jdbc.userId=root
    jdbc.password=root
    
    • 1
    • 2
    • 3
    • 4

    3、创建代码生成器配置文件generatorConfig.xml:

    
    DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
            "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    
    <generatorConfiguration>
        <properties resource="generator.properties"/>
        <context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat">
            
            <property name="beginningDelimiter" value="`"/>
            
            <property name="endingDelimiter" value="`"/>
            
            <property name="javaFileEncoding" value="UTF-8"/>
            
            <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
            
            <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
            
            <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />
            <commentGenerator type="com.macro.mall.CommentGenerator">
                
                <property name="suppressAllComments" value="true"/>
                
                <property name="suppressDate" value="true"/>
                
                <property name="addRemarkComments" value="true"/>
            commentGenerator>
            
            <jdbcConnection driverClass="${jdbc.driverClass}"
                            connectionURL="${jdbc.connectionURL}"
                            userId="${jdbc.userId}"
                            password="${jdbc.password}">
                
                <property name="nullCatalogMeansCurrent" value="true"/>
            jdbcConnection>
            
            <javaModelGenerator targetPackage="com.sheep.mbg.model" targetProject="learn-mybatis\src\main\java"/>
            
            <sqlMapGenerator targetPackage="com.sheep..mbg.mapper" targetProject="learn-mybatis\src\main\resources"/>
            
            <javaClientGenerator type="XMLMAPPER" targetPackage="com.sheep.mbg.mapper" targetProject="learn-mybatis\src\main\java"/>
          	
            <table tableName="rbac_%">
                <generatedKey column="id" sqlStatement="MySql" identity="true"/>
            table>
        context>
    generatorConfiguration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    4、实际开发中,有的项目是需要接入swagger-ui的,所以字段注释就得自定义。建立一个注释自定义处理类CommentGenerator:

    import org.mybatis.generator.api.IntrospectedColumn;
    import org.mybatis.generator.api.IntrospectedTable;
    import org.mybatis.generator.api.dom.java.CompilationUnit;
    import org.mybatis.generator.api.dom.java.Field;
    import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
    import org.mybatis.generator.internal.DefaultCommentGenerator;
    import org.mybatis.generator.internal.util.StringUtility;
    
    import java.util.Properties;
    
    /**
     * 自定义注释生成器
     */
    public class CommentGenerator extends DefaultCommentGenerator {
        private boolean addRemarkComments = false;
        private static final String EXAMPLE_SUFFIX = "Example";
        private static final String MAPPER_SUFFIX = "Mapper";
        private static final String API_MODEL_PROPERTY_FULL_CLASS_NAME = "io.swagger.annotations.ApiModelProperty";
    
        /**
         * 设置用户配置的参数
         */
        @Override
        public void addConfigurationProperties(Properties properties) {
            super.addConfigurationProperties(properties);
            this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));
        }
    
        /**
         * 给字段添加注释
         */
        @Override
        public void addFieldComment(Field field, IntrospectedTable introspectedTable,
                                    IntrospectedColumn introspectedColumn) {
            String remarks = introspectedColumn.getRemarks();
            //根据参数和备注信息判断是否添加swagger注解信息
            if (addRemarkComments && StringUtility.stringHasValue(remarks)) {
    //            addFieldJavaDoc(field, remarks);
                //数据库中特殊字符需要转义
                if (remarks.contains("\"")) {
                    remarks = remarks.replace("\"", "'");
                }
                //给model的字段添加swagger注解
                field.addJavaDocLine("@ApiModelProperty(value = \"" + remarks + "\")");
            }
        }
    
        /**
         * 给model的字段添加注释
         */
        private void addFieldJavaDoc(Field field, String remarks) {
            //文档注释开始
            field.addJavaDocLine("/**");
            //获取数据库字段的备注信息
            String[] remarkLines = remarks.split(System.getProperty("line.separator"));
            for (String remarkLine : remarkLines) {
                field.addJavaDocLine(" * " + remarkLine);
            }
            addJavadocTag(field, false);
            field.addJavaDocLine(" */");
        }
    
        @Override
        public void addJavaFileComment(CompilationUnit compilationUnit) {
            super.addJavaFileComment(compilationUnit);
            //只在model中添加swagger注解类的导入
            if (!compilationUnit.getType().getFullyQualifiedName().contains(MAPPER_SUFFIX) && !compilationUnit.getType().getFullyQualifiedName().contains(EXAMPLE_SUFFIX)) {
                compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME));
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    5、添加运行类Generator:

    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;
    
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Generator {
        public static void main(String[] args) throws Exception {
            //MBG 执行过程中的警告信息
            List<String> warnings = new ArrayList<String>();
            //当生成的代码重复时,覆盖原代码
            boolean overwrite = true;
            //读取我们的 MBG 配置文件
            InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml");
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration config = cp.parseConfiguration(is);
            is.close();
    
            DefaultShellCallback callback = new DefaultShellCallback(overwrite);
            //创建 MBG
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
            //执行生成代码
            myBatisGenerator.generate(null);
            //输出警告信息
            for (String warning : warnings) {
                System.out.println(warning);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    6、运行后看结果:图中的路径是与配置文件相对应的。若不存在也会自动创建目录

    生成结果
    7、可以看到model对象中的各个字段的注释。
    在这里插入图片描述
    8、还有另个自动生成的对象类:此对象是为了配合增删改查的条件构建用的。
    在这里插入图片描述
    9、看下生成的Mapper接口,这里生成了基本增删改查操作的接口,查询参数也应用了删改你的条件构建对象。
    mapper
    10、构建RbacUserService,RbacUserController。具体讲解下这个条件构建器如何使用:

    public interface RbacUserService {
        List<RbacUser> listAllUser();
    
        int createUser(RbacUser user);
    
        int updateUser(Integer id, RbacUser user);
    
        int deleteUser(Integer id);
    
        List<RbacUser> listUser(int pageNum, int pageSize);
    
        RbacUser getUser(Integer id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    @Service
    public class RbacUserServiceImpl implements RbacUserService {
        @Autowired
        private RbacUserMapper userMapper;
    
        @Override
        public List<RbacUser> listAllUser() {
            return userMapper.selectByExample(new RbacUserExample());
        }
    
        @Override
        public int createUser(RbacUser user) {
            return userMapper.insert(user);
        }
    
        @Override
        public int updateUser(Integer id, RbacUser user) {
            user.setId(id);
            return userMapper.updateByPrimaryKeySelective(user);
        }
    
        @Override
        public int deleteUser(Integer id) {
            return userMapper.deleteByPrimaryKey(id);
        }
    
        @Override
        public List<RbacUser> listUser(int pageNum, int pageSize) {
            PageHelper.startPage(pageNum, pageSize);
            return userMapper.selectByExample(new RbacUserExample());
        }
    
        @Override
        public RbacUser getUser(Integer id) {
            return userMapper.selectByPrimaryKey(id);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    @Api("用户管理")
    @Controller
    @RequestMapping("/user")
    public class RbacUserController {
        private static final Logger LOGGER = LoggerFactory.getLogger(RbacUserController.class);
        @Autowired
        private RbacUserService userService;
    
        @ApiOperation("获取所有用户列表")
        @RequestMapping(value = "listAll", method = RequestMethod.GET)
        @ResponseBody
        public CommonResult<List<RbacUser>> getUserList() {
            return CommonResult.success(userService.listAllUser());
        }
    
        @ApiOperation("添加用户")
        @RequestMapping(value = "/create", method = RequestMethod.POST)
        @ResponseBody
        public CommonResult createUser(@RequestBody RbacUser user) {
            CommonResult commonResult;
            int count = userService.createUser(user);
            if (count == 1) {
                commonResult = CommonResult.success(user);
                LOGGER.debug("createUser success:{}", user);
            } else {
                commonResult = CommonResult.failed("操作失败");
                LOGGER.debug("createUser failed:{}", user);
            }
            return commonResult;
        }
    
        @ApiOperation("更新指定id用户信息")
        @RequestMapping(value = "/update/{id}", method = RequestMethod.POST)
        @ResponseBody
        public CommonResult updateUser(@PathVariable("id") Integer id, @RequestBody RbacUser user, BindingResult result) {
            CommonResult commonResult;
            int count = userService.updateUser(id, user);
            if (count == 1) {
                commonResult = CommonResult.success(user);
                LOGGER.debug("updateUser success:{}", user);
            } else {
                commonResult = CommonResult.failed("操作失败");
                LOGGER.debug("updateUser failed:{}", user);
            }
            return commonResult;
        }
    
        @ApiOperation("删除指定id的用户")
        @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)
        @ResponseBody
        public CommonResult deleteUser(@PathVariable("id") Integer id) {
            int count = userService.deleteUser(id);
            if (count == 1) {
                LOGGER.debug("deleteUser success :id={}", id);
                return CommonResult.success(null);
            } else {
                LOGGER.debug("deleteUser failed :id={}", id);
                return CommonResult.failed("操作失败");
            }
        }
    
        @ApiOperation("分页查询用户列表")
        @RequestMapping(value = "/list", method = RequestMethod.GET)
        @ResponseBody
        public CommonResult<CommonPage<RbacUser>> listUser(@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum, @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
            List<RbacUser> brandList = userService.listUser(pageNum, pageSize);
            return CommonResult.success(CommonPage.restPage(brandList));
        }
    
        @ApiOperation("获取指定id的品牌详情")
        @RequestMapping(value = "/{id}", method = RequestMethod.GET)
        @ResponseBody
        public CommonResult<RbacUser> user(@PathVariable("id") Integer id) {
            return CommonResult.success(userService.getUser(id));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    11、controller中的返回结果进行了统一,代码如下,可以自行修改:

    public interface IErrorCode {
        long getCode();
    
        String getMessage();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    public enum ResultCode implements IErrorCode {
        SUCCESS(200, "操作成功"),
        FAILED(500, "操作失败"),
        VALIDATE_FAILED(404, "参数检验失败"),
        UNAUTHORIZED(401, "暂未登录或token已经过期"),
        FORBIDDEN(403, "没有相关权限");
        private long code;
        private String message;
    
        private ResultCode(long code, String message) {
            this.code = code;
            this.message = message;
        }
    
        public long getCode() {
            return code;
        }
    
        public String getMessage() {
            return message;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    public class CommonPage<T> {
        private Integer pageNum;
        private Integer pageSize;
        private Integer totalPage;
        private Long total;
        private List<T> list;
    
        /**
         * 将PageHelper分页后的list转为分页信息
         */
        public static <T> CommonPage<T> restPage(List<T> list) {
            CommonPage<T> result = new CommonPage<T>();
            PageInfo<T> pageInfo = new PageInfo<T>(list);
            result.setTotalPage(pageInfo.getPages());
            result.setPageNum(pageInfo.getPageNum());
            result.setPageSize(pageInfo.getPageSize());
            result.setTotal(pageInfo.getTotal());
            result.setList(pageInfo.getList());
            return result;
        }
    
    
        public Integer getPageNum() {
            return pageNum;
        }
    
        public void setPageNum(Integer pageNum) {
            this.pageNum = pageNum;
        }
    
        public Integer getPageSize() {
            return pageSize;
        }
    
        public void setPageSize(Integer pageSize) {
            this.pageSize = pageSize;
        }
    
        public Integer getTotalPage() {
            return totalPage;
        }
    
        public void setTotalPage(Integer totalPage) {
            this.totalPage = totalPage;
        }
    
        public List<T> getList() {
            return list;
        }
    
        public void setList(List<T> list) {
            this.list = list;
        }
    
        public Long getTotal() {
            return total;
        }
    
        public void setTotal(Long total) {
            this.total = total;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    public class CommonResult<T> {
        private long code;
        private String message;
        private T data;
    
        protected CommonResult() {
        }
    
        protected CommonResult(long code, String message, T data) {
            this.code = code;
            this.message = message;
            this.data = data;
        }
    
        /**
         * 成功返回结果
         *
         * @param data 获取的数据
         */
        public static <T> CommonResult<T> success(T data) {
            return new CommonResult<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);
        }
    
        /**
         * 成功返回结果
         *
         * @param data    获取的数据
         * @param message 提示信息
         */
        public static <T> CommonResult<T> success(T data, String message) {
            return new CommonResult<T>(ResultCode.SUCCESS.getCode(), message, data);
        }
    
        /**
         * 失败返回结果
         *
         * @param errorCode 错误码
         */
        public static <T> CommonResult<T> failed(IErrorCode errorCode) {
            return new CommonResult<T>(errorCode.getCode(), errorCode.getMessage(), null);
        }
    
        /**
         * 失败返回结果
         *
         * @param message 提示信息
         */
        public static <T> CommonResult<T> failed(String message) {
            return new CommonResult<T>(ResultCode.FAILED.getCode(), message, null);
        }
    
        /**
         * 失败返回结果
         */
        public static <T> CommonResult<T> failed() {
            return failed(ResultCode.FAILED);
        }
    
        /**
         * 参数验证失败返回结果
         */
        public static <T> CommonResult<T> validateFailed() {
            return failed(ResultCode.VALIDATE_FAILED);
        }
    
        /**
         * 参数验证失败返回结果
         *
         * @param message 提示信息
         */
        public static <T> CommonResult<T> validateFailed(String message) {
            return new CommonResult<T>(ResultCode.VALIDATE_FAILED.getCode(), message, null);
        }
    
        /**
         * 未登录返回结果
         */
        public static <T> CommonResult<T> unauthorized(T data) {
            return new CommonResult<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data);
        }
    
        /**
         * 未授权返回结果
         */
        public static <T> CommonResult<T> forbidden(T data) {
            return new CommonResult<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), data);
        }
    
        public long getCode() {
            return code;
        }
    
        public void setCode(long code) {
            this.code = code;
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public T getData() {
            return data;
        }
    
        public void setData(T data) {
            this.data = data;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    @Configuration
    @EnableSwagger2
    public class Swagger2Config {
        @Bean
        public Docket createRestApi() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo())
                    .select()
                    //为当前包下controller生成API文档
    				 .apis(RequestHandlerSelectors.basePackage("com.sheep.controller"))
                    .paths(PathSelectors.any())
                    .build();
        }
    
        private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    .title("SwaggerUI演示")
                    .description("learn-mybatis")
                    .contact(new Contact("sheep", "", "123@qq.com"))
                    .version("1.0")
                    .build();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    12、运行服务:
    在这里插入图片描述
    13、访问 http://localhost:8080/swagger-ui.html
    在这里插入图片描述
    成功启动。

    条件构建讲解

    从上面可以看到MyBatis Generator (MBG) 为每个数据库表生成了一个对应的 Example 类。它主要用于生成动态 SQL 语句。

    Example 类允许你构建复杂的 WHERE 子句,而无需直接在 mapper 文件中硬编码 SQL,它包含了很多用于构建 WHERE 子句的方法。每个方法都对应一个 SQL 比较运算符,比如 “=”, “<>”, “>”, “<”, “LIKE” 等。你可以动态地添加、修改或删除查询条件。使用 Example 类,你可以构建几乎任何类型的查询,包括带有 AND 和 OR 子句的查询,带有子查询的查询等。

    在使用 Example 类时,你需要创建一个 Example 对象,然后通过调用该对象的 createCriteria() 方法创建一个 Criteria 对象。然后你可以在 Criteria 对象上调用各种方法来添加查询条件。

    上面的案例基本上都没用到,下面我们就开始使用这个条件构建器:

    上面的案例是查询的所有用户,我们基于这个进行条件查询。
    在这里插入图片描述
    比如 对名字进行模糊查询:
    在这里插入图片描述

    Criteria 对象创建后,可以调用里面的各个接口进行构建参数,这个里面会对每个参数生成 “=”, “<>”, “>”, “<”, “LIKE” 的查询接口。如图所示是上面的接口详情:可以看到默认的情况,不会加%的
    在这里插入图片描述
    再看addCriterion,可以看到是往全局变量list中插入不同的条件构建对象。
    在这里插入图片描述
    在这里插入图片描述
    看下查询语句拼接效果:
    在这里插入图片描述

    若我们查询有多个条件的话,直接继续添加即可,例如我可以根据name模糊查询,还要查询小于指定时间创建的用户
    在这里插入图片描述

    上面的是不同条件进行and拼接的,若使用or进行拼接不同条件的话,需要换个方式:
    在这里插入图片描述

    每个条件都需要通过or创建Criteria 对象,然后再赋值,看下or接口就明白了:
    在这里插入图片描述
    比如 我们查询的话还需要根据指定的字段进行排序:
    在这里插入图片描述

    可以看到在mapper中的条件构建判断逻辑:
    在这里插入图片描述

    这个构建器只能用来生成简单的基于单表的 CRUD 操作的代码。对于更复杂的 SQL 操作,比如子查询、Group 查询和 Join 查询,MBG 并不直接支持。这些复杂查询需要你自己在 Mapper 的 xml 文件或基于注解编写相应的 SQL。

    demo地址

    项目地址: https://gitee.com/yang1112/learn-project.git

    我额外还写了一个根据模板生成代码,包括service、dao、mapper,有兴趣的可以看看:
    项目地址: https://gitee.com/yang1112/code-generator.git

  • 相关阅读:
    echarts X轴类目名太长时隐藏,hover时显示全部
    穿透 wsl 和 ssh, 新版本 neovim 跨设备任意复制,copy anywhere!
    Proxmox VE 近期有ARM 版本发布么?
    【LeetCode】70. 爬楼梯
    2022年全国大学生数学建模竞赛E题思路
    Java 面试题大集合,2019最新最常见面试题加答案
    微软牵手Linux:Ubuntu“系统”上架win10应用商店啦
    安卓界面优化
    如何在Microsoft Exchange 2013上安装https证书
    破除“数据孤岛”新策略:Data Fabric(数据编织)和逻辑数据平台
  • 原文地址:https://blog.csdn.net/qq_37216403/article/details/134612039