这里写一篇通过 mybatis generator类,自动生成 sqlserver代码类,通过springboot集成。连接sqlserver的总结。
1、创建springboot的项目
开发工具选择 idea,还是通过快速创建springboot项目的方式来创建一个springboot的web项目。
接下来只勾选一些必要的包,其他的手动引入就可以了
2、编辑 pom.xml
maven的项目就这点好,直接编辑Pom.xml就可以管理包
因为要连接sqlserver,所以导入sqlserver的驱动,因为连接的是sqlserver2012以上的版本,所以导入的驱动也要新的。
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.2</version>
<scope>runtime</scope>
</dependency>
要使用 mybatis-plus连接数据库,所以导入 mybatis-plus
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.1.2</version>
</dependency>
数据库连接池也要选一下,用druid吧
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
其他的 也要比如 热部署,日志处理都要集成进来。完整的pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xyzh.mybatisPlus</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.8.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
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<TableFill> tableFillList = new ArrayList<>();
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
List<FileOutConfig> 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
生成的结构如下:
6、实现查询功能
mybatis-plus 比 mybatis 好一些的地方在于能自动生成很多的操作方法,但是这些方法,还是不够用,所以还需要自己定义sql操作方法
自定义sql 操作方法的方式可以写在 mapper.xml中,也可以卸载mapper类当中,
本文采取 mapper类当中编写
找到我们要增加方法的 mapper类,如图:
直接增加两个新的方法:
mapper:
@Select("SELECT * FROM internalMeetingUserInfo where isDeleted=0 and internalStatus= #{internalStatus}")
List<InternalMeetingUserInfo> selectUsersByInternalStatus(@Param("internalStatus") int internalStatus);
@Select("SELECT * FROM internalMeetingUserInfo &{ew.customSqlSegment}")
List<InternalMeetingUserInfo> selectUsersByWrapper(@Param(Constants.WRAPPER) Wrapper<InternalMeetingUserInfo> userWrapper);
mapper中增加之后,需要在 service,service-impl ,controller中都要增加对应的方法
service
List<InternalMeetingUserInfo> selectUserByInternalStatus(Integer interStatus);
service-impl
@Autowired
InternalMeetingUserInfoMapper internalMeetingUserInfoMapper;
@Override
public List<InternalMeetingUserInfo> 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<InternalMeetingUserInfo> selectUserByInterStatus(@PathVariable("userStatus") Integer userStatus){
List<InternalMeetingUserInfo> 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
我这里手动将 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<Date>{
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(dateFormat.format(date));
}
}
public static class DateJsonDeserializer extends JsonDeserializer<Date>{
@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,这也是一个 组件类。
然后重写了 序列化和反序列化的方法。