Spring Boot + Mybatis Plus 使用 Microsoft SQL Server 数据源心得

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.sqlservergroupId>
            <artifactId>mssql-jdbcartifactId>
            <version>6.4.0.jre8version>
        dependency>
        <dependency>
            <groupId>com.microsoft.sqlservergroupId>
            <artifactId>sqljdbc4artifactId>
            <version>4.0version>
        dependency>

2. pom 文件中的 MyBatis-Plus 依赖

            
            <dependency>
                <groupId>com.baomidougroupId>
                <artifactId>mybatis-plus-boot-starterartifactId>
                <version>3.3.2version>
            dependency>
            <dependency>
                <groupId>com.baomidougroupId>
                <artifactId>mybatis-plus-generatorartifactId>
                <version>3.3.2version>
            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 PRINT
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

你可能感兴趣的:(spring,boot,数据库,sqlserver,mybatisplus)