二.MyBatis多表查询的不同方式

本文介绍了MyBatis中一对多和多对一查询的实现方法。通过实体对象、数据库表设计、定义接口和mapper映射文件,展示了如何进行多表查询。同时,文章探讨了查询策略,包括使用resultMap、分开写SQL语句以及自关联查询,并提供了详细的测试案例。

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

                                                                一对多查询

 

1.首先建立实体对象,国家和州长,Country,Minister

国家和州是一对多的关系,一个国家对应多个州长,所以国家的对象中应该有一个属性来描述州长们,用Set集合是防止有重复

 

每一个州长也都得知道自己是属于哪一个国家的,所以州长类有一个描述自己是哪个国家的属性 country

 

 

写实体类时,属性不要用驼峰标志,可能会出错(现在我也不知道会出什么错,先记录着)

州长和国家的toString方法不能互相包括对方,不然会无限递归调用,只能有一方可以打印另一方的信息

 

2.然后建立数据库表

country表:

minister表:

 

在建数据库表时,如果把国家和州长的关系放大国家表中表示,则会产生大量冗余数据,是及其不合理的设计,放到州长表中是正确的,得出结论,一对多关系中,外键建立在多的一方上。

在封装对象的时候,作为一的,应该持有集合引用(包含多的的集合),作为多的,应该持有一的对象引用 

3.定义接口

定义接口的目的是让myBatis用动态代理帮我们创建实现类,不用再手动创建。</

<think>好的,我现在需要帮助用户解决MyBatis对一查询的实现方法或示例的问题。首先,我需要回想一下MyBatis中的关联映射机制。对一关系在数据库中通常通过外键关联,比如一个员工对应一个部门,个员工属于同一个部门。这种情况下,在MyBatis中处理时,可以使用`<association>`标签来映射这种关系。 用户可能已经了解了一对查询,现在需要对一的示例。我应该先确定用户的需求场景,比如是否有具体的结构,或者是否需要XML配置和注解两种方式。根据用户提供的引用内容,他们之前提到过一对的情况,现在转向对一,可能需要对比说明。 接下来,我需要考虑如何组织回答。通常,MyBatis实现对一有两种方式:XML配置中使用嵌套结果映射或嵌套查询,以及使用注解方式。我应该分别给出这两种方式的示例,并解释它们的优缺点。同时,要确保示例代码正确,比如在XML中定义resultMap,使用association标签的property、javaType等属性。 还需要注意数据库的设计示例,比如用户提到的Person和Phone,但用户之前的一对示例可能不太符合实际,所以现在对一可能需要调整结构。例如,员工和部门,其中员工有部门ID作为外键。 此外,用户可能需要知道如何在实际项目中应用这些配置,比如延迟加载的问题,或者如何处理查询性能。因此,在示例后,添加一些注意事项和最佳实践会更好。 最后,生成相关的问题,帮助用户进一步学习,比如性能优化、延迟加载、注解与XML的选择等。确保引用正确,根据用户提供的引用,虽然原来的引用是关于一对的,但需要调整说明,确保不混淆。 总结步骤: 1. 介绍对一的应用场景,举例说明结构。 2. 分点讲解XML配置的两种方式:嵌套结果和嵌套查询。 3. 提供注解方式的实现示例。 4. 比较不同方法的优缺点,给出建议。 5. 添加注意事项,如字段冲突、延迟加载。 6. 生成相关问题,引导深入学习。</think>以下是为您整理的MyBatis对一查询实现详解: ### MyBatis对一查询实现 #### 1. 典型场景示例 假设存在员工(employee)和部门(department),其中employee通过department_id字段关联department的主键id: ```sql CREATE TABLE department ( id INT PRIMARY KEY, name VARCHAR(50) ); CREATE TABLE employee ( id INT PRIMARY KEY, name VARCHAR(50), department_id INT, FOREIGN KEY (department_id) REFERENCES department(id) ); ``` #### 2. XML映射实现方式 ##### 方式一:嵌套结果映射 ```xml <resultMap id="employeeResultMap" type="Employee"> <id property="id" column="eid"/> <result property="name" column="ename"/> <association property="department" javaType="Department"> <id property="id" column="did"/> <result property="name" column="dname"/> </association> </resultMap> <select id="getEmployeeWithDepartment" resultMap="employeeResultMap"> SELECT e.id as eid, e.name as ename, d.id as did, d.name as dname FROM employee e LEFT JOIN department d ON e.department_id = d.id WHERE e.id = #{id} </select> ``` ##### 方式:嵌套查询映射 ```xml <resultMap id="employeeResultMap" type="Employee"> <association property="department" column="department_id" javaType="Department" select="selectDepartmentById"/> </resultMap> <select id="selectDepartmentById" resultType="Department"> SELECT * FROM department WHERE id = #{id} </select> ``` #### 3. 注解实现方式 ```java public interface EmployeeMapper { @Select("SELECT * FROM employee WHERE id = #{id}") @Results({ @Result(property = "id", column = "id"), @Result(property = "name", column = "name"), @Result(property = "department", column = "department_id", one = @One(select = "selectDepartmentById")) }) Employee getEmployeeWithDepartment(Integer id); @Select("SELECT * FROM department WHERE id = #{id}") Department selectDepartmentById(Integer id); } ``` #### 4. 实现方式对比 | 方式 | 优点 | 缺点 | |--------------|--------------------------|--------------------------| | 嵌套结果映射 | 单次查询效率高 | SQL复杂度高 | | 嵌套查询 | 配置简单,SQL清晰 | 可能产生N+1查询问题 | | 注解方式 | 代码简洁,无需XML配置 | 复杂映射可读性较差 | #### 5. 注意事项 1. 字段别名处理:使用`AS`避免字段冲突 2. 延迟加载配置:在mybatis-config.xml中设置: ```xml <settings> <setting name="lazyLoadingEnabled" value="true"/> </settings> ``` 3. 关联查询性能:嵌套查询方式需注意N+1查询问题,建议批量查询场景使用嵌套结果映射
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值