Mybatis的resultMap和分步查询

当数据可以表项名与javaBean的属性不对应的时候,要是符合驼峰命名法可以在全局配置文件开启驼峰命名法的对应关系例如(数据库:last_name,JavaBean : lastName),此外可以查询是进行重命名。

但是resultMap可以自己设置封装规则。如下
在这里插入图片描述
在这里插入图片描述
他的另一个作用就是进行级联查询
进行级联查询:通过id查员工以及所在部门,(部门是外键)
employee 表
在这里插入图片描述
部门表
在这里插入图片描述
想要执行的查询的语句。

select e.id as id,e.last_name as  last_name,e.email as email,e.gender as gender ,
            e.d_id as d_id,d.dept_name as dept_name from dept as d,employee as e where d.id=e.d_id and e.id=5;

在这里插入图片描述

javaBean如下:
在这里插入图片描述
在这里插入图片描述
级联查询赋值时,按照类访问属性的方式进行赋值,
注意:column属性的值是sql语句查询出来的语句。并且id要放在第一位,不然报错。
在这里插入图片描述
级联查询的另一种引用对象赋值方法:

利用association属性进行查询,
<association>属性就是子对象赋值,property是在emloyee类中,哪一个属性是引用类型,javaType是此属性对应的类,然后进行赋值。

在这里插入图片描述


级联查询之分步查询


还是employee和department类两个,属性如下:

public class Department
 {
	private  Integer id;
	private  String dept_name;
  }

public class Employee
{
private Integer id;
private String lastName;
private  String email;
private  String gender;
private  Department department;
 }

EmployeeMapper和DepartmentMapper接口

public interface EmployeeMapperPlus {
    public Employee getEmpANndDeptByIdStep(Integer id);
}
public interface DepartmentMapper {
    public Department getDepById(int id);
}

EmployeeMapper.xmlr和DepartmentMapper.xml接口


***employeeMapper***:

   <resultMap id="myMapStep" type="test.Employee">
        <!--   用id和result都可以封装 id定义主键(底部有优化) result封装普通类 -->
        <id column="id" property="id"></id>
        <result column="last_name" property="lastName"></result>
        <result column="email" property="email"></result>
        <result column="gender" property="gender"></result>
        <association property="department" select="com.company.DepartmentMapper.getDepById" column="d_id"></association>
    </resultMap>
    <select id="getEmpANndDeptByIdStep" resultMap="myMapStep">
        select * from employee where id = #{id}
    </select>
    
  ***DepartmentMapper.xml***:
  
<mapper namespace="com.company.DepartmentMapper">
    <select id="getDepById" resultType="test.Department">
        select id,dept_name from dept where id = #{id}
    </select>
</mapper>

在这里插入图片描述
在这里插入图片描述
延迟加载:
像上面的级联查询,只要在需要查询员工的Department时才查询级联的查询,否则只需要查询第一步查询,而不需要查询department。

例如 :         
Employee employee = mapper.getEmpANndDeptByIdStep(5);
System.out.println(employee.getLastName());
只查询第一步,而不查询department。
只需要在全局配置文件里加上如下设置。
    <settings>
        <setting name="aggressiveLazyLoading" value="false"/>
        <setting name="lazyLoadingEnable" value="true"/>
    </settings>
MyBatisResultMap是一个非常强大的功能,它允许开发者自定义SQL查询结果映射到Java对象的过程。ResultMap可以指定如何映射结果集的列到指定的Java对象的属性,这对于处理复杂的关系(如一对多、多对一等)尤其有用。关联查询通常用于查询结果集需要根据外键关联其他表的情况,MyBatis通过ResultMap提供了多种关联查询的方式,例如: 1. association:用于处理一对一关联关系,它可以将结果集的一个字段映射到另一个对象的实例。 2. collection:用于处理一对多关联关系,它可以将结果集的一个字段映射到对象的集合属性。 使用ResultMap进行关联查询的基本步骤包括: - 在MyBatis的配置文件定义ResultMap。 - 在resultMap配置association或collection元素以表示关联关系。 - 在映射的SQL语句指定使用ResultMap。 下面是一个简单的例子: ```xml <!-- 定义一个ResultMap --> <resultMap id="userOrderMap" type="User"> <id property="id" column="user_id" /> <result property="name" column="user_name" /> <!-- 一对一关联 --> <association property="order" javaType="Order"> <id property="id" column="order_id" /> <result property="orderDate" column="order_date" /> </association> </resultMap> <!-- 映射查询 --> <select id="findUserAndOrder" resultMap="userOrderMap"> SELECT u.*, o.* FROM users u LEFT JOIN orders o ON u.id = o.user_id WHERE u.id = #{userId} </select> ``` 在这个例子,我们定义了一个名为`userOrderMap`的ResultMap,它映射了User对象和Order对象。`findUserAndOrder`查询返回的结果集会自动根据ResultMap映射到User对象,其User对象包含了一个Order类型的属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值