MyBatis-plus+达梦数据库 自动生成代码

Mybatis-plus+达梦数据库 自动生成代码

=。=目录你倒是看呀

  • Mybatis-plus+达梦数据库 自动生成代码
      • 先说点什么
      • (配置)POM文件,引入所需要的依赖
      • (配置)达梦的驱动包,配置数据源
      • (配置)application.properties文件
      • 创建Mybatis-Plus自动生成代码的配置类
      • Mybatis-plus生成代码
      • 测试一下
      • Mybatis-plus主键生成可能出现的问题

先说点什么

mybatis-plus是一款增强版的mybatis,功能强大,可以很大程度的简化开发。
然而达梦数据库比较小众,虽然官方说mybatis-plus支持达梦数据库,但是使用起来遇到了很多问题。
这篇文章主要讲如何使用mybatis-plus访问达梦数据库,并使用逆向工程自动生成代码。
=。=对了 这是个使用spring boot的项目。

(配置)POM文件,引入所需要的依赖


        
            org.springframework.boot
            spring-boot-starter
        

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

        
            org.springframework.boot
            spring-boot-starter-test
            test
            
                
                    org.junit.vintage
                    junit-vintage-engine
                
            
        

        
            org.springframework.boot
            spring-boot-starter-jdbc
        

        
            org.projectlombok
            lombok
            true
        

        
            io.springfox
            springfox-swagger2
            2.7.0
        
        
            io.springfox
            springfox-swagger-ui
            2.7.0
        

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

        
            org.freemarker
            freemarker
            2.3.29
        

        
            junit
            junit
        
        
            org.springframework
            spring-test
            5.2.0.RELEASE
            compile
        
        
            org.springframework.boot
            spring-boot-test
        

    

(配置)达梦的驱动包,配置数据源

在达梦数据库的安装目录下有驱动包,我们先把jar包丢进来,放到lib这个文件夹下:MyBatis-plus+达梦数据库 自动生成代码_第1张图片
然后配置pom文件:

        
            com.dm
            Dm7JdbcDriver
            1.7
            system
            ${project.basedir}/src/lib/Dm7JdbcDriver18.jar
        

到现在,所有需要的依赖就都已经导入了。

(配置)application.properties文件

spring.datasource.url=
spring.datasource.username=
spring.datasource.password=
spring.datasource.driver-class-name=dm.jdbc.driver.DmDriver

mybatis-plus.configuration.cache-enabled=true
mybatis-plus.mapper-locations=classpath*:mappers/*.xml
mybatis-plus.type-aliases-package=com.example.demo.extity.*
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.auto-mapping-behavior=full
mybatis-plus.global-config.banner=false

创建Mybatis-Plus自动生成代码的配置类

在配置数据源的时候要注意,如果不设置数据源的类型是达梦数据库,会无法识别。
经历了开心的看源码环节,我们发现Mybatis中有个枚举类DbType来标识数据库的类型,其中有达梦数据库的类型。(=。=竟然有)
所以我们在配置类里传个参数就好了。(=。= 不然可能就凉了)

dsc.setDbType(DbType.DM);

配置类代码:

public class MysqlGenerator {

    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotEmpty(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();
        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("kning");
        gc.setOpen(false);
        gc.setSwagger2(true);
        gc.setIdType(IdType.AUTO);
        gc.setBaseResultMap(true);
        mpg.setGlobalConfig(gc);
        
        //达梦数据库的配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.DM);
        dsc.setSchemaName("SYSDBA");
        dsc.setUrl("");
        dsc.setDriverName("dm.jdbc.driver.DmDriver");
        dsc.setUsername("");
        dsc.setPassword("");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(scanner("模块名"));
        pc.setParent("com.example");
        mpg.setPackageInfo(pc);
        
        // 自定义配置
        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/" + pc.getModuleName()
                        + "/" + 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.setInclude(scanner("表名"));
        strategy.setSuperEntityColumns("id");
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix(pc.getModuleName() + "_");
        strategy.setEntityLombokModel(true);
        mpg.setStrategy(strategy);
        // 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }
}

Mybatis-plus生成代码

首先我们在数据库里创建一张表,就叫教师(teacher)表好了。达梦数据库似乎要求表名尽量是大写的。
MyBatis-plus+达梦数据库 自动生成代码_第2张图片
然后插入一点数据方便测试。
MyBatis-plus+达梦数据库 自动生成代码_第3张图片
运行测试类,输入模块名和表名,达梦数据库要求表名是大写的。
在这里插入图片描述
不出意外,我们就生成成功了。=。=不要问为什么有个students,因为自己测试用的这个。
MyBatis-plus+达梦数据库 自动生成代码_第4张图片

测试一下

我们来简单写个测试类,其功能是查出教师表的所有数据,然后插入一条教师信息,然后在查一次:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class teacherTest {
    @Autowired
    private TeacherMapper teacherMapper;

    @Test
    public void teacher(){
        List<Teacher> teachers = teacherMapper.selectList(null);
        teachers.forEach(System.out::println);

        System.out.println("==================================");

        Teacher teacher = new Teacher();
        teacher.setId(6);
        teacher.setName("zhou");
        teacher.setAge(58);
        teacherMapper.insert(teacher);

        teachers = teacherMapper.selectList(null);
        teachers.forEach(System.out::println);
    }
}

=。=看样子我们成功了。
MyBatis-plus+达梦数据库 自动生成代码_第5张图片
到这里,我们就成功的使用Mybatis-plus成功的生成了代码。

Mybatis-plus主键生成可能出现的问题

让我们来看看错误信息:

org.springframework.dao.DataIntegrityViolationException: 
### Error updating database.  Cause: java.sql.SQLException: 违反列[ID]非空约束
### The error may exist in com/example/demo/mapper/TeacherMapper.java (best guess)
### The error may involve com.example.demo.mapper.TeacherMapper.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO TEACHER  ( NAME, AGE )  VALUES  ( ?, ? )
### Cause: java.sql.SQLException: 违反列[ID]非空约束

很显然,是主键插入时的问题。
我们看一下mybatis-plus生成的实体类。

    @TableId(value = "ID", type = IdType.AUTO)
    private Integer id;

其中ID的属性设置为自动,然而如果达梦数据库建表的时候如果没有设置主键为自增。=。= 那没准就凉了。
我们看一下mybatis-plus支持哪些属性:

@Getter
public enum IdType {
    /**
     * 数据库ID自增
     */
    AUTO(0),
    /**
     * 该类型为未设置主键类型(将跟随全局)
     */
    NONE(1),
    /**
     * 用户输入ID
     * 

该类型可以通过自己注册自动填充插件进行填充

*/
INPUT(2), /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */ /** * 全局唯一ID (idWorker) */ ID_WORKER(3), /** * 全局唯一ID (UUID) */ UUID(4), /** * 字符串全局唯一ID (idWorker 的字符串表示) */ ID_WORKER_STR(5); private final int key; IdType(int key) { this.key = key; } }

可以看出,解决这个问题最简单的方法就是,修改IdType,使用NONE,自己传入id(主键)。
同样的,在自动生成代码的阶段,我们曾经设置过

gc.setIdType(IdType.AUTO);

在这里更改可以直接更改自动生成的代码,甚至也可以选择UUID等方式。
当然,这样并不好,所以也可以修改数据库表,设置ID为自增。
在刚刚的teacher表中执行下面这条语句,就可以修改主键id的属性为自增了。

ALTER TABLE TEACHER ADD ID identity (1,1);

然后在运行代码,多半就成了。

你可能感兴趣的:(Mybatis)