Springboot+MyBatis-plus+postgresSQL 的整合

https://blog.csdn.net/xuxiannian/article/details/99625085

 

Springboot+MyBatis-plus+postgresSQL 的整合

禛陌 2019-08-15 12:20:10  6752  收藏 7

分类专栏: 技术相关 文章标签: Springboot+MyBatis-plus+postgresSQL

版权

磨叨一下

MyBatis-plus 请参看https://mp.baomidou.com/,之前也有写过一个较简单的入门级文章,可以参看
在整合的过程中遇到了一些坑,来扒一扒。
(1) 首先在利用MyBatis-plus-generator 的AutoGenerator类生成代码阶段,死活不生成相应的类。换成MYSQL也是OK的, Oracle也是没有问题。写了一个PostresSQL的直连操作也OK,这说明驱动和连接地址是OK的,问题出在生成过程中。跟入源码,发现在生成时,postgres如果不指定命名空间,会自动加一个命名空间为public。我给数据库分了命名空间,所以,是这个原因,无法找到相应的表,所以一直不能生成相应的类,所以需要给dataSourceConfig.setSchemaName设置指定的命名空间.... 源码在 com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder.getTablesInfo方法中如下图所示:
  • 1
  • 2
  • 3

在这里插入图片描述

(2) 整合后又报了个破错:Caused by: java.sql.SQLFeatureNotSupportedException: 这个   org.postgresql.jdbc.PgConnection.createClob() 方法尚未被实作。网上找了一个配制,制完可以解决这个问题
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
(3)  类生成了,但发现生成的相应MAPP无法被扫描到,手动在相应的mapper中加了@Mapper注解,这可累死了,所以去掉注解,直接在springboot启动类中配置@MapperScan(mapper的相应名表)。
(4) 写了个测试用例 ,死活告诉我说表名不存在,实际上是没有加上命名空间,即表名前缀,所以死活报错过不去。接着跟源码吧,看了生成的地方,没有办法在生成mapper时把这个表名前缀加上。那只能想mybaits是如何工作的了。假装么想一下,也应该是把相应的表名和映射的类放在一个类似map的对象中,根据类名的表名之类  ,然后在拼装SQL,即然map生成了,那如何在拼时加上呢。嗯,得去查查springboot整合mybaits的配置,有没有加命名空间的,果然,搜到了加前缀的配制:
mybatis-plus:global-config:db-config:table-prefix: platform
以上是在做整合、生成代码、测试过程中遇到的坑,下面来说说整合过程~~~~~~~~~~~~~~~~~~~~
  •  

1.配制POM

      <!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.16</version></dependency><!--数据库驱动postgresSQL--><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.2.5.jre7</version></dependency><!--mybatis-plus依赖,报了一个spi错,大致查了下,据说是javssist(3.15.0-GA)版本过低的问题,大家不一定会报,可能与我用的包的依赖有关。所以排除了javasist,在后面又加了一个高版本的。--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.2</version><exclusions><exclusion><groupId>org.javassist</groupId><artifactId>javassist</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.21.0-GA</version></dependency><!--mybaits-plus生成代码的依赖-><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.1.2</version></dependency><!--mybaits-plus-generator生成代码时,会根据模板类生成相就在的类文件,所以模块需要引入的JAR--><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId></dependency>
  •  

2 application.yml配制

# springboot整合postgres连接配制
spring:datasource:url: jdbc:postgresql://192.168.1.84:5432/supervison_platformusername: supervisonpassword: 123driver-class-name: org.postgresql.Driver
#解决整合后报的一个错:<aused by: java.sql.SQLFeatureNotSupportedException: 这个 org.postgresql.jdbc.PgConnection.createClob() 方法尚未被实作。>    jpa:properties:hibernate:jdbc:lob:non_contextual_creation: true
#mybatis-plus整合,加了表前缀的全局配制,加了类中与表中驼峰的映射,不加会查不出数据,因无法做表与类字段映射
mybatis-plus:global-config:db-config:table-prefix: platform.mapper-locations: classpath*:mapper/*Mapper.xmltype-aliases-package: com.zhanglu.test.supervison.api.dao.entityconfiguration:map-underscore-to-camel-case: true
  •  

generator生成代码

package com.zhanglu.test.supervison.api.util;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;import static com.baomidou.mybatisplus.generator.config.rules.DateType.ONLY_DATE;/*** @author zhanglu* @ClassName: CodeGeneration* @Description: 代码生成器* @date 2019年8月14日 下午2:55:14*/
public class CodeGeneration {public static String scanner(String tip) {/** 查询出当前库所有表信息*	SELECT A.tablename, obj_description(relfilenode, 'pg_class') AS comments FROM pg_tables A, pg_class B 				  WHERE A.schemaname='platform' AND A.tablename = B.relname*/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 + "!");}/*** @param args* @Title: main* @Description: 生成*/public static void main(String[] args) {AutoGenerator mpg = new AutoGenerator();// 全局配置GlobalConfig gc = new GlobalConfig();final String projectPath = System.getProperty("user.dir") + "/supervison-api";String filePath = projectPath + "/src/main/java";System.out.println("生成文件 的路径为:" + filePath);gc.setOutputDir(filePath);
//        gc.setOutputDir("E://code");
//        gc.setFileOverride(true);
//        gc.setActiveRecord(false);// 不需要ActiveRecord特性的请改为false
//        gc.setEnableCache(false);// XML 二级缓存
//        gc.setBaseResultMap(true);// XML ResultMap
//        gc.setBaseColumnList(false);// XML columListgc.setOpen(false);gc.setDateType(ONLY_DATE);gc.setAuthor("zhanglu_autoGeneration");// 作者// 自定义文件命名,注意 %s 会自动填充表实体属性!
//        gc.setControllerName("%sAction");
//        gc.setServiceName("%sService");
//        gc.setServiceImplName("%sServiceImpl");
//        gc.setMapperName("%sMapper");
//        gc.setXmlName("%sMapper");mpg.setGlobalConfig(gc);// 数据源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setDriverName("org.postgresql.Driver");dsc.setUsername("supervison");dsc.setPassword("123");dsc.setDbType(DbType.POSTGRE_SQL);dsc.setUrl("jdbc:postgresql://10.212.170.84:5432/supervison_platform");dsc.setSchemaName("platform");mpg.setDataSource(dsc);// 包配置final PackageConfig pc = new PackageConfig();
//        pc.setModuleName("");pc.setParent("com.chnenergy.monitoring.supervison.api.dao");//以下生成的类类型的map的KEY值,可以去常量类中ConstVal获得,为了省事,直接写了字符串Map m = new HashMap();m.put("entity_path", gc.getOutputDir() + File.separator + (pc.getParent().replaceAll("\\.", "\\" + File.separator)) + "/entity");m.put("mapper_path", gc.getOutputDir() + File.separator + (pc.getParent().replaceAll("\\.", "\\" + File.separator)) + "/mapper");
//        m.put("service_path",gc.getOutputDir() + File.separator + (pc.getParent().replaceAll("\\.", "\\" + File.separator)) +"/service");
//        m.put("service_impl_path",gc.getOutputDir() + File.separator + (pc.getParent().replaceAll("\\.", "\\" + File.separator)) + "/service/impl");
//        m.put(ConstVal.CONTROLLER_PATH,gc.getOutputDir() + File.separator + (pc.getParent().replaceAll("\\.", "\\" + File.separator)) + "controller");
//                m.put(ConstVal.XML_PATH,gc.getOutputDir() + File.separator + (pc.getParent().replaceAll("\\.", "\\" + File.separator)) + "/xml");pc.setPathInfo(m);// 自定义配置InjectionConfig cfg = new InjectionConfig() {@Overridepublic void initMap() {// to do nothing}};cfg.setFileOutConfigList(null);mpg.setCfg(cfg);mpg.setPackageInfo(pc);// 配置模板TemplateConfig templateConfig = new TemplateConfig();// 配置自定义输出模板//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别// templateConfig.setEntity("templates/entity2.java");// templateConfig.setService();// templateConfig.setController();
//        templateConfig.setXml(TEMPLATE_XML);mpg.setTemplate(templateConfig);// 策略配置StrategyConfig strategy = new StrategyConfig();strategy.setNaming(NamingStrategy.underline_to_camel);strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//        strategy.setTablePrefix("platform");//strategy.setSuperEntityClass("com.baomidou.ant.common.BaseEntity");strategy.setEntityLombokModel(true);strategy.setRestControllerStyle(true);// 写于父类中的公共字段//strategy.setSuperEntityColumns("id");strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
//        strategy.setControllerMappingHyphenStyle(true);
//        strategy.setTablePrefix(pc.getModuleName() + "_");mpg.setStrategy(strategy);mpg.setTemplateEngine(new FreemarkerTemplateEngine());// 执行生成mpg.execute();}}
  •  

生成的结构如下所示:

在这里插入图片描述
当然,完全可以去掉xml,没啥用,也可以生成实现类和controller类,SQL可以通过JPA方式直接写就行,eg:

@Select("SELECT * FROM ZHANGLU_OFFICIAL_NEWS N WHERE N. ID IN( SELECT G .NEWS_ID FROM ZHANGLU_OFFICIAL_GROUP_INTE G WHERE G . GROUP_ID = #{groupId}) ORDER BY CREATE_DATE")
IPage<ZhangluOfficialNews> selectPageByGroupId(IPage<ZhangluOfficialNews> page, @Param("groupId") String groupId);
  •  

上个测试用例跑一下

package com.zhanglu.test.supervison.api.service.impl;import com.zhanglu.test.supervison.api.dao.entity.PhoOrganization;
import com.zhanglu.test.supervison.api.dao.mapper.PhoOrganizationMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;@SpringBootTest
@RunWith(SpringRunner.class)
public class PhoOrganizationServiceImplTest {@Autowiredprivate PhoOrganizationMapper mapper;@Testpublic void query() {PhoOrganization organization = mapper.selectById("ac524ede04b847079cb44c9db4fde14e");System.out.println(organization.getAddress());}}
  • 1

  •  

以上就OK了,大半天遇到的几个小坑。整理下来,希望对大家有点帮助

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

String中的compareTo()方法

compareTo()方法 String类中的compareTo()方法将返回两个字符串对象的比较结果&#xff0c;若相等&#xff0c;返回0。不相等时&#xff0c;从两个字符串第1个字符开始比较&#xff0c;返回第一个不相等的字符差&#xff1b;另一种情况&#xff0c;较长字符串的前面部分恰巧是较…

使用Senparc.Weixin.WxOpen开发高可用的微信小程序

Senparc.Weixin SDK介绍 Senparc.Weixin SDk是目前.net平台上使用率最高的微信SDK&#xff0c;除硬件平台暂未发布以外覆盖了所有微信平台模块&#xff0c;自2013年免费开源起已经持续更新了4年&#xff0c;是GitHub上目前Star和Fork数最多的中国C#开源项目。 目前大多数模块都…

java使用循环案例——CSDN博客

/*** * Title: test_while* Description: 该方法的主要作用&#xff1a;while循环&#xff0c;输出100个我爱编程* param 设定文件 * return 返回类型&#xff1a;void * throws*/Testpublic void test_while(){int i 1;while (i<100) {System.out.println("第&…

Java中的事务——JDBC事务和JTA事务

转载自 Java中的事务——JDBC事务和JTA事务 我的博客中曾经关于事务有过很多讨论&#xff0c;之前的事务介绍基本都是数据库层面的事务&#xff0c;本文来介绍一下J2EE中和事务相关的内容&#xff0c;在阅读本文之前&#xff0c;希望读者对分布式有一定的了解。 关于事务的基础…

IDEA使用笔记(八)——自动生成 serialVersionUID 的设置

Ihttps://www.cnblogs.com/godtrue/p/7674487.html https://www.cnblogs.com/godtrue/p/7674487.html DEA使用笔记&#xff08;八&#xff09;——自动生成 serialVersionUID 的设置 这个设置比较简单&#xff0c;也有一些博文已经写到了&#xff0c;为什么我还要写哪&#…

从事件和DDD入手来构建微服务

领域驱动设计&#xff08;Domain-Driven Design&#xff0c;DDD&#xff09;是一项很伟大的技术&#xff0c;它拉近了设计与程序实际所服务的领域&#xff0c;但是通常我们会关注结构&#xff0c;从而太早地做出决策&#xff0c;这并非DDD的本意。相反&#xff0c;在领域中&…

break 和continue的用法 java——CSDN

/*** * Title: test_break_coutuint* Description: 该方法的主要作用&#xff1a;break 和continue的用法* 如果成绩等于5结束当前循环* 如果等于10的话退出* param 设定文件 * return 返回类型&#xff1a;void * throws*/Testpublic void test_break_coutuint(){for (i…

JTA 深度历险 - 原理与实现

转载自 JTA 深度历险 - 原理与实现 利用 JTA 处理事务 什么是事务处理 事务是计算机应用中不可或缺的组件模型&#xff0c;它保证了用户操作的原子性 ( Atomicity )、一致性 ( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )。关于事务最经典的示例莫过于信…

计算男孩女孩小孩各有几个 java——CSDN博客

/*** * Title: test_men_women_kids* Description: 该方法的主要作用&#xff1a;* 男人女人小孩30* 一共花50先令* 男人&#xff1a;3 女人&#xff1a;2 小孩&#xff1a;1* param 设定文件 * return 返回类型&#xff1a;void * throws*/Testpublic void test_m…

为了支持AOP的编程模式,我为.NET Core写了一个轻量级的Interception框架[开源]

ASP.NET Core具有一个以ServiceCollection和ServiceProvider为核心的依赖注入框架&#xff0c;虽然这只是一个很轻量级的框架&#xff0c;但是在大部分情况下能够满足我们的需要。不过我觉得它最缺乏的是针对AOP的支持&#xff0c;虽然这个依赖注入框架提供了扩展点使我们可以很…

装箱VS拆箱

我们一般将“基本数据类型转换成包装类”的过程叫做装箱&#xff0c;将“包装类转换成基本数据类型”的过程叫做拆箱。 装箱可以分为手动装箱和自动装箱&#xff1a; 拆箱也可以分为手动拆箱和自动拆箱&#xff1a;

事务模型与分布式事务总结思考

转载自 事务模型与分布式事务总结思考 1. 介绍 之前了解过一些分布式事务处理的思想&#xff0c;包括MVCC、TCC等。但是对具体实现的规范和约束还不够理解清晰。本文从事务模型分类来讨论常见的事务模型。事务模型的含义&#xff0c;应该指的是我们如何去使用可控制事务。 首…

Java连接PostgreSQL数据库,增删改查

https://blog.csdn.net/u013456370/article/details/79668420 通过eclipse工具&#xff0c;新建Maven项目&#xff1a; 添加&#xff1a;postgresql的jar包&#xff08;我使用的是&#xff1a;版本&#xff1a;42.2.2&#xff09; 修改pom.xml文件&#xff1a; <!-- https…

java打印九九乘法表——CSDN博客

/*** * Title: test_jiujiu* Description: 该方法的主要作用&#xff1a;九九乘法表* param 设定文件 * return 返回类型&#xff1a;void * throws*/Testpublic void test_jiujiu(){//打印九九乘法表for (int i 1; i < 10; i) {for (int j 1; j < i; j) {System…

我的这10年——从机械绘图 到 炼油 到 微软MVP 的华丽转身

年底了&#xff0c;各种总结计划满天飞&#xff0c;有空的时候我也一直在思考这么多年&#xff0c;是怎么过来的。也曾经很迷茫&#xff0c;希望经验和经历能给大家一点带来一点正能量的东西。10年很长&#xff0c;10年前说实话我没有思考过现在的样子&#xff0c;但10年前的日…

MySQL中的共享锁与排他锁

转载自 MySQL中的共享锁与排他锁 在MySQL中的行级锁,表级锁,页级锁中介绍过&#xff0c;行级锁是Mysql中锁定粒度最细的一种锁&#xff0c;行级锁能大大减少数据库操作的冲突。行级锁分为共享锁和排他锁两种&#xff0c;本文将详细介绍共享锁及排他锁的概念、使用方式及注意事项…

基本类型和字符串互相转换

将基本数据类型转换成字符串 将字符串转换成基本数据类型

java操作字符串——CSDN博客

/*** * Title: test_class_arrat* Description: 该方法的主要作用&#xff1a;* param 设定文件 * return 返回类型&#xff1a;void * throws*/Testpublic void test_is_equals(){//String str1new String("我爱祖国。");//String str2new String("我爱祖…