1.設置外鍵失敗問題
1.問題描述
alter table stu add foreign key(cno) references user(id);
Failed to add the foreign key constraint. Missing index for constraint ‘stu_ibfk_1’ in the referenced table ‘user’
2.解決方案:
作爲外鍵,user表中的id必須是唯一值,因此得添加約束unique,或者primary key;
設置外鍵的辦法:
ALTER TABLE user ADD UNIQUE (id)
2.批量刪除出現 sql injection violation, multi-statement not allow : …的問題
1.問題描述:
【異常】——Cause: java.sql.SQLException: sql injection violation, multi-statement not allow :XXXXX
2.解決方案
不允許批量執行,其本質錯誤是Druid的防火牆配置(WallConfig)中變量
multiStatementAllow默認爲false,在源碼中當多條語句時,判斷了是否開啓了批量執行,
否則報錯不允許執行多條語句。
1.引入阿里的Durid連接池
<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${durid}</version>
</dependency>
2.創建一個配置類來開啓Druid的防火牆配置
package com.boot.zhiyi.config;
import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@Configuration
public class DuridConfig {
@Autowired
WallFilter wallFilter;
@Bean(name = "dataSource") //聲明其爲Bean實例
@Primary //在同樣的DataSource中,首先使用被標註的DataSource
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource(){
DruidDataSource datasource = new DruidDataSource();
// filter
List<Filter> filters = new ArrayList<>();
filters.add(wallFilter);
datasource.setProxyFilters(filters);
return datasource;
}
@Bean(name = "wallFilter")
@DependsOn("wallConfig")
public WallFilter wallFilter(WallConfig wallConfig) {
WallFilter wallFilter = new WallFilter();
wallFilter.setConfig(wallConfig);
return wallFilter;
}
@Bean(name = "wallConfig")
public WallConfig wallConfig(){
WallConfig wallConfig = new WallConfig();
wallConfig.setMultiStatementAllow(true);//允許一次執行多條語句
wallConfig.setNoneBaseStatementAllow(true);//允許一次執行多條語句
return wallConfig;
}
}
3.在application.properties的配置文件中修改jdb連接路徑,添加allowMultiQueries=true,改爲如下:
spring.datasource.url=jdbc:mysql://localhost:3306/vqqdeoplay?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&&zeroDateTimeBehavior=CONVERT_TO_NULL&&serverTimezone=GMT%2B8&useSSL=false&&allowMultiQueries=true