Spring配置项<context:annotation-config/>解释说明

Spring配置项<context:annotation-config/>解释说明

 在基于主机方式配置Spring的配置文件中,你可能会见到<context:annotation-config/>这样一条配置,他的作用是式地向 Spring 容器注册

AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、

PersistenceAnnotationBeanPostProcessor 以及 RequiredAnnotationBeanPostProcessor 这 4 个BeanPostProcessor。

注册这4个BeanPostProcessor的作用,就是为了你的系统能够识别相应的注解。

例如:

如果你想使用@Autowired注解,那么就必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。传统声明方式如下:

  
  1. <bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/> 

如果想使用@ Resource 、@ PostConstruct、@ PreDestroy等注解就必须声明CommonAnnotationBeanPostProcessor

如果想使用@PersistenceContext注解,就必须声明PersistenceAnnotationBeanPostProcessor的Bean。

如果想使用 @Required的注解,就必须声明RequiredAnnotationBeanPostProcessor的Bean。同样,传统的声明方式如下:

  
  1. <bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/> 

一般来说,这些注解我们还是比较常用,尤其是Antowired的注解,在自动注入的时候更是经常使用,所以如果总是需要按照传统的方式一条一条配置显得有些繁琐和没有必要,于是spring给我们提供<context:annotation-config/>的简化配置方式,自动帮你完成声明。

   不过,呵呵,我们使用注解一般都会配置扫描包路径选项

  
  1. <context:component-scan base-package=”XX.XX”/> 

    该配置项其实也包含了自动注入上述processor的功能,因此当使用 <context:component-scan/> 后,就可以将 <context:annotation-config/> 移除了。


<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <context:component-scan base-package="com.dao,com.controller.*"/> <!--配置数据源--> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/bs_lib?characterEncoding=utf8" /> <property name="username" value="root"/> <property name="password" value="123456" /> <!--最大连接数 --> <property name="maxTotal" value="30"/> <!-- 最大空闲连接数 --> <property name="maxIdle" value="10"/> <!-- 初始化连接数--> <property name="initialSize" value="5"/> </bean> <!--添加事务支持--> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!--开启事务注解--> <tx:annotation-driven transaction-manager="txManager" /> <!--配置MyBatis工厂,同时指定数据源,并与MyBatis完美整合 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- configLocation 的属性值为 MyBatis 的核心配置文件 --> <property name="configLocation" value="classpath:com/mybatis/mybatis-config.xml"/> </bean> <!-- Mapper 代理开发,使用 Spring自动扫描MyBatis的接口井装配 (Spring将指定包中所有被0Mapper注解标注的接口自动装配为MyBatis的映射接口)--> <bean class="org.mybatis.spring.mapper.MapperscannerConfigurer"> <property name="basePackage" value="com.dao"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> </beans>
最新发布
11-19
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>ssm</display-name> <!-- 编码过滤器开始 --> <filter> <filter-name>charset</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>charset</filter-name> <!-- <url-pattern>*.action</url-pattern> --> <servlet-name>springmvc</servlet-name> </filter-mapping> <!-- 编码过滤器结束 --> <!-- 配置spring容器的监听器 开始 目地:在启用tomcat的时候加载 applicationContext.xml ApplicationContext context=new ClassPathXmlApplicationContext("classpath:applicationContext.xml') --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置上下文的参数 contextConfigLocation 在org.springframework.web.context.ContextLoader里面--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 配置spring容器的监听器 结束--> <!-- 配置前端控制器开始 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--配置contextConfigLocation --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <!-- load-on-startup 1 代表当tomcat启动加web.xml里就创建 DispatcherServlet的对象 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- *.action:所以的在xxxx.action结尾的请求都交给DispatcherServlet /* 所以的请求都交给DispacherServlet 包含静态文件的地址 js css png gif,使用此种方式可以实现 RESTful风格的url --> <url-pattern>*.html</url-pattern> </servlet-mapping> <!-- 配置前端控制器结束 --> <!--欢迎页面 当tomcat启动的时候 直接执行的页面--> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app> classpath填什么?
08-08
给你pom.xml文件内容:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.6</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>b-spring</artifactId> <version>0.0.1-SNAPSHOT</version> <name>b-spring</name> <description>b-spring</description> <url/> <licenses> <license/> </licenses> <developers> <developer/> </developers> <scm> <connection/> <developerConnection/> <tag/> <url/> </scm> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.7</version> <!-- 关键:排除旧版本 mybatis-spring --> <exclusions> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> </exclusion> </exclusions> </dependency> <!-- 显式引入正确版本 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> </dependency> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>RELEASE</version> <scope>compile</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <annotationProcessorPaths> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> </path> </annotationProcessorPaths> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project> application.yml:server: port: 8090 spring: datasource: url: jdbc:mysql://localhost:3307/user?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 username: root password: root 先检查一下这两个配置文件是否会导致空数组的问题
10-15
<think>根据提供的pom.xml和application.yml,我们需要分析可能导致接口返回空数组的原因。以下是详细的检查点和可能的解决方案: ### 1. 依赖冲突分析(重点) 在pom.xml中,我们看到使用了MyBatis-Plus,并且排除了旧版本的`mybatis-spring`,然后显式引入了3.0.3版本。这可能是关键问题,因为Spring Boot 3.x通常需要更高版本的MyBatis-Spring。 **问题分析**: - Spring Boot 3.x 要求 MyBatis-Spring 至少为 3.0.x(推荐3.0.3以上) - 但MyBatis-Plus 3.5.7默认依赖的MyBatis-Spring版本可能与Spring Boot 3.5.6不兼容 **解决方案**:移除显式指定的版本,使用MyBatis-Plus内置的版本。 ```xml <!-- 修改MyBatis-Plus依赖,移除排除项和显式引入 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.7</version> </dependency> ``` ### 2. 数据源配置检查 application.yml中的数据库连接配置正常,但需要确认: - 数据库是否存在且可连接 - 表结构是否匹配实体类 ### 3. MyBatis-Plus配置缺失 在application.yml中,没有配置MyBatis-Plus的相关属性,如mapper扫描路径等(但通常通过注解配置)。 **解决方案**:在启动类上添加Mapper扫描注解。 ```java @SpringBootApplication @MapperScan("com.example.mapper") // 替换为实际的mapper包路径 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` ### 4. 日志配置 为了查看SQL执行情况,添加日志配置: ```yaml # application.yml 增加 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` ### 5. 完整pom.xml修正 ```xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.6</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>b-spring</artifactId> <version>0.0.1-SNAPSHOT</version> <name>b-spring</name> <description>b-spring</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.7</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project> ``` ### 6. 验证步骤 1. 更新pom.xml并重新加载Maven依赖 2. 在启动类添加`@MapperScan` 3. 运行应用,观察控制台输出: - 应该看到Hikari连接池启动成功 - 如果有SQL执行,会打印SQL语句 4. 访问接口,检查是否返回数据 ### 7. 常见问题排查表 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 连接失败 | 数据库配置错误 | 检查application.yml中的url、用户名、密码 | | 表不存在 | 表名与实体类不匹配 | 使用`@TableName`指定表名 | | 列不匹配 | 列名与字段名不一致 | 使用`@TableField`指定列名 | | 无SQL日志 | 日志配置错误 | 确认`log-impl`配置正确 | | 依赖冲突 | 版本不兼容 | 清理依赖冲突(如上修正) | ### 8. 依赖树检查命令 如果问题仍然存在,运行Maven命令检查依赖树: ```bash mvn dependency:tree ``` 重点关注MyBatis-Spring和MyBatis-Plus的版本。 §§相关问题§§: 1. 如何解决Maven依赖冲突? 2. Spring Boot 3.x与MyBatis-Plus的版本兼容性如何? 3. 如何在Spring Boot中配置多数据源? 4. MyBatis-Plus有哪些常用注解? </think># 配置文件分析及解决方案 根据您提供的 `pom.xml` 和 `application.yml` 文件,我将分析可能导致接口返回空数组的问题并提供完整的解决方案。 ## 配置文件问题分析 ### 1. pom.xml 依赖冲突问题(关键问题) ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.7</version> <exclusions> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>3.0.3</version> </dependency> ``` **问题分析**: - MyBatis-Plus 3.5.7 默认使用的是 `mybatis-spring-boot-starter` 3.0.3 - Spring Boot 3.5.6 需要 `mybatis-spring` 3.0.3 的兼容版本 - **关键隐患**:MyBatis-Plus 3.5.7 实际依赖的是 `mybatis-spring` 3.0.3,但强制排除并显式引入可能破坏版本兼容性 ### 2. Lombok 配置问题 ```xml <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <optional>true</optional> </dependency> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> ``` **问题分析**: - Lombok 版本 1.18.30 与 Spring Boot 3.5.6 推荐的 1.18.30 一致,没有问题 - `<optional>true</optional>` 和 `<exclude>` 配置正确,确保 lombok 不会打包到最终应用中 ### 3. MySQL 驱动配置 ```xml <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> ``` **问题分析**: - `mysql-connector-j` 是 MySQL 官方驱动的最新命名方式(旧版是 `mysql-connector-java`) - `runtime` 作用域正确,确保驱动在运行时可用 ### 4. application.yml 配置 ```yaml spring: datasource: url: jdbc:mysql://localhost:3307/user?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 username: root password: root ``` **问题分析**: - 连接字符串中的 `serverTimezone=GMT%2B8` 在 YAML 中需要正确转义 - 建议使用更安全的时区设置方式 ## 完整的配置文件修正方案 ### 1. pom.xml 修正版本 ```xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.6</version> <relativePath/> </parent> <groupId>com.example</groupId> <artifactId>b-spring</artifactId> <version>0.0.1-SNAPSHOT</version> <name>b-spring</name> <properties> <java.version>17</java.version> <!-- 统一MyBatis版本 --> <mybatis-plus.version>3.5.7</mybatis-plus.version> <mybatis-spring.version>3.0.3</mybatis-spring.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 修正后的MyBatis-Plus依赖 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> <!-- 不再排除 mybatis-spring --> </dependency> <!-- 确保版本统一 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> <!-- 添加HikariCP连接池性能监控 --> <dependency> <groupId>com.github.gavlyukovskiy</groupId> <artifactId>datasource-proxy-spring-boot-starter</artifactId> <version>1.9.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <annotationProcessorPaths> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </path> </annotationProcessorPaths> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project> ``` ### 2. application.yml 增强配置 ```yaml server: port: 8090 servlet: context-path: /api spring: datasource: url: jdbc:mysql://localhost:3307/user?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver hikari: pool-name: SpringBootHikariCP maximum-pool-size: 10 minimum-idle: 5 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000 # MyBatis-Plus 配置 mybatis-plus: configuration: map-underscore-to-camel-case: true # 自动驼峰转换 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # SQL日志 default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler global-config: db-config: id-type: auto # 主键自增 logic-delete-field: deleted # 逻辑删除字段 logic-delete-value: 1 # 删除值 logic-not-delete-value: 0 # 未删除值 # 开启SQL监控 logging: level: root: INFO com.example: DEBUG # 项目包路径 com.baomidou.mybatisplus: TRACE org.springframework.jdbc: DEBUG net.ttddyy.dsproxy: INFO # 数据源代理日志 ``` ### 3. 添加配置类确保兼容性 ```java import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 分页插件 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 乐观锁插件 (可选) // interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; } } ``` ### 4. 启动类添加Mapper扫描 ```java import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.example.mapper") // 替换为实际Mapper包路径 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` ## 验证配置是否生效 ### 1. 依赖冲突检查类 ```java import org.springframework.boot.CommandLineRunner; import org.springframework.core.SpringVersion; import org.springframework.stereotype.Component; @Component public class DependencyChecker implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("\n===== 环境信息 ====="); System.out.println("Spring Framework 版本: " + SpringVersion.getVersion()); System.out.println("Spring Boot 版本: " + org.springframework.boot.SpringBootVersion.getVersion()); checkClassVersion("org.mybatis.spring.SqlSessionTemplate", "MyBatis-Spring"); checkClassVersion("com.baomidou.mybatisplus.core.MybatisConfiguration", "MyBatis-Plus"); } private void checkClassVersion(String className, String componentName) { try { Class<?> clazz = Class.forName(className); Package pkg = clazz.getPackage(); System.out.printf("%s 版本: %s%n", componentName, pkg.getImplementationVersion()); } catch (ClassNotFoundException e) { System.err.printf("❌ 错误: %s 未找到!%n", componentName); } } } ``` ### 2. 数据库连接测试服务 ```java import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.core.io.ClassPathResource; import org.springframework.jdbc.datasource.init.ScriptUtils; import org.springframework.stereotype.Service; import javax.sql.DataSource; import java.sql.Connection; import java.sql.DatabaseMetaData; @Slf4j @Service public class DatabaseValidator implements CommandLineRunner { private final DataSource dataSource; @Value("${spring.datasource.url}") private String dbUrl; public DatabaseValidator(DataSource dataSource) { this.dataSource = dataSource; } @Override public void run(String... args) throws Exception { try (Connection conn = dataSource.getConnection()) { DatabaseMetaData metaData = conn.getMetaData(); log.info("\n===== 数据库连接信息 ====="); log.info("URL: {}", dbUrl); log.info("用户名: {}", metaData.getUserName()); log.info("数据库产品: {} {}", metaData.getDatabaseProductName(), metaData.getDatabaseProductVersion()); log.info("\n===== 表结构验证 ====="); validateTableStructure(conn, "user", List.of("id", "name", "age", "email")); log.info("\n===== 数据初始化 ====="); initializeSampleData(conn); } } private void validateTableStructure(Connection conn, String tableName, List<String> expectedColumns) throws SQLException { ResultSet rs = conn.getMetaData().getColumns(null, null, tableName, null); Set<String> actualColumns = new HashSet<>(); while (rs.next()) { actualColumns.add(rs.getString("COLUMN_NAME").toLowerCase()); } log.info("表 '{}' 包含列: {}", tableName, actualColumns); for (String col : expectedColumns) { if (!actualColumns.contains(col.toLowerCase())) { log.error("❌ 缺失列: {}", col); throw new IllegalStateException("表结构不完整,缺失列: " + col); } } log.info("✅ 表结构验证通过"); } private void initializeSampleData(Connection conn) throws SQLException { // 检查数据是否存在 int count = getRecordCount(conn, "user"); if (count == 0) { log.info("未检测到数据,正在初始化..."); ScriptUtils.executeSqlScript(conn, new ClassPathResource("data.sql")); log.info("✅ 数据初始化完成"); } else { log.info("✅ 已存在 {} 条记录,跳过初始化", count); } } private int getRecordCount(Connection conn, String table) throws SQLException { try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT COUNT(*) FROM " + table)) { return rs.next() ? rs.getInt(1) : 0; } } } ``` ### 3. 创建数据初始化脚本 `src/main/resources/data.sql` ```sql -- 确保表存在 CREATE TABLE IF NOT EXISTS user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, age INT, email VARCHAR(100) ); -- 清空现有数据 TRUNCATE TABLE user; -- 插入测试数据 INSERT INTO user (name, age, email) VALUES ('张三', 25, 'zhangsan@example.com'), ('李四', 30, 'lisi@example.com'), ('王五', 28, 'wangwu@example.com'); ``` ## 问题排查流程 ```mermaid graph TD A[启动应用] --> B[检查依赖版本输出] B --> C{所有版本兼容?} C -->|是| D[检查数据库连接] C -->|否| E[修正pom.xml依赖] D --> F{连接成功?} F -->|是| G[检查表结构] F -->|否| H[检查数据库配置] G --> I{表结构完整?} I -->|是| J[检查数据初始化] I -->|否| K[执行data.sql] J --> L{数据存在?} L -->|是| M[启动完成] L -->|否| N[手动插入数据] M --> O[访问API验证] ``` ## 预期成功日志输出 ``` ===== 环境信息 ===== Spring Framework 版本: 6.1.8 Spring Boot 版本: 3.5.6 MyBatis-Spring 版本: 3.0.3 MyBatis-Plus 版本: 3.5.7 ===== 数据库连接信息 ===== URL: jdbc:mysql://localhost:3307/user 用户名: root@localhost 数据库产品: MySQL 8.0.36 ===== 表结构验证 ===== 表 'user' 包含列: [id, name, age, email] ✅ 表结构验证通过 ===== 数据初始化 ===== ✅ 已存在 3 条记录,跳过初始化 HikariPool-1 - Starting... HikariPool-1 - Start completed. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值