• MP实战系列(七)之集成springboot


    springboot是现在比较流行的微服使用的框架,springboot本质上就是将spring+springmvc+mybatis零配置化,基本上springboot的默认配置符合我们的开发。当然有一部分还是需要自定义的。

    本章不是专门讲springboot的,主要将springboot+mybatis plus是如何整合的。

    一、导入pom依赖

        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.9.RELEASE</version>
        </parent>
    
        <repositories>
            <!--阿里云仓库-->
            <repository>
                <id>aliyun</id>
                <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            </repository>
            <!--快照版本使用,正式版本无需添加此仓库-->
            <repository>
                <id>snapshots</id>
                <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
            </repository>
        </repositories>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>1.7</maven.compiler.source>
            <maven.compiler.target>1.7</maven.compiler.target>
            <mybatis-plus-boot-starter.version>2.1.9</mybatis-plus-boot-starter.version>
            <mybatisplus.version>2.1.8</mybatisplus.version>
            <HikariCP.version>2.4.13</HikariCP.version>
            <fastjson.version>1.2.39</fastjson.version>
            <druid.version>1.1.0</druid.version>
        </properties>
    
        <dependencies>
    
            <!-- slf4j -->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.19</version>
            </dependency>
        
                <!-- Druid -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
        
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jetty</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.zaxxer</groupId>
                <artifactId>HikariCP-java7</artifactId>
                <version>${HikariCP.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson.version}</version>
            </dependency>
            <!-- mybatis-plus begin -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus-boot-starter.version}</version>
                <exclusions>
                    <exclusion>
                        <artifactId>tomcat-jdbc</artifactId>
                        <groupId>org.apache.tomcat</groupId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!-- mybatis-plus end -->
    
            <!-- JUnit test dependency -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.jayway.restassured</groupId>
                <artifactId>rest-assured</artifactId>
                <version>2.9.0</version>
                <scope>test</scope>
            </dependency>
    
            <!-- Code generator test sample-->
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity</artifactId>
                <version>1.7</version>
                <scope>test</scope>
            </dependency>
            
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.21</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>

    二、编写application.yml配置文件

    #app
    server:
        port: 8080
    
    #spring
    spring:
      devtools:
        restart:
          enabled: false
    
    
      datasource:
        url: jdbc:mysql://127.0.0.1:3306/blog?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
        username: root
        password: 1234
        db-name: blog
        filters: log4j,wall,mergeStat1
    
    #mybatis
    mybatis-plus:
      mapper-locations: classpath:/mapper/*Dao.xml
      #实体扫描,多个package用逗号或者分号分隔
      typeAliasesPackage: com.blog.springboot.entity
      global-config:
        #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
        id-type: 2
        #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
        field-strategy: 2
        #驼峰下划线转换
        db-column-underline: true
        #刷新mapper 调试神器
        refresh-mapper: true
        #数据库大写下划线转换
        #capital-mode: true
    
        #逻辑删除配置(下面3个配置)
        logic-delete-value: 0
        logic-not-delete-value: 1
        #自定义sql注入器,不在推荐使用此方式进行配置,请使用自定义bean注入
        sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
        #自定义填充策略接口实现,不在推荐使用此方式进行配置,请使用自定义bean注入
        meta-object-handler: com.blog.springboot.MyMetaObjectHandler
        #自定义SQL注入器
        #sql-injector: com.baomidou.springboot.xxx
        # SQL 解析缓存,开启后多租户 @SqlParser 注解生效
        sql-parser-cache: true
      configuration:
        map-underscore-to-camel-case: true
        cache-enabled: false
    #logging
    logging:
      level: warn

    三、准备相关的类(例如springboot启动类等)

    Application.java

    package com.blog.springboot;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.Banner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    @EnableTransactionManagement
    @SpringBootApplication
    public class Application {
    
        protected final static Logger logger = LoggerFactory.getLogger(Application.class);
    
    
        public static void main(String[] args) {
            SpringApplication app = new SpringApplication(Application.class);
            app.setBannerMode(Banner.Mode.OFF);
            app.run(args);
            logger.info("Application is success!");
         
        }
    
    }

    MyMetaObjectHandler.java

    package com.blog.springboot;
    
    import com.baomidou.mybatisplus.mapper.MetaObjectHandler;
    import org.apache.ibatis.reflection.MetaObject;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     *  注入公共字段自动填充,任选注入方式即可
     */
    //@Component
    public class MyMetaObjectHandler extends MetaObjectHandler {
    
        protected final static Logger logger = LoggerFactory.getLogger(Application.class);
    
        @Override
        public void insertFill(MetaObject metaObject) {
            logger.info("新增");
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
            logger.info("更新");
        }
    }

    MybatisPlusConfig.java

    package com.blog.springboot.config;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import com.baomidou.mybatisplus.incrementer.H2KeyGenerator;
    import com.baomidou.mybatisplus.incrementer.IKeyGenerator;
    import com.baomidou.mybatisplus.mapper.ISqlInjector;
    import com.baomidou.mybatisplus.mapper.LogicSqlInjector;
    import com.baomidou.mybatisplus.mapper.MetaObjectHandler;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
    import com.baomidou.mybatisplus.plugins.PerformanceInterceptor;
    import com.baomidou.mybatisplus.plugins.parser.ISqlParser;
    import com.baomidou.mybatisplus.plugins.parser.tenant.TenantHandler;
    import com.baomidou.mybatisplus.plugins.parser.tenant.TenantSqlParser;
    import com.blog.springboot.MyMetaObjectHandler;
    
    import net.sf.jsqlparser.expression.Expression;
    import net.sf.jsqlparser.expression.LongValue;
    
    @Configuration
    @MapperScan("com.blog.springboot.mapper*")
    public class MybatisPlusConfig {
    
        /**
         * mybatis-plus SQL执行效率插件【生产环境可以关闭】
         */
        @Bean
        public PerformanceInterceptor performanceInterceptor() {
            return new PerformanceInterceptor();
        }
    
    
        @Bean
        public MetaObjectHandler metaObjectHandler(){
            return new MyMetaObjectHandler();
        }
    
        /**
         * 注入主键生成器
         */
        @Bean
        public IKeyGenerator keyGenerator(){
            return new H2KeyGenerator();
        }
    
        /**
         * 注入sql注入器
         */
        @Bean
        public ISqlInjector sqlInjector(){
            return new LogicSqlInjector();
        }
    
    }
    

      

    WebConfig.java

    package com.blog.springboot.config;
    
    import java.util.List;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
    import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.databind.MapperFeature;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.module.SimpleModule;
    import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
    
    
    /**
     * <p>
     * WEB 初始化相关配置
     * </p>
     */
    @ControllerAdvice
    @Configuration
    public class WebConfig extends WebMvcConfigurerAdapter {
    
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
            builder.serializationInclusion(JsonInclude.Include.NON_NULL);
            ObjectMapper objectMapper = builder.build();
            SimpleModule simpleModule = new SimpleModule();
            simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
            objectMapper.registerModule(simpleModule);
            objectMapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);// 忽略 transient 修饰的属性
            converters.add(new MappingJackson2HttpMessageConverter(objectMapper));
            super.configureMessageConverters(converters);
        }
    }

    上述类启动类和对mapper文件扫描的类是一定要用到的,功能的话,就不用多说了,启动类,运行即可通过地址栏进入界面,因为我在pom文件中配置了tomcat,就算不配置,springboot也会自带一个servlet容器,扫描类,主要针对xml文件,相当于mybatis的动态扫描的接口编程方式。

    四、使用代码生成器进行代码生成(具体可以参考我的MP实战系列(六)之代码生成器讲解)

    生成的代码,我还是先贴出来

    (1)实体类

    package com.blog.springboot.entity;
    
    import java.io.Serializable;
    
    import com.baomidou.mybatisplus.activerecord.Model;
    import com.baomidou.mybatisplus.annotations.TableField;
    import com.baomidou.mybatisplus.annotations.TableId;
    import com.baomidou.mybatisplus.annotations.TableName;
    import com.baomidou.mybatisplus.enums.IdType;
    
    /**
     * <p>
     * 
     * </p>
     *
     * @author yc
     * @since 2018-05-19
     */
    @TableName("user")
    public class UserEntity extends Model<UserEntity> {
    
      
    
        /**
         * 用户ID
         */
        @TableId(value = "user_id", type = IdType.AUTO)
        private Integer user_id;
        /**
         * 用户名
         */
        private String username;
        /**
         * 性别
         */
        private Integer sex;
        /**
         * 电话
         */
        private String phone;
        /**
         * 密码
         */
        private String password;
        /**
         * 等级
         */
        private Integer level;
        /**
         * 用户创建时间
         */
        @TableField("create_time")
        private String createTime;
        /**
         * 邮箱
         */
        private String email;
        /**
         * 登录标识
         */
        private Integer logo;
        /**
         * 登录时间
         */
        @TableField("login_time")
        private String loginTime;
    
    
        public Integer getUserId() {
            return user_id;
        }
    
        public void setUserId(Integer user_id) {
            this.user_id = user_id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public Integer getSex() {
            return sex;
        }
    
        public void setSex(Integer sex) {
            this.sex = sex;
        }
    
        public String getPhone() {
            return phone;
        }
    
        public void setPhone(String phone) {
            this.phone = phone;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public Integer getLevel() {
            return level;
        }
    
        public void setLevel(Integer level) {
            this.level = level;
        }
    
        public String getCreateTime() {
            return createTime;
        }
    
        public void setCreateTime(String createTime) {
            this.createTime = createTime;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public Integer getLogo() {
            return logo;
        }
    
        public void setLogo(Integer logo) {
            this.logo = logo;
        }
    
        public String getLoginTime() {
            return loginTime;
        }
    
        public void setLoginTime(String loginTime) {
            this.loginTime = loginTime;
        }
    
    
    
        @Override
        public String toString() {
            return "User{" +
            "userId=" + user_id +
            ", username=" + username +
            ", sex=" + sex +
            ", phone=" + phone +
            ", password=" + password +
            ", level=" + level +
            ", createTime=" + createTime +
            ", email=" + email +
            ", logo=" + logo +
            ", loginTime=" + loginTime +
            "}";
        }
    
        @Override
        protected Serializable pkVal() {
            // TODO Auto-generated method stub
            return this.user_id;
        }
    }

    (2)dao

    package com.blog.springboot.mapper;
    
    import com.blog.springboot.entity.UserEntity;
    import com.baomidou.mybatisplus.mapper.BaseMapper;
    
    /**
     * <p>
     *  Mapper 接口
     * </p>
     *
     * @author yc
     * @since 2018-05-19
     */
    public interface UserDao extends BaseMapper<UserEntity> {
    
    }

    (3)service

    package com.blog.springboot.service;
    
    import com.blog.springboot.entity.UserEntity;
    import com.baomidou.mybatisplus.service.IService;
    
    /**
     * <p>
     *  服务类
     * </p>
     *
     * @author yc
     * @since 2018-05-19
     */
    public interface UserService extends IService<UserEntity> {
    
    }

    (4)service实现类

    package com.blog.springboot.service.impl;
    
    import com.blog.springboot.entity.UserEntity;
    import com.blog.springboot.mapper.UserDao;
    import com.blog.springboot.service.UserService;
    import com.baomidou.mybatisplus.service.impl.ServiceImpl;
    import org.springframework.stereotype.Service;
    
    /**
     * <p>
     *  服务实现类
     * </p>
     *
     * @author yc
     * @since 2018-05-19
     */
    @Service
    public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements UserService {
    
    }

    (5)controller

    package com.blog.springboot.controller;
    
    
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import org.springframework.stereotype.Controller;
    
    /**
     * <p>
     *  前端控制器
     * </p>
     *
     * @author yc
     * @since 2018-05-19
     */
    @Controller
    @RequestMapping("/user")
    public class UserController {
    
    }

    (6)UserDao.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.blog.springboot.mapper.UserDao">
    
        <!-- 通用查询映射结果 -->
         <resultMap id="BaseResultMap" type="com.blog.springboot.entity.UserEntity">
            <id column="user_id" property="user_id" />
            <result column="username" property="username" />
            <result column="sex" property="sex" />
            <result column="phone" property="phone" />
            <result column="password" property="password" />
            <result column="level" property="level" />
            <result column="create_time" property="createTime" />
            <result column="email" property="email" />
            <result column="logo" property="logo" />
            <result column="login_time" property="loginTime" />
        </resultMap>
    
    <!--     通用查询结果列 -->
        <sql id="Base_Column_List">
            user_id AS userId, username, sex, phone, password, level, create_time AS createTime, email, logo, login_time AS loginTime
        </sql>
    
    </mapper>

    (7)springboot单元测试

    package com..test;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import com.blog.springboot.Application;
    import com.blog.springboot.entity.UserEntity;
    import com.blog.springboot.mapper.UserDao;
    
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = Application.class)
    public class UserTest{
        @Autowired
        private UserDao ud;
    
    
        @Test
        public void test001() {
        
            UserEntity userEntity = ud.selectById(1);
            System.out.println(userEntity.getCreateTime()+"||"+userEntity.getEmail());
        }
    
    }
  • 相关阅读:
    345. Reverse Vowels of a String(交换元音字母)(leetcode)
    633. Sum of Square Numbers(平方和)(leetcode)
    第七届蓝桥杯大赛个人赛省赛(软件类)真题8
    第七届蓝桥杯大赛个人赛省赛(软件类)真题6
    第七届蓝桥杯大赛个人赛省赛(软件类)真题5
    第七届蓝桥杯大赛个人赛省赛(软件类)真题4
    第七届蓝桥杯大赛个人赛省赛(软件类)真题3
    第七届蓝桥杯大赛个人赛省赛(软件类)真题2
    第七届蓝桥杯大赛个人赛省赛(软件类)真题1
    hdu 1087&1160 最长增序列问题
  • 原文地址:https://www.cnblogs.com/youcong/p/9061186.html
Copyright © 2020-2023  润新知