MyBatis-plus+达梦数据库实现自动生成代码的示例
先说点什么
mybatis-plus是一款增强版的mybatis,功能强大,可以很大程度的简化开发。
然而达梦数据库比较小众,虽然官方说mybatis-plus支持达梦数据库,但是使用起来遇到了很多问题。
这篇文章主要讲如何使用mybatis-plus访问达梦数据库,并使用逆向工程自动生成代码。
=。=对了这是个使用springboot的项目。
(配置)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这个文件夹下:
然后配置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);
配置类代码:
publicclassMysqlGenerator{ publicstaticStringscanner(Stringtip){ Scannerscanner=newScanner(System.in); StringBuilderhelp=newStringBuilder(); help.append("请输入"+tip+":"); System.out.println(help.toString()); if(scanner.hasNext()){ Stringipt=scanner.next(); if(StringUtils.isNotEmpty(ipt)){ returnipt; } } thrownewMybatisPlusException("请输入正确的"+tip+"!"); } publicstaticvoidmain(String[]args){ //代码生成器 AutoGeneratormpg=newAutoGenerator(); //全局配置 GlobalConfiggc=newGlobalConfig(); StringprojectPath=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); //达梦数据库的配置 DataSourceConfigdsc=newDataSourceConfig(); dsc.setDbType(DbType.DM); dsc.setSchemaName("SYSDBA"); dsc.setUrl(""); dsc.setDriverName("dm.jdbc.driver.DmDriver"); dsc.setUsername(""); dsc.setPassword(""); mpg.setDataSource(dsc); //包配置 PackageConfigpc=newPackageConfig(); pc.setModuleName(scanner("模块名")); pc.setParent("com.example"); mpg.setPackageInfo(pc); //自定义配置 InjectionConfigcfg=newInjectionConfig(){ @Override publicvoidinitMap(){ //todonothing } }; ListfocList=newArrayList<>(); focList.add(newFileOutConfig("/templates/mapper.xml.ftl"){ @Override publicStringoutputFile(TableInfotableInfo){ //自定义输入文件名称 returnprojectPath+"/src/main/resources/mapper/"+pc.getModuleName() +"/"+tableInfo.getEntityName()+"Mapper"+StringPool.DOT_XML; } }); cfg.setFileOutConfigList(focList); mpg.setCfg(cfg); mpg.setTemplate(newTemplateConfig().setXml(null)); //策略配置 StrategyConfigstrategy=newStrategyConfig(); 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(newFreemarkerTemplateEngine()); mpg.execute(); } }
Mybatis-plus生成代码
首先我们在数据库里创建一张表,就叫教师(teacher)表好了。达梦数据库似乎要求表名尽量是大写的。
然后插入一点数据方便测试。
运行测试类,输入模块名和表名,达梦数据库要求表名是大写的。
测试一下
我们来简单写个测试类,其功能是查出教师表的所有数据,然后插入一条教师信息,然后在查一次:
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest publicclassteacherTest{ @Autowired privateTeacherMapperteacherMapper; @Test publicvoidteacher(){ Listteachers=teacherMapper.selectList(null); teachers.forEach(System.out::println); System.out.println("=================================="); Teacherteacher=newTeacher(); teacher.setId(6); teacher.setName("zhou"); teacher.setAge(58); teacherMapper.insert(teacher); teachers=teacherMapper.selectList(null); teachers.forEach(System.out::println); } }
=。=看样子我们成功了。
到这里,我们就成功的使用Mybatis-plus成功的生成了代码。
Mybatis-plus主键生成可能出现的问题
让我们来看看错误信息:
org.springframework.dao.DataIntegrityViolationException: ###Errorupdatingdatabase.Cause:java.sql.SQLException:违反列[ID]非空约束 ###Theerrormayexistincom/example/demo/mapper/TeacherMapper.java(bestguess) ###Theerrormayinvolvecom.example.demo.mapper.TeacherMapper.insert-Inline ###Theerroroccurredwhilesettingparameters ###SQL:INSERTINTOTEACHER(NAME,AGE)VALUES(?,?) ###Cause:java.sql.SQLException:违反列[ID]非空约束
很显然,是主键插入时的问题。
我们看一下mybatis-plus生成的实体类。
@TableId(value="ID",type=IdType.AUTO) privateIntegerid;
其中ID的属性设置为自动,然而如果达梦数据库建表的时候如果没有设置主键为自增。=。=那没准就凉了。
我们看一下mybatis-plus支持哪些属性:
@Getter publicenumIdType{ /** *数据库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); privatefinalintkey; IdType(intkey){ this.key=key; } }
可以看出,解决这个问题最简单的方法就是,修改IdType,使用NONE,自己传入id(主键)。
同样的,在自动生成代码的阶段,我们曾经设置过
gc.setIdType(IdType.AUTO);
在这里更改可以直接更改自动生成的代码,甚至也可以选择UUID等方式。
当然,这样并不好,所以也可以修改数据库表,设置ID为自增。
在刚刚的teacher表中执行下面这条语句,就可以修改主键id的属性为自增了。
ALTERTABLETEACHERADDIDidentity(1,1);
然后在运行代码,多半就成了。
到此这篇关于MyBatis-plus+达梦数据库实现自动生成代码的示例的文章就介绍到这了,更多相关MyBatis-plus自动生成代码内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。