Mybatis-07

Posted Charles_H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis-07相关的知识,希望对你有一定的参考价值。

Mybatis

  前面,我们学习了Mybatis中的resultMap,那么接下来,我们来合理运用这一项功能。

一对一

  首先是一对一,我们知道在面对一对一的外键约束时,需要用到resultMap中的association。接下来,我们来进行详细的演示。

 

第一步:建表并添加信息。

  我们这里以用户和身份证的一对一关系进行演示。

首先,搭建一个身份证表

create table card(
cardId INT PRIMARY KEY,
cardNum VARCHAR(100),
address VARCHAR(100)
);

接着,搭建一个用户表,并用户表与身份证表关联起来。

create table user(
userId INT PRIMARY KEY,
userName VARCHAR(100),
age INT,
cardId INT,
CONSTRAINT user_card
FOREIGN KEY(cardId) REFERENCES card(cardId)
);

最后,我们向里面添加一些数据。

 

第二步:编写实体类

package com.charles.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Card {
    private Integer cardId;
    private String cardNum;
    private String address;
}
package com.charles.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer userId;
    private String userName;
    private Integer age;
    private Card cardId;
}

 

第三步:编写通过Id查询数据的接口

package com.charles.dao;

import com.charles.pojo.User;

public interface UserMapper {

    User queryUserById(int id);
}
package com.charles.dao;

import com.charles.pojo.Card;

public interface CardMapper {
    Card queryCardById(int id);
}

 

第四步:编写SQL语句,并使用association,进行信息的绑定。(这个方法比较复杂,但是方便理解)

<?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="com.charles.dao.CardMapper">

    <select id="queryCardById" resultType="com.charles.pojo.Card" parameterType="int">
        SELECT * FROM card WHERE cardId=#{cardId};
    </select>

</mapper>
<?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="com.charles.dao.UserMapper">

    <select id="queryUserById" resultMap="userMap" parameterType="int">
        SELECT u.userName,u.age,c.cardId,c.cardNum,c.address
        FROM user u,card c
        WHERE u.cardId=c.cardId
        AND
            u.userId=#{userId};
    </select>

    <resultMap id="userMap" type="com.charles.pojo.User">
     <result property="userName" column="userName"/>
     <result property="age" column="age"/>
     <association property="cardId" javaType="com.charles.pojo.Card"
                  column="cardId" select="com.charles.dao.CardMapper.queryCardById">

        </association>
    </resultMap>

</mapper>

  这个方法比较复杂,但是很清晰,从第二个xml中,我们可以看出用户的cardId 已经和 身份证中的cardId进行了绑定。

第五步:编写完后,进行测试。

 

  我们或许在面对大量数据时,编写这么复杂的东西会很难受,这个时候,我们可以将其代码进行简化。

  我们不需要Card的接口和SQL语句,取而代之的是在用户的SQL语句中进行resulMap的嵌套。

    <resultMap id="cardMap" type="com.charles.pojo.Card">
        <id property="cardId" column="cardId"/>
        <result property="cardNum" column="cardNum"/>
        <result property="address" column="address"/>
    </resultMap>

    <resultMap id="userMap" type="com.charles.pojo.User">
     <result property="userName" column="userName"/>
     <result property="age" column="age"/>

     <association property="cardId" javaType="com.charles.pojo.Card" resultMap="cardMap">
     </association>

    </resultMap>

  这个方法虽然理解起来比较难,但是简化了代码量,提高了效率。

 

一对多

  学完一对一查询后,我们来学习一对多的使用,这个时候我们需要用到Collection。

 

第一步:我们的第一步依旧是建表,我们以老师和学生为例。

create table teacher(
tid INT PRIMARY KEY,
tname VARCHAR(100)
);
create table student(
sid INT PRIMARY KEY,
sname VARCHAR(100),
tid INT,
CONSTRAINT stu_tea
FOREIGN KEY(tid) REFERENCES teacher(tid)
);

 

第二步:编写实体类

package com.charles.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
    private Integer tid;
    private String tname;
    private List<Student> students;
}
package com.charles.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private Integer sid;
    private String sname;
    private Integer tid;
}

 

第三步:添加接口

package com.charles.dao;

import com.charles.pojo.Teacher;
import org.apache.ibatis.annotations.Param;

public interface TeacherMapper {
    Teacher queryTeacherById(@Param("tid") int id);
}

 

第四步:编写SQL语句

<?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="com.charles.dao.TeacherMapper">
    <select id="queryTeacherById" resultMap="TeacherMap">
        SELECT t.tid,t.tname,s.sid,s.sname,s.tid
        FROM teacher t,student s
        WHERE t.tid = s.tid
        AND t.tid = #{tid};
    </select>

    <resultMap id="TeacherMap" type="com.charles.pojo.Teacher">
        <id property="tid" column="tid"/>
        <result property="tname" column="tname"/>
        <collection property="students" ofType="com.charles.pojo.Student">
            <id property="sid" column="sid"/>
            <result property="sname" column="sname"/>
            <result property="tid" column="tid"/>
        </collection>
    </resultMap>
</mapper>

 

第五步:编写测试类进行测试。

   仔细一看,其实跟一对一没有多大的区别。这就是association和collection的使用演示。

以上是关于Mybatis-07的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis-07-笔记

mybatis07

狂神说MyBatis07:缓存

狂神说MyBatis07:缓存

mybatis07--关联查询一对多

SSM-MyBatis-07:Mybatis中SqlSession的insert和delete底层到底做了什么