SpringBoot中多数据源 配置mybatis 驼峰命名不管用,带下划线字段返回null值

本文解决SpringBoot项目中多数据源配置驼峰命名规则失效的问题,详细介绍了如何针对每个数据源单独配置驼峰命名转换,确保从数据库查询的数据能正确映射到Java对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在springboot中 开启是自动转换,但是,这个配置根本没有生效,

当查出来的数据时,只要字段名中有 下划线的字段, 就会出现 null

在者我的工程是多数据源工程,这是导致这个配置没有生效的原因,因为他不知道为哪个数据源开启驼峰命名

所以我们需要在配置多数据源的文件中,单独加入配置,(其他配置也是如此,只要涉及到多数据源的,都需要给每一个数据源去配置)

 

在多数据源的配置文件中加入 如下代码

 @Bean
    @ConfigurationProperties(prefix = "mybatis.configuration")
    public org.apache.ibatis.session.Configuration configuration(){
        return new org.apache.ibatis.session.Configuration();
    }

 然后在修改注入sqlSessionFactory的时候吧配置注入进去,修改如下图

 多个数据源配置多次

 

 

<think>我们已经在之前的回答中介绍了MyBatis的基本概念和独立使用方法。现在用户的需求是:在SpringBoot项目中灵活配置和使用MyBatis进行高效数据库操作。结合用户提供的站内引用(特别是引用[1]和[2]),我们将重点讲解SpringBootMyBatis的整合方法,包括配置、Mapper定义、动态SQL使用以及性能优化等。###解决方案:SpringBoot整合MyBatis的灵活配置与高效操作SpringBoot通过自动配置简化了MyBatis的集成,开发者只需少量配置即可快速开始数据库操作。以下是具体步骤和技巧:---####1.**项目配置****步骤1:添加依赖**在`pom.xml`中引入SpringBootStarter、MyBatisStarter和数据库驱动(以MySQL为例):```xml<dependencies><!--SpringBootWebStarter(可选,如需Web支持)--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--MyBatisSpringBootStarter--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version><!--使用最新版本--></dependency><!--MySQL驱动--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!--其他依赖如Lombok(简化代码)--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies>```**步骤2:配置数据源和MyBatis**在`application.yml`(或`application.properties`)中配置数据库连接和MyBatis设置:```yamlspring:datasource:url:jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTCusername:rootpassword:passworddriver-class-name:com.mysql.cj.jdbc.Driver#MyBatis配置mybatis:mapper-locations:classpath:mapper/*.xml#指定XML映射文件位置type-aliases-package:com.example.model#实体类包路径,简化映射配置configuration:map-underscore-to-camel-case:true#自动将数据库下划线字段转为Java驼峰属性```**关键配置说明**:-`mapper-locations`:指定XML映射文件路径,支持通配符(如`classpath*:/mapper/**/*.xml`)。-`type-aliases-package`:设置实体类包名,在XML中可直接用类名(无需全限定名)。-`map-underscore-to-camel-case`:自动字段映射(如`user_name`→`userName`)[^1]。---####2.**定义Mapper与SQL****方式1:XML映射(推荐复杂SQL)**创建Mapper接口(`UserMapper.java`)和对应的XML文件(`UserMapper.xml`):```java//UserMapper.java@Mapper//标识为MyBatisMapper,SpringBoot自动扫描publicinterfaceUserMapper{List<User>selectAll();UserselectById(@Param("id")Longid);voidinsert(Useruser);//动态SQL查询示例List<User>searchUsers(@Param("name")Stringname,@Param("email")Stringemail);}``````xml<!--resources/mapper/UserMapper.xml--><mappernamespace="com.example.mapper.UserMapper"><selectid="selectAll"resultType="User"><!--使用type-aliases-package简化-->SELECT*FROMuser</select><!--动态SQL:根据条件过滤用户--><selectid="searchUsers"resultType="User">SELECT*FROMuser<where><iftest="name!=nullandname!=''">ANDnameLIKECONCAT('%',#{name},'%')</if><iftest="email!=nullandemail!=''">ANDemail=#{email}</if></where></select></mapper>```**方式2:注解映射(适合简单SQL)**在Mapper接口中直接使用注解:```java@MapperpublicinterfaceUserMapper{@Select("SELECT*FROMuserWHEREid=#{id}")UserselectById(Longid);@Insert("INSERTINTOuser(name,email)VALUES(#{name},#{email})")@Options(useGeneratedKeys=true,keyProperty="id")//获取自增主键voidinsert(Useruser);}```**选择建议**:-简单SQL(单表CRUD)→注解方式,简洁直观。-复杂SQL(多表关联、动态查询)→XML方式,便于维护[^3]。---####3.**动态SQL的灵活运用**MyBatis提供强大的动态SQL标签,避免在Java中拼接SQL字符串。常用标签包括:-`<if>`:条件判断-`<where>`:智能处理WHERE子句(自动去除开头AND)-`<foreach>`:循环遍历集合(用于IN查询)-`<choose>/<when>/<otherwise>`:多条件分支**示例:批量插入用户**```xml<insertid="batchInsert">INSERTINTOuser(name,email)VALUES<foreachcollection="users"item="user"separator=",">(#{user.name},#{user.email})</foreach></insert>```**Java调用**:```javauserMapper.batchInsert(users);//users为List<User>```---####4.**事务管理**SpringBoot默认启用事务管理。在Service层使用`@Transactional`注解即可:```java@ServicepublicclassUserService{privatefinalUserMapperuserMapper;@Transactional//声明式事务publicvoidcreateUser(Useruser){userMapper.insert(user);//其他数据库操作(自动同一事务)}}```---####5.**性能优化技巧**-**启用二级缓存**:在Mapper接口或XML中添加`@CacheNamespace`注解或`<cache>`标签:```xml<!--UserMapper.xml--><cacheeviction="LRU"flushInterval="60000"size="512"/>```-**分页插件**:集成PageHelper实现物理分页(避免内存分页):```yaml#application.ymlpagehelper:helper-dialect:mysqlreasonable:true```使用示例:```javaPageHelper.startPage(1,10);//第1页,每页10条List<User>users=userMapper.selectAll();PageInfo<User>pageInfo=newPageInfo<>(users);```---####6.**高级功能:自定义TypeHandler**处理特殊数据类型(如JSON字段、枚举转换):```java//示例:将User对象的tags字段(List<String>)存为JSON字符串@MappedTypes(List.class)@MappedJdbcTypes(JdbcType.VARCHAR)publicclassJsonListTypeHandlerextendsBaseTypeHandler<List<String>>{privatefinalObjectMapperobjectMapper=newObjectMapper();@OverridepublicvoidsetNonNullParameter(PreparedStatementps,inti,List<String>parameter,JdbcTypejdbcType){ps.setString(i,objectMapper.writeValueAsString(parameter));}//其他方法省略...}```在配置中注册:```yamlmybatis:type-handlers-package:com.example.handler#指定TypeHandler包路径```---###总结通过SpringBoot整合MyBatis,开发者可以:1.**快速配置**:依赖+YAML配置,5分钟启动数据库访问。2.**灵活选择SQL方式**:XML管理复杂SQL,注解处理简单操作。3.**动态SQL支持**:适应多变查询需求。4.**性能优化**:二级缓存、分页插件提升效率[^1][^2]。>**注意事项**:>-避免SQL注入:坚持使用`#{}`占位符。>-事务边界:在Service层使用`@Transactional`管理事务。>-测试:结合SpringBootTest验证Mapper逻辑。§§相关问题§§1.SpringBoot中如何整合MyBatis-Plus实现更简洁的CRUD操作?2.MyBatis动态SQL标签的完整用法有哪些?3.如何优化MyBatisSpringBoot中的查询性能?</think>### Spring Boot项目中灵活配置和使用MyBatis的实践指南 在Spring Boot项目中集成MyBatis,既能享受Spring Boot的自动配置便利,又能发挥MyBatis的SQL灵活性。以下是具体实现方法: #### 一、基础配置(XML方式) 1. **添加依赖** ```xml <!-- pom.xml --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies> ``` 2. **配置文件** ```yaml # application.yml spring: datasource: url: jdbc:mysql://localhost:3306/test_db username: root password: password driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*.xml # XML映射文件位置 type-aliases-package: com.example.model # 实体类包路径 configuration: map-underscore-to-camel-case: true # 自动字段映射转换 ``` #### 二、注解方式配置(更简洁) ```java // 主应用类 @SpringBootApplication @MapperScan("com.example.mapper") // 自动扫描Mapper接口 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } // Mapper接口示例 public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{id}") User selectById(@Param("id") Long id); @Insert("INSERT INTO user(name, email) VALUES(#{name}, #{email})") @Options(useGeneratedKeys = true, keyProperty = "id") int insert(User user); } ``` #### 三、灵活使用方式组合 1. **XML与注解混合使用** ```java // 复杂查询用XML,简单操作用注解 public interface UserMapper { @Select("SELECT * FROM user WHERE email = #{email}") User findByEmail(String email); // 引用XML中的SQL定义 List<User> searchUsers(@Param("name") String name, @Param("role") String role); } ``` ```xml <!-- UserMapper.xml --> <select id="searchUsers" resultType="User"> SELECT * FROM user <where> <if test="name != null"> AND name LIKE CONCAT('%', #{name}, '%') </if> <if test="role != null"> AND role = #{role} </if> </where> </select> ``` 2. **动态SQL实践** ```xml <!-- 灵活条件查询 --> <select id="findByConditions" resultType="User"> SELECT * FROM user <trim prefix="WHERE" prefixOverrides="AND|OR"> <choose> <when test="ids != null"> id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </when> <when test="name != null"> name = #{name} </when> <otherwise> status = 'ACTIVE' </otherwise> </choose> </trim> </select> ``` #### 四、高级配置技巧 1. **多数据源配置** ```java @Configuration public class DataSourceConfig { @Bean(name = "primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } @Bean @Primary public SqlSessionFactory primarySqlSessionFactory( @Qualifier("primaryDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); return bean.getObject(); } } ``` 2. **自定义TypeHandler** ```java // 处理JSON类型字段 @MappedTypes(UserProfile.class) @MappedJdbcTypes(JdbcType.VARCHAR) public class JsonTypeHandler extends BaseTypeHandler<UserProfile> { private final ObjectMapper objectMapper = new ObjectMapper(); @Override public void setNonNullParameter(PreparedStatement ps, int i, UserProfile parameter, JdbcType jdbcType) { ps.setString(i, objectMapper.writeValueAsString(parameter)); } // 其他方法实现... } // 配置使用 @Bean public ConfigurationCustomizer typeHandlerConfig() { return configuration -> { configuration.getTypeHandlerRegistry() .register(JsonTypeHandler.class); }; } ``` #### 五、性能优化策略 1. **二级缓存配置** ```yaml mybatis: configuration: cache-enabled: true ``` ```xml <!-- Mapper.xml中启用 --> <mapper namespace="com.example.mapper.UserMapper"> <cache eviction="LRU" flushInterval="60000" size="512"/> </mapper> ``` 2. **分页插件集成** ```java @Configuration public class MyBatisConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } } // 使用示例 Page<User> page = new Page<>(1, 10); userMapper.selectPage(page, null); ``` #### 六、最佳实践建议 1. **SQL管理策略** - 简单CRUD:使用注解 - 复杂查询:使用XML - 动态SQL:优先使用`<if>`, `<choose>`等标签 2. **安全规范** - 始终使用`#{}`防止SQL注入 - 避免在注解中使用`${}`拼接SQL - 敏感操作添加`@Transactional`注解 3. **调试技巧** ```properties # 开启MyBatis日志 logging.level.com.example.mapper=DEBUG ``` > **关键优势**:通过Spring Boot的自动配置(如`@MapperScan`)简化集成,同时保留MyBatis的SQL灵活性,特别适合需要精细控制SQL的场景[^1][^2]。混合使用XML和注解可平衡开发效率和灵活性[^3]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值