• 在Mybits中,如果实体类的属性与Mysql的字段不同名,则输出数据时就会出现 **属性=null**此时查询结果永远为空

如数据库是id,pwd。实体类是id,password。则输出会id=...,password=null不是pwd!
解决方法如下:

一对一映射

方法1

  1. <select id="selectUserById" resultType="User">
  2. select id , name , pwd as password from user where id = #{id}
  3. </select>

as可以看作是将password作为pwd的一个别名
此种方法只能设置一个别名,不方便,实际开发中会需要很多别名,所以推荐方法二

方法二(推荐)

首先设置一个**<resultMap>**替换**resultType**。他兼具设置别名和设置返回值类型2个作用

<resultMap id="UserMap" type="User">
   <!-- id为主键 -->
   <id column="id" property="id"/>
   <!-- column是数据库表的列名 , property是对应实体类的属性名 -->
   <result column="name" property="name"/>
   <result column="pwd" property="password"/>
</resultMap>

<select id="selectUserById" resultMap="UserMap">
  select id , name , pwd from user where id = #{id}
</select>
  • id和type组成返回值类型,如select的返回值是UserMap,UserMap的类型又是User,所以select是User返回值
  • 主键设置别名是其他字段是
  • column是数据库表的列名 , property是对应实体类的属性名 ```xml 你已经见过简单映射语句的示例了,但并没有显式指定 resultMap。比如:
<a name="GLxwm"></a> # 多对一 - **多对一即多条数据增加相同字段结果,一对多即多条数据作为一个整体(如集合)给一条数据** ![](https://cdn.nlark.com/yuque/0/2021/webp/2319994/1639318177629-df5eeaf1-47a2-4a4e-b3df-0885b951ddc0.webp#clientId=u581b04a6-3651-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=uec28bf42&margin=%5Bobject%20Object%5D&originHeight=265&originWidth=721&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=uc6b912df-8118-4583-8432-892d9ca813c&title=)<br />首先创建数据 :一个学生表和一个老师表,数据为多个学生对应一个老师java @Data //GET,SET,ToString,有参,无参构造 public class Teacher { private int id; private String name; } @Data public class Student { private int id; private String name; //多个学生可以是同一个老师,即多对一 private Teacher teacher; } **增加实体类对应的Mapper接口(2个)**<br />`**public interface StudentMapper+TeacherMapper {}**`<br />**编写Maapper对应的mapper.xml配置文件(2个) 接口和对应xml无论有没有需求,都应该写上,以备后来之需**xml 第一个 <?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"> 第二个 <?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"> --- - 接下来开始写映射关系 - 我们需要自定义一个多表的结果集,下面是StudentTeacher - 这里是学生表为左表,所以`<resultMap>`的type为学生。id则为识别属性,即结果集名称 - `<association>:`property为要关联的类,column为被关联表的关联字段 select为关联进行的查询,这里的关联查询直接用xml,无需在mapper中写该方法,表示额外的查询xml <?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">

```java
除了上面的用左表结果再去查右表,还可以直接多表查询,映射结果关系
<select id="getStudents2" resultMap="StudentTeacher2" >
  select s.id sid, s.name sname , t.name tname
  from student s,teacher t
  where s.tid = t.id
</select>

<resultMap id="StudentTeacher2" type="Student">
   <id property="id" column="sid"/>
   <result property="name" column="sname"/>
   <!--关联对象property 关联对象在Student实体类中的属性-->
   <association property="teacher" javaType="Teacher">
       <result property="name" column="tname"/>
   </association>
</resultMap>
  • 多个字段关联:

    <resultMap id="StudentTeacher" type="Student">
     <!--association关联属性 property属性名 javaType属性类型 column在多的一方的表中的列名-->
     <association property="teacher"  column="{id=tid,name=tid}" javaType="Teacher" select="getTeacher"/>
    </resultMap>
    <!--
    这里传递过来的id,只有一个属性的时候,下面可以写任何值
    association中column多参数配置:
     column="{key=value,key=value}"
     其实就是键值对的形式,key是传给下个sql的取值名称,value是片段一中sql查询的字段名。
    -->
    <select id="getTeacher" resultType="teacher">
    select * from teacher where id = #{id} and name = #{name}
    </select>
    
    @Test
    public void testGetStudents(){
     SqlSession session = MybatisUtils.getSession();
     StudentMapper mapper = session.getMapper(StudentMapper.class);
    
     List<Student> students = mapper.getStudents();
    
     for (Student student : students){
         System.out.println(
                 "学生名:"+ student.getName()
                         +"\t老师:"+student.getTeacher().getName());
    }
    }
    

    一对多

    按结果嵌套处理
    1、TeacherMapper接口编写方法
    //获取指定老师,及老师下的所有学生
    public Teacher getTeacher(int id);
    2、编写接口对应的Mapper配置文件











    3、将Mapper文件注册到MyBatis-config文件中



    4、测试
    @Test
    public void testGetTeacher(){
    SqlSession session = MybatisUtils.getSession();
    TeacherMapper mapper = session.getMapper(TeacherMapper.class);
    Teacher teacher = mapper.getTeacher(1);
    System.out.println(teacher.getName());
    System.out.println(teacher.getStudents());
    }

按查询嵌套处理
1、TeacherMapper接口编写方法
public Teacher getTeacher2(int id);
2、编写接口对应的Mapper配置文件






3、将Mapper文件注册到MyBatis-config文件中
4、测试
@Test
public void testGetTeacher2(){
SqlSession session = MybatisUtils.getSession();
TeacherMapper mapper = session.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacher2(1);
System.out.println(teacher.getName());
System.out.println(teacher.getStudents());
}
小结
1、关联-association
2、集合-collection
3、所以association是用于一对一和多对一,而collection是用于一对多的关系
4、JavaType和ofType都是用来指定对象类型的

  • JavaType是用来指定pojo中属性的类型
  • ofType指定的是映射到list集合属性中pojo的类型。