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的使用演示。