我們使用一個(gè)新的框架難免會(huì)遇到各種問(wèn)題,當(dāng)然使用這款國(guó)產(chǎn)的優(yōu)秀的Mybatis-Plus框架也不例外,下面我就給大家列舉一下使用Mybatis-Plus可能遇到的一些問(wèn)題,并做一下一一的解答。
1:如何排除非表的字段(這個(gè)問(wèn)題一定要注意,我們Java中寫(xiě)的Entity類(lèi)的屬性是和表的字段一一對(duì)應(yīng)的,如果屬性在數(shù)據(jù)庫(kù)中沒(méi)有對(duì)應(yīng)字段程序就會(huì)出錯(cuò)。當(dāng)然表中可以有多的字段)。
使用一些三種方法都可以:(開(kāi)發(fā)中我們經(jīng)常使用第三者方式)
使用 transient 修飾:?
private?transient?String?noColumn;?
使用 static 修飾 :
private?static?String?noColumn;?
使用 TableField 注解:
@TableField(exist=false)
private?String?noColumn;
2:出現(xiàn) Invalid bound statement (not found)?異常?(這種一般是寫(xiě)的mapper接口找不到對(duì)應(yīng)的xml中的mapper中寫(xiě)的sql)
不要懷疑,正視自己,這個(gè)異??隙ㄊ悄悴迦氲淖藙?shì)不對(duì)……
-
檢查是不是引入 jar 沖突
-
檢查 Mapper.java 的掃描路徑
方法一:在 Configuration 類(lèi)上使用注解 MapperScan
@Configuration @MapperScan("com.yourpackage.*.mapper") public class YourConfigClass{ ... }
方法二:在Configuration類(lèi)里面,配置MapperScannerConfigurer
@Bean public MapperScannerConfigurer mapperScannerConfigurer(){ MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer(); //可以通過(guò)環(huán)境變量獲取你的mapper路徑,這樣mapper掃描可以通過(guò)配置文件配置了 scannerConfigurer.setBasePackage("com.yourpackage.*.mapper"); return scannerConfigurer; }
-
檢查是否指定了主鍵?如未指定,則會(huì)導(dǎo)致 selectById 相關(guān) ID 無(wú)法操作,請(qǐng)用注解?@TableId 注解表 ID 主鍵。當(dāng)然?@TableId 注解可以沒(méi)有!但是你的主鍵必須叫 id(忽略大小寫(xiě))
-
SqlSessionFactory不要使用原生的,請(qǐng)使用MybatisSqlSessionFactory
-
檢查是否自定義了SqlInjector,是否復(fù)寫(xiě)了getMethodList()方法,該方法里是否注入了你需要的方法(可參考DefaultSqlInjector)
-
IDEA 默認(rèn)的 build 步驟可能會(huì)引起 mapper 文件無(wú)法正常編譯到對(duì)應(yīng)的 resources 文件夾中,請(qǐng)檢查 build 之后相關(guān)資源文件夾是否有對(duì)應(yīng)的 xml 文件,如果沒(méi)有,請(qǐng)調(diào)整 IDEA 的 build 設(shè)置,推薦調(diào)整為 Maven 或 Gradle 的 build。
3:自定義 SQL 無(wú)法執(zhí)行
問(wèn)題描述:指在 XML 中里面自定義 SQL,卻無(wú)法調(diào)用。本功能同 MyBatis 一樣需要配置 XML 掃描路徑:
Spring MVC 配置
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="typeAliasesPackage" value="xxx.entity" /> <property name="mapperLocations" value="classpath*:/mybatis/*/*.xml"/> ... </bean>
Spring Boot 配置
mybatis-plus: mapper-locations: classpath*:/mapper/**/*.xml
對(duì)于IDEA系列編輯器,XML 文件是不能放在 java 文件夾中的,IDEA 默認(rèn)不會(huì)編譯源碼文件夾中的 XML 文件,可以參照以下方式解決:
1:將配置文件放在 resource 文件夾中
2:對(duì)于 Maven 項(xiàng)目,可指定 POM 文件的 resource
<build> <resources> <resource> <!-- xml放在java目錄下--> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <!--指定資源的位置(xml放在resources下,可以不用指定)--> <resource> <directory>src/main/resources</directory> </resource> </resources> </build>
提示?注意!
Maven 多模塊項(xiàng)目的掃描路徑需以 classpath*:?開(kāi)頭?(即加載多個(gè) jar 包下的 XML 文件)
4:關(guān)于 Long 型主鍵填充不生效的問(wèn)題
檢查是不是用了long而不是Long!
提示?
long類(lèi)型默認(rèn)值為?0,而?MP?只會(huì)判斷是否為?null
JavaScript 無(wú)法處理 Java 的長(zhǎng)整型 Long 導(dǎo)致精度丟失,具體表現(xiàn)為主鍵最后兩位永遠(yuǎn)為 0,解決思路:Long 轉(zhuǎn)為 String 返回。
FastJson 處理方式
@Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter(); FastJsonConfig fjc = new FastJsonConfig(); // 配置序列化策略 fjc.setSerializerFeatures(SerializerFeature.BrowserCompatible); fastJsonConverter.setFastJsonConfig(fjc); converters.add(fastJsonConverter); }
JackJson 處理方式
方式一
/ 注解 處理,這里可以配置公共 baseEntity 處理 @JsonSerialize(using=ToStringSerializer.class) public long getId() { return id; }
方式二
/ 全局配置序列化返回 JSON 處理 final ObjectMapper objectMapper = new ObjectMapper(); SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); objectMapper.registerModule(simpleModule);
5:插入或更新的字段有 空字符串 或者 null
FieldStrategy 有以下策略:
方式一:調(diào)整字段驗(yàn)證注解
根據(jù)具體情況,在需要更新的字段中調(diào)整驗(yàn)證注解,如驗(yàn)證非空:
@TableField(strategy=FieldStrategy.NOT_EMPTY)
方式二:使用 UpdateWrapper (3.x)
使用以下方法來(lái)進(jìn)行更新或插入操作:
//updateAllColumnById(entity) // 全部字段更新: 3.0已經(jīng)移除 mapper.update( new User().setName("mp").setAge(3), Wrappers.<User>lambdaUpdate() .set(User::getEmail, null) //把email設(shè)置成null .eq(User::getId, 2) ); //也可以參考下面這種寫(xiě)法 mapper.update( null, Wrappers.<User>lambdaUpdate() .set(User::getAge, 3) .set(User::getName, "mp") .set(User::getEmail, null) //把email設(shè)置成null .eq(User::getId, 2) );
6:字段類(lèi)型為 bit、tinyint(1)?時(shí)映射為 boolean 類(lèi)型
默認(rèn)mysql驅(qū)動(dòng)會(huì)把tinyint(1)字段映射為boolean: 0=false, 非0=true。MyBatis 是不會(huì)自動(dòng)處理該映射,如果不想把tinyint(1)映射為boolean類(lèi)型:
修改類(lèi)型tinyint(1)為tinyint(2)或者int。
需要修改請(qǐng)求連接添加參數(shù) tinyInt1isBit=false,如下:
jdbc:mysql://127.0.0.1:3306/mp?tinyInt1isBit=false
7:MP 如何查指定的幾個(gè)字段
EntityWrapper.sqlSelect 配置你想要查詢(xún)的字段
//2.x EntityWrapper<H2User> ew = new EntityWrapper<>(); ew.setSqlSelect("test_id as id, name, age");//只查詢(xún)3個(gè)字段 List<H2User> list = userService.selectList(ew); for(H2User u:list){ Assert.assertNotNull(u.getId()); Assert.assertNotNull(u.getName()); Assert.assertNull(u.getPrice()); // 這個(gè)字段沒(méi)有查詢(xún)出來(lái) } //3.x mapper.selectList( Wrappers.<User>lambdaQuery() .select(User::getId, User::getName) ); //或者使用QueryWrapper mapper.selectList( new QueryWrapper<User>() .select("id","name") );
8:Cause: org.apache.ibatis.type.TypeException:Error setting null for parameter #1 with JdbcType OTHER
配置 jdbcTypeForNull=NULL Spring Bean 配置方式:
MybatisConfiguration configuration = new MybatisConfiguration(); configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class); configuration.setJdbcTypeForNull(JdbcType.NULL); configuration.setMapUnderscoreToCamelCase(true);//開(kāi)啟下劃線(xiàn)轉(zhuǎn)駝峰 sqlSessionFactory.setConfiguration(configuration);
yml?配置
mybatis-plus: configuration: jdbc-type-for-null: 'null'
9:通用 insertBatch 為什么放在 service 層處理
SQL 長(zhǎng)度有限制海量數(shù)據(jù)量單條 SQL 無(wú)法執(zhí)行,就算可執(zhí)行也容易引起內(nèi)存泄露 JDBC 連接超時(shí)等
不同數(shù)據(jù)庫(kù)對(duì)于單條 SQL 批量語(yǔ)法不一樣不利于通用
目前的解決方案:循環(huán)預(yù)處理批量提交,雖然性能比單 SQL 慢但是可以解決以上問(wèn)題。
10:?jiǎn)?dòng) mybatis 本身的 log 日志
# 方式一 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 方式二 application.yml 中增加配置,指定 mapper 文件所在的包 logging: level: com.baomidou.example.mapper: debug
這些問(wèn)題都是摘自Mybatis-Plus的官方網(wǎng)站地址如下:
https://www.baomidou.com/pages/f84a74/
如果想看更多的問(wèn)題請(qǐng)?jiān)L問(wèn)上面的網(wǎng)址,當(dāng)然更多的問(wèn)題也可以訪問(wèn)Mybatis-Plus的github地址那里面有很多人提的issue。很多開(kāi)發(fā)中遇到的問(wèn)題都可以在issue里面找到答案,我也是常常去看那里的issue從里面獲取答案獲取靈感。歡迎大家關(guān)注我的微信公眾號(hào),繼續(xù)為大家推出好的文章。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-473005.html
晚霞和微風(fēng)是真的很美。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-473005.html
到了這里,關(guān)于使用Mybatis-Plus問(wèn)題解答的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!