1. 程式人生 > >MP實戰系列(七)之集成springboot

MP實戰系列(七)之集成springboot

div tomcat req log 非空判斷 evel table RR 數字

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

}

MP實戰系列(七)之集成springboot