目录
一 学习自定义结果集
1 驼峰命名规则
2 自定义映射规则
二 指定一对一的关联封装进行查询
三 指定一对多的关联封装进行查询
一 学习自定义结果集
解决和数据库对不上的数据被封装为空:
1 驼峰命名规则
在xml文件中:
# 启用驼峰命名自动转换(数据库下划线字段 -> Java驼峰属性)
mybatis.configuration.map-underscore-to-camel-case=true
2 自定义映射规则
默认疯转原则(resultType):JavaBean中的属性名,去数据库表中找对应的值--一一映射封装
自定义映射规则(resultMap):我们告诉Mybatis如何将结果封装到Bean中
实现:
添加方法
java"> Emp getEmpMethod(Integer id);
配置Mapper XML 映射文件相关信息
java"> <!--column为数据库字段名,property为封装属性名--><!--id声明主键映射规则,result映射其他字段映射规则--><resultMap id="EmpChange" type="org.example.mybatis01.bean.Emp"><id property="id" column="id"/><result property="name" column="name"/><result property="age" column="age"/><result property="gender" column="gender"/></resultMap><select id="getEmpMethod" resultMap="EmpChange">select *from first_tb where id = #{id}</select>
测试:
java">package org.example.mybatis01;import org.example.mybatis01.bean.Emp;
import org.example.mybatis01.mapper.EmpMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class Mybatis01ApplicationTests {@AutowiredEmpMapper empMapper;@Testvoid testAddEmp() {Emp getByChange = empMapper.getEmpMethod(1);System.out.println("empById"+getByChange);}
}
二 指定一对一的关联封装进行查询
两个一一对应的数据库(一个订单查一个客户)
两个JavaBean类
java">package org.example.mybatis01.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@AllArgsConstructor
@NoArgsConstructor
@Data
public class Customer {private Integer id;private String customerName;private String phone;
}
java">package org.example.mybatis01.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;import java.math.BigDecimal;@ToString
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Order {private Long id;private String address;private BigDecimal amount;private Integer customerId;//订单对应的客户private Customer customer;}
对应的接口
java">package org.example.mybatis01.mapper;import org.apache.ibatis.annotations.Mapper;
import org.example.mybatis01.bean.Order;@Mapper
public interface OrderMapper {// 查询订单信息按照idOrder getOrderById(Long id);
}
java">package org.example.mybatis01.mapper;import org.apache.ibatis.annotations.Mapper;@Mapper
public interface CustomerMapper {}
配置Mapper XML 映射文件相关信息
column的名称应该实际上与你查询时所指定的字段名称所对应,因为查询过程中可能会出现更改过程,与数据库的字段名不一定相同,但是表名不需要更改指定(查询时修改的表名)
举例说明:在我的SQL查询语句当中我为了区分两张表当中id的不同我,将customer的customer_id属性,设置了别名,故上面的column字段属性当中也需要对应修改,property是建立联系的表名
java"><?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.example.mybatis01.mapper.OrderMapper"><resultMap id="OrderMethod" type="org.example.mybatis01.bean.Order"><id property="id" column="id"/><result property="address" column="address"/><result property="amount" column="amount"/><result property="customerId" column="customer_id"/><association property="customer" javaType="org.example.mybatis01.bean.Customer"><id property="id" column="c_id"/><result property="customerName" column="customer_name"/><result property="phone" column="phone"/></association></resultMap><select id="getOrderById" parameterType="long" resultMap="OrderMethod">select o.*,c.customer_name,c.phone,c.id as c_idfrom orders oleft join customer c on o.customer_id = c.idwhere o.id = #{id}</select></mapper>
测试使用:
java">package org.example.mybatis01;import org.example.mybatis01.bean.Order;
import org.example.mybatis01.mapper.OrderMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class Mybatis01ApplicationTests {@AutowiredOrderMapper orderMapper;@Testvoid test02() {Order orderById = orderMapper.getOrderById(3L);System.out.println(orderById);}}
运行结果:
查询出商品所对应的用户(我们是使用商品对应的客户号与对应的客户id进行匹配)一个订单查一个客户
三 指定一对多的关联封装进行查询
定义基础的JavaBean类
java">package org.example.mybatis01.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@AllArgsConstructor
@NoArgsConstructor
@Data
public class Customer {private Integer id;private String customerName;private String phone;List<Order> orders;
}
java">package org.example.mybatis01.bean;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;import java.math.BigDecimal;@ToString
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Order {private Long id;private String address;private BigDecimal amount;private Integer customerId;//订单对应的客户private Customer customer;}
接口类的定义:
java">package org.example.mybatis01.mapper;import org.apache.ibatis.annotations.Mapper;
import org.example.mybatis01.bean.Customer;@Mapper
public interface CustomerMapper {Customer getCustomerByOrderId(Integer id);}
配置Mapper XML 映射文件相关信息
参数当中的collection是为了解决返回集合的情况,ofType指定的时其中的返回值类型
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.example.mybatis01.mapper.CustomerMapper"><resultMap id="CustomMethod" type="org.example.mybatis01.bean.Customer"><id property="id" column="id"/><result property="customerName" column="customer_name"/><result property="phone" column="phone"/><collection property="orders" ofType="org.example.mybatis01.bean.Order"><id property="id" column="o_id"/><result property="address" column="address"/><result property="amount" column="amount"/><result property="customerId" column="customer_id"/></collection></resultMap><select id="getCustomerByOrderId" resultMap="CustomMethod">select c.*, o.*from orders oleft join customer c on c.id = o.customer_idwhere c.id = 1;</select></mapper>
测试方法:
java">package org.example.mybatis01;import org.example.mybatis01.bean.Customer;
import org.example.mybatis01.mapper.CustomerMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class Mybatis01ApplicationTests {@AutowiredCustomerMapper customerMapper;@Testvoid test02() {Customer customerByOrderId = customerMapper.getCustomerByOrderId(1);System.out.println(customerByOrderId);}}
运行结果:
实现目的: