springboot集成mybatis-plus连接sqlserver

这里写一篇通过 mybatis generator类,自动生成 sqlserver代码类,通过springboot集成。连接sqlserver的总结。

1、创建springboot的项目

开发工具选择 idea,还是通过快速创建springboot项目的方式来创建一个springboot的web项目。
springboot集成mybatis-plus连接sqlserver_第1张图片
接下来只勾选一些必要的包,其他的手动引入就可以了
springboot集成mybatis-plus连接sqlserver_第2张图片
springboot集成mybatis-plus连接sqlserver_第3张图片

2、编辑 pom.xml

maven的项目就这点好,直接编辑Pom.xml就可以管理包
因为要连接sqlserver,所以导入sqlserver的驱动,因为连接的是sqlserver2012以上的版本,所以导入的驱动也要新的。

 
            com.microsoft.sqlserver
            sqljdbc4
            4.2
            runtime
        

要使用 mybatis-plus连接数据库,所以导入 mybatis-plus

 
            com.baomidou
            mybatis-plus-boot-starter
            3.1.2
        
        
            com.baomidou
            mybatis-plus-generator
            3.1.2
        

数据库连接池也要选一下,用druid吧

  
            com.alibaba
            druid-spring-boot-starter
            1.1.10
        

其他的 也要比如 热部署,日志处理都要集成进来。完整的pom.xml如下:



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.1.7.RELEASE
         
    
    com.xyzh.mybatisPlus
    demo
    0.0.1-SNAPSHOT
    demo
    Demo project for Spring Boot

    
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            com.microsoft.sqlserver
            mssql-jdbc
            runtime
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            com.microsoft.sqlserver
            sqljdbc4
            4.2
            runtime
        
        
            com.alibaba
            druid-spring-boot-starter
            1.1.10
        
        
            com.baomidou
            mybatis-plus-boot-starter
            3.1.2
        
        
            com.baomidou
            mybatis-plus-generator
            3.1.2
        
        
            org.freemarker
            freemarker
        
        
            ch.qos.logback
            logback-core
        
        
            org.springframework
            springloaded
            1.2.8.RELEASE
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    


3、配置文件设置

mybatis-plus:
  mapper-locations: classpath:/mapper/*.xml
  global-config:
    db-config:
      id-type: auto
      table-underline: true
      logic-not-delete-value: 0
      logic-delete-value: 1
spring:
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:sqlserver://172.20.100.232:1433;databaseName=XXX
    username: sa
    password: ###
  application:
    name: microservice-provider
server:
  port: 8002

这段配置文件大致就是驱动类设置,mybatis-plus 关键参数设置,别的也没什么。

4、配置generator类

在src目录中找到最底层的包,然后新建一个 generator的包,创建SqlserverGenerator类,代码及注解如下:
package com.xyzh.mybatisplus.demo.generator;

import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;
import java.util.List;

public class SqlserverGenerator {
    /**
     * RUN THIS
     */
    //生成文件所在项目路径
    private static String baseProjectPath = "D:\\java\\demo";

    //基础包名
    private static String basePackage="com.xyzh.mybatisplus.demo";
    //设置作者
    private static String authorName="adrian";
    //这里是要生成的表名(如果全部要生成的话,这里注释掉)
    //private static String[] tables= {"t_role","t_resource","t_role_resource","t_user_role"};
    //可以设置table前缀
    private static String prefix="t_";

    //数据库配置四要素
    private static String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    private static String url = "jdbc:sqlserver://172.20.100.232:1433;databaseName=XXX";
    private static String username = "sa";
    private static String password = "###";


    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(baseProjectPath + "/src/main/java");
        // TODO 设置用户名
        gc.setAuthor("adrian");
        gc.setOpen(true);
        // service 命名方式
        gc.setServiceName("%sService");
        // service impl 命名方式
        gc.setServiceImplName("%sServiceImpl");
        // 自定义文件命名,注意 %s 会自动填充表实体属性!
        gc.setMapperName("%sMapper");
        gc.setXmlName("%sMapper");
        gc.setFileOverride(true);
        gc.setActiveRecord(true);
        // XML 二级缓存
        gc.setEnableCache(false);
        // XML ResultMap
        gc.setBaseResultMap(true);
        // XML columList
        gc.setBaseColumnList(false);
        mpg.setGlobalConfig(gc);

        // TODO 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl(url);
        dsc.setDriverName(driverName);
        dsc.setUsername(username);
        dsc.setPassword(password);
        mpg.setDataSource(dsc);

        // TODO 包配置
        PackageConfig pc = new PackageConfig();
        //pc.setModuleName(scanner("模块名"));
        pc.setParent("com.xyzh.meetingsys");
        pc.setEntity("entity");
        pc.setService("service");
        pc.setServiceImpl("service.impl");
        mpg.setPackageInfo(pc);

        // 自定义需要填充的字段
        List tableFillList = new ArrayList<>();
        
        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        List focList = new ArrayList<>();
        focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输入文件名称
                return projectPath + "/src/main/resources/mapper/"
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);
        mpg.setTemplate(new TemplateConfig().setXml(null));

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
        // 设置逻辑删除键(这个是逻辑删除的操作)
        strategy.setLogicDeleteFieldName("deleted");
        // TODO 指定生成的bean的数据库表名(如果全部生成,这里要注释掉)
        //strategy.setInclude("userinfos");
        //strategy.setSuperEntityColumns("id");
        // 驼峰转连字符
        strategy.setControllerMappingHyphenStyle(true);
        mpg.setStrategy(strategy);
        // 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }
}

这里只有一个地方说明下,就是 此处选择的模板引擎是 freemarker,所以pom里面需要导入 freemarker的依赖。
再有就是其实 durid 对于 sqlserver支持的不是很好,所以有些数据类型 比如datetime,需要额外注意

5、运行 generator

直接运行 generator
生成的结构如下:
springboot集成mybatis-plus连接sqlserver_第4张图片

6、实现查询功能

mybatis-plus 比 mybatis 好一些的地方在于能自动生成很多的操作方法,但是这些方法,还是不够用,所以还需要自己定义sql操作方法

自定义sql 操作方法的方式可以写在 mapper.xml中,也可以卸载mapper类当中,
本文采取 mapper类当中编写
找到我们要增加方法的 mapper类,如图:
springboot集成mybatis-plus连接sqlserver_第5张图片
直接增加两个新的方法:
mapper:

 @Select("SELECT * FROM internalMeetingUserInfo where isDeleted=0 and  internalStatus= #{internalStatus}")
     List selectUsersByInternalStatus(@Param("internalStatus") int internalStatus);

    @Select("SELECT * FROM internalMeetingUserInfo &{ew.customSqlSegment}")
    List selectUsersByWrapper(@Param(Constants.WRAPPER) Wrapper userWrapper);

mapper中增加之后,需要在 service,service-impl ,controller中都要增加对应的方法

service

List selectUserByInternalStatus(Integer interStatus);

service-impl

  @Autowired
    InternalMeetingUserInfoMapper internalMeetingUserInfoMapper;

    @Override
    public List selectUserByInternalStatus(Integer interStatus) {
        return internalMeetingUserInfoMapper.selectUsersByInternalStatus(interStatus);
    }

到这里,会发现 autowired 报错,告诉我们internalMeetingUserInfoMapper 对象 这里不能自动装配
这是因为 mapper 类没有 被 程序发现,需要用 scan 标签类告知程序 mapper的位置。
所以需要在应用程序启动类 DemoApplication上 加上注解 @MapperScan(“com.xyzh.mybatisplus.demo.mapper”)

另外还需要在 mapper类的上面加上 组件的注解,这里用 @Component 注解

controller

@Autowired
    InternalMeetingUserInfoService internalMeetingUserInfoService;

    @RequestMapping(value="/userinfo/{userStatus}",method = RequestMethod.GET)
    @ResponseBody
    public List selectUserByInterStatus(@PathVariable("userStatus") Integer userStatus){

        List users=internalMeetingUserInfoService.selectUserByInternalStatus(userStatus);
        return users;
    }

然后运行程序,运行 application类。

到这里,其实 配置工作,就已经做完了。
但是记录一点错误信息。
因为我的数据库中,有 datetime类型的字段,而通过autogenerator 生成后,对应的entity中的字段 是
localdatetime类型,所以 这里显示,写入,更新都会出错。
错误信息:Error attempting to get column ‘passportDate’ from result set. Cause: java.sql.SQLFeatureNotSupportedException ; null; nested exception is java.sql.SQLFeatureNotSupportedException
springboot集成mybatis-plus连接sqlserver_第6张图片

我这里手动将 localdatetime类型,改为Date类型,并且写一个 自定义的转换类,用于显示

先在entity包中,找到对应的实体,
将数据类型LocalDateTime都改为 Date

在 controller 中增加转换方法:

 @InitBinder
    public  void initBinder(WebDataBinder binder, WebRequest request){
        //转换日期
        DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm");
        binder.registerCustomEditor(Date.class,new CustomDateEditor(dateFormat,true));
    }

这样就解决了问题,
但是,如果写这样的方法,就需要到每个controller中增加,
我可以写一个全局的转换方法。

新建一个包 config

新增一个类 DateFormatConfig,代码如下:

package com.xyzh.mybatisplus.demo.config;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.jackson.JsonComponent;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

@JsonComponent
public class DateFormatConfig {
    private static SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static class DateJsonSerializer extends JsonSerializer{
        @Override
        public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeString(dateFormat.format(date));
        }
    }

    public static class DateJsonDeserializer extends JsonDeserializer{


        @Override
        public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
            try{
                return dateFormat.parse(jsonParser.getText());
            }catch (ParseException e){
                throw new RuntimeException(e);
            }
        }
    }
}

注意下注解 @JsonComponent,这也是一个 组件类。
然后重写了 序列化和反序列化的方法。

你可能感兴趣的:(java,springboot,mybatis-plus)