当前位置: 首页 > news >正文

Java中mybatis 无参构造器?你会吗

全文目录:

    • 开篇语
    • 前言
      • **1. MyBatis 无参构造器的作用**
      • **2. 为什么需要无参构造器?**
      • **3. 示例:使用无参构造器**
        • **3.1 Java 类:User**
        • **3.2 MyBatis Mapper 接口:UserMapper**
        • **3.3 MyBatis 配置文件:mybatis-config.xml**
        • **3.4 MyBatis SQL 映射文件:UserMapper.xml**
        • **3.5 使用 MyBatis 获取数据**
        • **3.6 结果**
    • **4. 无参构造器的自动生成**
    • **5. 反射与 MyBatis 反射机制**
      • **5.1 无参构造器与 MyBatis 的映射机制**
    • **6. 总结**
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

在 Java 中,MyBatis 是一个常用的持久层框架,它简化了数据库操作。为了能正确地映射数据库的记录到 Java 对象,MyBatis 会根据数据库字段和 Java 类的字段进行映射。MyBatis 在执行查询操作时,通常需要对象的 无参构造器 来实例化结果映射的 Java 对象。

1. MyBatis 无参构造器的作用

在 MyBatis 中,当进行数据映射时,框架需要通过反射创建 Java 对象。为了能成功地反射创建对象,Java 类必须有一个 无参构造器,否则 MyBatis 无法实例化该类。

2. 为什么需要无参构造器?

  1. MyBatis 使用反射实例化对象:MyBatis 会使用反射调用 Java 类的构造方法来创建对象,构造器用于初始化对象。
  2. 映射机制:MyBatis 会通过反射将查询结果(如数据库表中的每一行数据)映射到 Java 对象中。对于每一行数据,MyBatis 会根据列名和 Java 对象的字段名进行映射,如果没有无参构造器,MyBatis 可能无法正确地反射实例化对象。
  3. XML 或注解映射:在 MyBatis 中,无论是通过 XML 配置还是注解配置映射 SQL,框架都会使用无参构造器实例化返回的实体类对象。

3. 示例:使用无参构造器

假设我们有一个简单的 User 类,并且使用 MyBatis 来查询数据库中的 User 数据。为了让 MyBatis 正常工作,我们必须提供一个无参构造器。

3.1 Java 类:User
public class User {private int id;private String name;private int age;// 无参构造器public User() {}// 带参构造器public User(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}// Getter 和 Setter 方法public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{id=" + id + ", name='" + name + "', age=" + age + "}";}
}
3.2 MyBatis Mapper 接口:UserMapper
import org.apache.ibatis.annotations.Select;public interface UserMapper {// 使用注解进行 SQL 查询@Select("SELECT id, name, age FROM users WHERE id = #{id}")User selectUserById(int id);
}
3.3 MyBatis 配置文件:mybatis-config.xml
<configuration><mappers><mapper class="com.example.mapper.UserMapper"/></mappers>
</configuration>
3.4 MyBatis SQL 映射文件:UserMapper.xml

如果你使用 XML 配置,可以使用以下的方式来配置 SQL 映射:

<mapper namespace="com.example.mapper.UserMapper"><select id="selectUserById" resultType="com.example.model.User">SELECT id, name, age FROM users WHERE id = #{id}</select>
</mapper>
3.5 使用 MyBatis 获取数据
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.InputStream;public class MyBatisTest {public static void main(String[] args) {// 加载 MyBatis 配置文件String resource = "mybatis-config.xml";InputStream inputStream = MyBatisTest.class.getClassLoader().getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);try (SqlSession session = sqlSessionFactory.openSession()) {// 获取 UserMapper 实例UserMapper userMapper = session.getMapper(UserMapper.class);// 使用无参构造器实例化 User 对象User user = userMapper.selectUserById(1);System.out.println(user);}}
}
3.6 结果

假设数据库中的 users 表包含以下数据:

idnameage
1John30

执行查询后,selectUserById(1) 返回的结果会被 MyBatis 映射到 User 对象,并输出如下:

User{id=1, name='John', age=30}

4. 无参构造器的自动生成

在 Java 中,如果你没有显式定义无参构造器,Java 编译器会自动为你生成一个无参构造器,前提是你没有定义任何构造器。

例如,以下 User 类没有定义任何构造器:

public class User {private int id;private String name;private int age;// Java 会自动提供一个无参构造器
}

在这种情况下,Java 会自动生成一个无参构造器,等同于:

public User() {
}

但如果你显式地定义了一个带参数的构造器,Java 编译器就不会自动生成无参构造器了。为了确保 MyBatis 能正常使用反射调用无参构造器,你需要手动提供无参构造器。


5. 反射与 MyBatis 反射机制

MyBatis 在执行映射时使用了 Java 的反射机制来实例化对象并填充数据。反射机制是通过调用无参构造器来创建对象实例的,因此无参构造器是必需的。MyBatis 会通过反射调用无参构造器,然后使用反射将查询结果填充到对象的字段中。

5.1 无参构造器与 MyBatis 的映射机制

当 MyBatis 查询数据库时,它会根据 SQL 查询结果的列名,查找与之匹配的 Java 对象的字段名,并将结果映射到该字段。然后,MyBatis 会通过无参构造器创建一个新的对象,并使用 set 方法填充数据。

如果没有无参构造器,MyBatis 无法使用反射创建对象,因此会抛出异常。


6. 总结

在 MyBatis 中,无参构造器对于映射数据库查询结果到 Java 对象至关重要。它使得 MyBatis 能够通过反射机制动态地创建对象并将查询结果填充到对象的字段中。如果你使用了自定义构造器,确保至少有一个无参构造器,以便 MyBatis 正确地反射创建对象。

  • 无参构造器:当 MyBatis 进行映射时,通过反射调用无参构造器创建对象。
  • Java 自动生成无参构造器:如果没有显式定义构造器,Java 会自动为类生成一个无参构造器,但如果定义了其他构造器,则需要显式定义无参构造器。

确保在使用 MyBatis 时,至少为每个映射类提供一个无参构造器。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

http://www.dtcms.com/a/299857.html

相关文章:

  • Spring AI 项目实战(二十):基于Spring Boot + AI + DeepSeek的智能环境监测与分析平台(附完整源码)
  • 修改site-packages位置与pip配置
  • Kubernetes 与 Docker的爱恨情仇
  • 面试实战,问题十三,Redis在Java项目中的作用及使用场景详解,怎么回答
  • 面试问题总结——关于OpenCV(二)
  • 【电赛学习笔记】MaxiCAM 的OCR图片文字识别
  • 力扣404.左叶子之和
  • jxORM--查询数据
  • ART配对软件使用
  • Macast配置
  • ThreadLocal--ThreadLocal介绍
  • 7.26 cpu
  • 单片机ADC机理层面详细分析(一)
  • SSE (Server-Sent Events) 服务出现连接卡在 pending 状态的原因
  • 嵌入式软硬件开发入门工具推荐
  • `read`系统调用示例
  • java每日精进 7.26【流程设计5.0(中间事件+结束事件)】
  • 检索召回率优化探究一:基于 LangChain 0.3集成 Milvus 2.5向量数据库构建的智能问答系统
  • 全球化2.0 | 云轴科技ZStack亮相阿里云印尼国有企业CXO专家活动
  • FreeMarker模板引擎
  • Windows Server系统安装JDK,一直卡在“应用程序正在为首次使用作准备,请稍候”
  • Vibe Coding | 技术让我们回归了创造的本质
  • hot100-每日温度
  • 字符串缓冲区和正则表达式
  • I/O 软件层次结构
  • 分布式数据库的分布透明性详解
  • 【前端】Vue 3 课程选择组件开发实战:从设计到实现
  • 如何从自定义或本地仓库安装 VsCode 扩展
  • 手写PPO_clip(FrozenLake环境)
  • 统计学08:概率分布