Spring Boot + Mybatis Plus 使用 Microsoft SQL Server 数据源心得
从学习 Java 开发开始,绝大多数的教程都是采用的 MySQL 数据库,原因不用说了吧——免费啊!当然也有介绍 Oracle 的,唯独对 SQL Server 鲜有涉及。我想,可能是目前使用 Java 开发应用基本上都是 Web 应用。所以大多部署到 Linux 服务器上,而 Linux 版的 SQL Server 貌似刚出来没多少天,因此选择 SQL Server 作为数据源的也就很少见了。
奈何本人所在单位现有很多业务系统都是基于.net + SQL Server 开发的。为了让新的系统能与现有系统在数据交互上有较好的协调性,要求使用 Java 开发时也要选择 SQL Server。踩坑开始了……
1. pom 文件中的 SQL server 驱动依赖
版本选择时要注意需要与开发环境中的 JDK 版本一致。可以到 Maven 的中央仓库查看 mssql-jdbc 具体版本。我选择了使用偏多的 6.4.0 。
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>6.4.0.jre8</version>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<version>4.0</version>
</dependency>
2. pom 文件中的 MyBatis-Plus 依赖
<!-- Mybatis Plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.2</version>
</dependency>
3. MS SQL Server 数据源配置
(1)MS SQL Server 的连接字符串最简单的格式如下:
jdbc:sqlserver://192.168.10.11:1433;DatabaseName=scott
(2)代码生成器中
dsc.setUrl("jdbc:sqlserver://10.10.10.110:1433;DatabaseName=scott"); //检查是否需要修改
dsc.setDriverName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
dsc.setUsername("sa");
dsc.setPassword("123456"); //检查是否需要修改
dsc.setDbType(DbType.SQL_SERVER);
(3)yaml 文件中
spring:
profiles:
active: dev # 环境设置
application:
name: service-sys # 服务名
datasource: # mysql数据库连接
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: jdbc:sqlserver://10.10.10.110:1433:/DatabaseName=scott
username: sa
password: 123456
至此,有关 Spring Boot 的相关配置应该就算完事了,但是……我发现了一个有意思的坑!!
我为了测试,先在数据库中建立了一个 user 表,这可是几乎所有视频教程都在用的典型范例。但是我发现,generator 报错了……查百度、CSDN……说是 Mybatis-Plus 的版本高了,降到 3.2.0。
可是,主键策略……3.2 和 3.3 的不那么一样。原来想用 3.3 中的 ASSIGN_ID
不灵了,只能用 UUID
。算了,先改了再说。wow~~居然可以了!!!(难道 3.3 版本出 bug 了?)
由于前面的数据都是用的雪花算法弄出来的 ID,这如何是好。再改回去?嗯,改!改 POM,改实体类注解,改代码生成器注解(反正也不运行了,都注释了也可以)……编写个 Controller 实验一下,又不行了~~报错说 SQL 语法错误!
select * from user;
这么简单的会有错??!!
查来查去发现,user
是 SQL Server 的一个保留字~!表名改成 employee 就可以了。
于是我想,要不用代码生成器再试试原来就有的 dept 表?顺利生成了!!
这说明,人家 Mybatis-Plus 根本啥问题没有,是我对 SQL Server 的不了解导致折腾了这么久。
结论
使用 Microsoft SQL Server 时,千万千万千万不要让表名、字段名等与保留字相同。
SQL Server Compact 3.5 中的保留字用法不一定和 SQL Server 中对应的保留字用法相同。
应避免将保留字用作标识符。如果保留字必须用作标识符,则必须用双引号进行分隔,或者放入括号中:
[]
。
下表列出了 SQL Server Compact 3.5 中的保留字。
----------------- | 保留字 | ------------ |
---|---|---|
@@IDENTITY | ENCRYPTION | ORDER |
ADD | END | OUTER |
ALL | ERRLVL | OVER |
ALTER | ESCAPE | PERCENT |
AND | EXCEPT | PLAN |
ANY | EXEC | PRECISION |
AS | EXECUTE | PRIMARY |
ASC | EXISTS | |
AUTHORIZATION | EXIT | PROC |
AVG | EXPRESSION | PROCEDURE |
BACKUP | FETCH | PUBLIC |
BEGIN | FILE | RAISERROR |
BETWEEN | FILLFACTOR | READ |
BREAK | FOR | READTEXT |
BROWSE | FOREIGN | RECONFIGURE |
BULK | FREETEXT | REFERENCES |
BY | FREETEXTTABLE | REPLICATION |
CASCADE | FROM | RESTORE |
CASE | FULL | RESTRICT |
CHECK | FUNCTION | RETURN |
CHECKPOINT | GOTO | REVOKE |
CLOSE | GRANT | RIGHT |
CLUSTERED | GROUP | ROLLBACK |
COALESCE | HAVING | ROWCOUNT |
COLLATE | HOLDLOCK | ROWGUIDCOL |
COLUMN | IDENTITY | RULE |
COMMIT | IDENTITY_INSERT | SAVE |
COMPUTE | IDENTITYCOL | SCHEMA |
CONSTRAINT | IF | SELECT |
CONTAINS | IN | SESSION_USER |
CONTAINSTABLE | INDEX | SET |
CONTINUE | INNER | SETUSER |
CONVERT | INSERT | SHUTDOWN |
COUNT | INTERSECT | SOME |
CREATE | INTO | STATISTICS |
CROSS | IS | SUM |
CURRENT | JOIN | SYSTEM_USER |
CURRENT_DATE | KEY | TABLE |
CURRENT_TIME | KILL | TEXTSIZE |
CURRENT_TIMESTAMP | LEFT | THEN |
CURRENT_USER | LIKE | TO |
CURSOR | LINENO | TOP |
DATABASE | LOAD | TRAN |
DATABASEPASSWORD | MAX | TRANSACTION |
DATEADD | MIN | TRIGGER |
DATEDIFF | NATIONAL | TRUNCATE |
DATENAME | NOCHECK | TSEQUAL |
DATEPART | NONCLUSTERED | UNION |
DBCC | NOT | UNIQUE |
DEALLOCATE | NULL | UPDATE |
DECLARE | NULLIF | UPDATETEXT |
DEFAULT | OF | USE |
DELETE | OFF | USER |
DENY | OFFSETS | VALUES |
DESC | ON | VARYING |
DISK | OPEN | VIEW |
DISTINCT | OPENDATASOURCE | WAITFOR |
DISTRIBUTED | OPENQUERY | WHEN |
DOUBLE | OPENROWSET | WHERE |
DROP | OPENXML | WHILE |
DUMP | OPTION | WITH |
ELSE | OR | WRITETEXT |