MyBatis-plus+达梦数据库实现自动生成代码的示例

作者:筱宁zvj 时间:2024-01-16 03:41:42 

先说点什么

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

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


<dependencies>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter</artifactId>
   </dependency>

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
   </dependency>

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
     <scope>test</scope>
     <exclusions>
       <exclusion>
         <groupId>org.junit.vintage</groupId>
         <artifactId>junit-vintage-engine</artifactId>
       </exclusion>
     </exclusions>
   </dependency>

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-jdbc</artifactId>
   </dependency>

<dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <optional>true</optional>
   </dependency>

<dependency>
     <groupId>io.springfox</groupId>
     <artifactId>springfox-swagger2</artifactId>
     <version>2.7.0</version>
   </dependency>
   <dependency>
     <groupId>io.springfox</groupId>
     <artifactId>springfox-swagger-ui</artifactId>
     <version>2.7.0</version>
   </dependency>

<dependency>
     <groupId>com.baomidou</groupId>
     <artifactId>mybatis-plus-boot-starter</artifactId>
     <version>3.2.0</version>
   </dependency>
   <dependency>
     <groupId>com.baomidou</groupId>
     <artifactId>mybatis-plus-generator</artifactId>
     <version>3.2.0</version>
   </dependency>

<dependency>
     <groupId>org.freemarker</groupId>
     <artifactId>freemarker</artifactId>
     <version>2.3.29</version>
   </dependency>

<dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-test</artifactId>
     <version>5.2.0.RELEASE</version>
     <scope>compile</scope>
   </dependency>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-test</artifactId>
   </dependency>

</dependencies>

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

在达梦数据库的安装目录下有驱动包,我们先把jar包丢进来,放到lib这个文件夹下:

MyBatis-plus+达梦数据库实现自动生成代码的示例

然后配置pom文件:


<dependency>
     <groupId>com.dm</groupId>
     <artifactId>Dm7JdbcDriver</artifactId>
     <version>1.7</version>
     <scope>system</scope>
     <systemPath>${project.basedir}/src/lib/Dm7JdbcDriver18.jar</systemPath>
   </dependency>

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

(配置)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+达梦数据库实现自动生成代码的示例

然后插入一点数据方便测试。

MyBatis-plus+达梦数据库实现自动生成代码的示例

运行测试类,输入模块名和表名,达梦数据库要求表名是大写的。

MyBatis-plus+达梦数据库实现自动生成代码的示例

不出意外,我们就生成成功了。=。=不要问为什么有个students,因为自己测试用的这个。

MyBatis-plus+达梦数据库实现自动生成代码的示例

测试一下

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


@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+达梦数据库实现自动生成代码的示例

到这里,我们就成功的使用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
  * <p>该类型可以通过自己注册自动填充插件进行填充</p>
  */
 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);

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

来源:https://blog.csdn.net/xiaoningzvj/article/details/103028988

标签:MyBatis,plus,自动生成代码
0
投稿

猜你喜欢

  • Python实现输出某区间范围内全部素数的方法

    2022-04-25 10:04:50
  • bootstrapValidator.min.js表单验证插件

    2024-04-10 13:53:46
  • 21行Python代码实现拼写检查器

    2023-10-11 03:33:03
  • Python基于Serializer实现字段验证及序列化

    2023-07-19 21:50:36
  • 在Pycharm中修改文件默认打开方式的方法

    2023-03-12 06:34:23
  • python数据可视化绘制世界人口地图

    2022-04-27 21:31:31
  • Python合并重叠矩形框

    2023-06-11 02:33:41
  • Python通过Pillow实现图片对比

    2023-07-12 08:25:15
  • 一个基于flask的web应用诞生 用户注册功能开发(5)

    2021-10-19 00:48:12
  • Mysql存储引擎MyISAM的常见问题(表损坏、无法访问、磁盘空间不足)

    2024-01-14 22:07:53
  • Python基于Opencv识别两张相似图片

    2021-01-13 20:16:42
  • Python数学建模学习模拟退火算法多变量函数优化示例解析

    2021-05-07 09:36:37
  • Python实现带参数的用户验证功能装饰器示例

    2023-05-15 01:34:05
  • Python第三方包之DingDingBot钉钉机器人

    2022-09-06 14:50:38
  • vuejs事件中心管理组件间的通信详解

    2024-05-22 10:44:27
  • python用plotly实现绘制局部放大图

    2021-06-13 06:30:44
  • Python实现抓取网页并且解析的实例

    2022-01-12 13:24:53
  • Python中一些自然语言工具的使用的入门教程

    2023-08-31 06:17:01
  • 仿迅雷焦点广告效果(JQuery版)

    2009-08-03 14:18:00
  • NumPy中的维度Axis详解

    2021-02-12 12:39:35
  • asp之家 网络编程 m.aspxhome.com