[3-01-05].第05节:MyBatisPlus进阶 - 映射配置

MyBatisPlus学习大纲


一、自动映射规则:

1.1.概述:

  • 1.Mybatis框架之所以能够简化数据库操作,是因为他内部的映射机制,通过自动映射,进行数据的封装,我们只要符合映射规则,就可以快速高效的完成SQL操作的实现
  • 2.MybatisPlus是基于Mybatis的增强工具,所以也具有这样的映射规则。我们先来了解一下自动映射规则

1.2.自动映射规则:

  • 1.表名和实体类名映射: 表名user -> 实体类名User
  • 2.字段名和实体类属性名映射:字段名name -> 实体类属性名name
  • 3.字段名下划线命名方式和实体类属性小驼峰命名方式映射:-> 字段名 user_email 实体类属性名 userEmail

二、映射配置:

2.1.下划线转驼峰映射:

a.映射规则:

  • MybatisPlus支持下划线转驼峰的这种映射规则,配置实现方式:
    • map-underscore-to-camel-case: true 表示支持下划线到驼峰的映射
    • map-underscore-to-camel-case: false 表示不支持下划线到驼峰的映射

b.配置实现:

  • 配置文件修改:
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true

2.2.表名映射的两种情况:

方式1:注解实现

  • 1.通过@TableName()注解可实现代码中的实体类名与表名的映射
  • 2.如数据库的表为powershop_user,要完成表名和实体类名的映射,需要将实体类名中使用注解@TableName("powershop_user")实现
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("powershop_user")
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

方式2:配置文件实现:

  • 1.通过配置文件,可以实现实体类名与表名的映射
  • 2.如果有很多实体类,对应到数据库中的很多表,我们不需要每个依次配置,只需要配置一个全局的设置,他都会给每个实体类名前面添加指定的前缀,这里我们演示一下全局配置的效果
mybatis-plus:
  global-config:
    db-config:
      table-prefix: powershop_
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

2.3.字段与实体类的属性不一致时的映射

a.说明:

  • 1.当数据库字段和表中实体类的属性不一致时,我们可以使用@TableField()注解改变字段和属性的映射,让注解中的名称和表字段保持一致
  • 2.数据库字段的名称我们为username,实体类中的字段名是name,那么可以使用@TableField()中指定的名称username进行拼接,完成查询

b.映射案例:

  • 此时的SQL语句是这样的:SELECT id,username AS name,email FROM powershop_user
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableField("username")
    private String name;
   }

2.4.字段是关键字时的映射:

a.说明:

  • 1.数据库字段和表实体类的属性一致,框架在拼接SQL语句的时候,会使用属性名称直接拼接sql语句,但是当实体类中的某个字段名是SQL中的关键字时,就会出现问题, 例如:SELECT id,username AS name,age,email,desc FROM powershop_user,这条语句直接进行查询的时候,会出现错误

Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘desc FROM powershop_user’ at line 1

  • 2.原因是 desc属于关键字,不能直接用于sql查询,要解决这个问题,就需要将desc字段加上``符号,将他变为不是关键字,才能完成查询

b.解决方案:

  • 3.这个问题的根本也是改变生成的SQL语句的字段名称,也就是我们需要通过 @TableField() 改变实体类的属性名称,将desc变为desc,就可以解决这个问题,此时可以观察到,框架拼接生成的SQL语句的字段名称变为了desc,这样是可以正常完成查询的

c.映射案例:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableField("`desc`")
    private String desc;
}

在这里插入图片描述


2.5.字段失效

a.说明:

  • 1.当数据库中有字段不希望被查询,我们可以通过 @TableField(select = false) 来隐藏这个字段,那在拼接SQL语句的时候,就不会拼接这个字段
  • 2.如:如果不想显示年龄信息,那么可以在age属性上添加这个注解,来隐藏这个字段

b.映射案例:

  • 1.编码实现:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableField(select = false)
    private Integer age;
}
  • 2.生成的SQL语句如下,通过查询生成的SQL语句,发现并没有拼接age字段
    在这里插入图片描述

2.6.视图属性:

a.说明:

  • 1.在实际开发中,有些字段不需要数据库存储,但是却需要展示,需要展示也就是意味着实体类中需要存在这个字段,我们称这些实体类中存在但是数据库中不存在的字段,叫做视图字段
  • 2.根据之前的经验,框架会默认将实体类中的属性作为查询字段进行拼接,那我们来思考,像这种视图字段,不能够作为查询条件么,因为数据库中没有这个字段,所以查询字段如果包含这个字段,SQL语句会出现问题。我们通过 @TableField(exist = false) 来去掉这个字段,不让他作为查询字段

b.映射案例:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableField(exist = false)
    private Integer online;
}

可以看到查询结果中不包含该字段
在这里插入图片描述

这一部分,我们讲解了MybatisPlus的映射规则,以及如果通过注解配置来改变这种映射规则


【源码免费下载链接】:https://renmaiwang.cn/s/6hcxp 在C语言中,链表是一种常见的数据结构,用于存储动态数据集合。在这个“基于C的简单链表合并2排序程序”中,我们需要处理两个已经排序的链表,a和b,每个链表的点包含学号(假设为整型)和成绩(也假设为整型)。目标是将这两个链表合并成一个新的链表,并按照学号的升序排列。我们来了解一下链表的基本概念。链表不同于数组,它不连续存储数据,而是通过指针将各个点连接起来。每个点通常包含两部分:数据域(存储学号和成绩)和指针域(指向下一个点)。要实现这个合并和排序的过程,我们可以遵循以下步骤:1. **定义链表点结构体**: 创建一个结构体类型,如`Node`,包含学号(score_id)和成绩(grade)字段,以及一个指向下一个点的指针(next)。```ctypedef struct Node { int score_id; int grade; struct Node* next;} Node;```2. **初始化链表**: 在程序开始时,创建a和b链表的头点,并确保它们的初始状态为空。3. **读取链表数据**: 从输入文件(假设为11.8中的文件)中读取数据,根据学号和成绩创建新的点,并将其添加到相应的链表a或b中。这一步可能需要使用`fscanf`函数从文件中读取数据,并使用`malloc`分配内存创建新点。4. **合并链表**: 合并两个链表的关键在于找到合适的位置插入b链表的点。从头点开始遍历a链表,比较当前点的学号与b链表头点的学号。如果b链表的学号更小,就将b链表的头点插入到a链表的当前点后面,然后继续比较b链表的新头点(原头点的下一个点)与a链表的当前点。当b链表为空或所有点都已插入a链表时,合并完成。5. **排序链表**: 由于我们合并的时候
【源码免费下载链接】:https://renmaiwang.cn/s/0gh4u :“bp神经网络实现的iris数据分类”在机器学习领域,BP(Backpropagation)神经网络是一种广泛应用的监督学习算法,它主要用于解决非线性分类和回归问题。本项目实现了利用BP神经网络对鸢尾花(Iris)数据集进行分类。鸢尾花数据集是UCI机器学习库中的经典数据集,包含了三种不同鸢尾花品种的多个特征,如花瓣长度、花瓣宽度、萼片长度和萼片宽度,总计150个样本。:“bp神经网络实现的iris数据分类,UCI上下载的iris数据,适当调整误差精度,分类正确率可达到99%”我们需要理解UCI机器学习库中的Iris数据集。这个数据集由生物学家Ronald Fisher在1936年收集,是用于多类分类的典型实例。它包含3种鸢尾花(Setosa, Versicolour, Virginica)的4个特征,每种花有50个样本。在使用BP神经网络进行分类时,我们通常会先对数据进行预处理,包括数据清洗、标准化或归一化,以确保输入层的数值在同一尺度上。BP神经网络的核心在于反向传播算法,它通过计算预测值与真实值之间的误差,并将误差从输出层向输入层逐层反向传播,调整权重以减小误差。在训练过程中,我们通常设置学习率、迭代次数以及停止训练的阈值,以达到最佳性能。在这个项目中,通过对误差精度的适当调整,使得网络能够在训练完成后对鸢尾花的分类准确率高达99%,这表明网络具有很好的泛化能力。【详细知识点】:1. **BP神经网络**:由输入层、隐藏层和输出层组成,通过梯度下降法和链式法则更新权重,以最小化损失函数。2. **鸢尾花数据集(Iris dataset)**:包含了150个样本,每个样本有4个特征和1个类别标签,常用于分类任务的基准测试。3. **特征工程**:预处理数据,可能包括缺失值处理、异常值检测
<think>我们正在解决SpringBoot3.5.3MyBatisPlus3.5.7集成时出现的启动错误:错误信息:`Invalidbeandefinitionwithname&#39;userMapper&#39;...Invalidvaluetypeforattribute&#39;factoryBeanObjectType&#39;:java.lang.String`分析:根据错误堆栈,问题发生在Spring容器创建bean时,具体是在处理`userMapper`这个bean的定义时,属性`factoryBeanObjectType`的值类型不合法(期望的类型不是String)。可能原因及解决方案:1.**Mapper接口未正确扫描**:MyBatisPlus需要将Mapper接口注册为SpringBean。通常使用`@MapperScan`注解指定扫描包。检查启动类(或配置类)上是否有`@MapperScan`注解,并确保包路径正确:```java@SpringBootApplication@MapperScan("com.example.mapper")//替换为你的Mapper接口所在的包publicclassApplication{//...}```如果没有配置,添加该注解。如果已有,检查包名是否准确(注意大小写)。2.**MyBatisPlus版本兼容性问题**:SpringBoot3.5.3MyBatisPlus3.5.7可能存在兼容性问题。查看MyBatisPlus官方文档确认兼容的版本。尝试使用与SpringBoot3.5.3兼容的MyBatisPlus版本。例如,可以尝试使用MyBatisPlus3.5.6(SpringBoot3.5.3通常对应MyBatisPlus3.5.6+)。在pom.xml中修改版本:```xml<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.6</version><!--尝试此版本--></dependency>```3.**依赖冲突**:检查是否存在其他版本的MyBatis或MyBatisPlus依赖。使用Maven依赖树分析:```mvndependency:tree-Dincludes=com.baomidou:mybatis-plus*,org.mybatis:mybatis*```如果存在冲突,排除掉不需要的版本。4.**Mapper接口定义问题**:确保`UserMapper`接口是一个接口(interface),而不是类(class)。并且它应该继承MyBatisPlus的`BaseMapper`:```javapublicinterfaceUserMapperextendsBaseMapper<User>{//自定义方法}```5.**检查MyBatisPlus配置**:在`application.yml`或`application.properties`中检查是否有错误的配置。特别是关于mapper-locations(如果使用了XML文件)和type-aliases-package。6.**尝试清理和重新构建**:有时候target目录下的旧编译文件可能导致问题。尝试清理项目并重新构建:```mvncleaninstall```或者使用IDE的清理和重建功能。7.**其他可能原因**:如果使用了多数据源,可能需要额外的配置来指定每个Mapper对应的数据源。但如果没有配置多数据源,则不需要考虑。8.**启用调试日志**:按照错误提示,重新运行应用并启用debug模式:```java-jaryour-application.jar--debug```或者在`application.yml`中设置:```yamldebug:true```查看详细的conditionevaluationreport。如果以上方法都不能解决问题,请提供更多上下文信息,例如:-完整的pom.xml依赖-启动类代码-UserMapper接口代码-配置文件内容根据经验,最常见的原因是`@MapperScan`注解缺失或包路径错误,以及版本不兼容。相关问题:1.如何解决MyBatisPlus在多数据源环境下的启动问题?2.SpringBoot3.5.x与MyBatisPlus的版本兼容性如何查询?3.如何排除Maven项目中的依赖冲突?4.MyBatisPlus的Mapper接口必须继承BaseMapper吗?5.如何在SpringBoot中配置MyBatisPlus的XML映射文件路径?希望这些步骤能帮助您解决问题。</think>### 解决 Spring Boot 3.5.3 + MyBatis Plus 3.5.7 启动报错:`Invalid bean definition userMapper` 根据错误信息 `Invalid value type for attribute &#39;factoryBeanObjectType&#39;: java.lang.String`,这是 MyBatis Plus 与 Spring Boot 3.5.3 集成时的常见兼容性问题。以下是系统化解决方案: #### 1. **版本兼容性问题(核心原因)** Spring Boot 3.5.3 与 MyBatis Plus 3.5.7 存在兼容性问题: ```xml <!-- 修改 pom.xml 依赖 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <!-- 使用兼容版本 --> <version>3.5.6</version> <!-- 官方确认兼容 Spring Boot 3.5.x[^1] --> </dependency> ``` **验证方法**: ```shell mvn dependency:tree | grep &#39;mybatis-plus&#39; # 确保无冲突依赖 ``` #### 2. **Mapper 扫描配置修复** ```java @SpringBootApplication // 关键修复:使用 MybatisPlus 专用扫描注解 @MapperScan(value = "com.ch.mybatisplustest.mapper", annotationClass = Mapper.class) // 明确指定注解类型[^2] public class MybatisplustestApplication { public static void main(String[] args) { SpringApplication.run(MybatisplustestApplication.class, args); } } ``` #### 3. **检查 Mapper 接口定义** ```java // UserMapper.java 正确定义 @Mapper // 必须有此注解 public interface UserMapper extends BaseMapper<User> { // 避免在接口中使用默认方法 // 错误示例:default String test() { return "error"; } } ``` **常见陷阱**: - 接口中包含 `default` 方法会导致类型推断错误 - 未继承 `BaseMapper` 会使 MyBatis Plus 无法识别 #### 4. **排除冲突的自动配置** ```java // 在启动类添加排除项 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, // 多数据源场景需要 MybatisPlusLanguageDriverAutoConfiguration.class // 3.5.7 的冲突配置 }) ``` #### 5. **启用调试日志定位问题** 在 `application.yml` 添加: ```yaml debug: true # 启用条件评估报告 logging: level: org.springframework.beans: DEBUG com.baomidou.mybatisplus: TRACE ``` 启动后检查日志中: 1. `BeanDefinition` 关于 `userMapper` 的详细定义 2. `factoryBeanObjectType` 的赋值堆栈 #### 6. **清理构建缓存** 在终端执行: ```shell mvn clean compile -U # 清理并更新依赖 rm -rf target/ # 删除构建目录 ``` > **技术说明**:该错误源于 Spring 6.x 对泛型解析更严格,MyBatis Plus 3.5.7 的 `MapperFactoryBean` 在类型推断时产生 `String` 而非 `Class<?>` 类型[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值