MyBatis如何实现多对多查询

MyBatis如何实现多对多查询

多个学生有多个老师代课教师

创建:student(学生表),teacher(老师表),以及中间表

CREATE TABLE student(
 sid INT NOT NULL AUTO_INCREMENT,
 sname VARCHAR(30),
 PRIMARY KEY(sid)
);

CREATE TABLE teacher(
 tid INT NOT NULL AUTO_INCREMENT,
 tname VARCHAR(30),
 PRIMARY KEY(tid)
);

CREATE TABLE student_teacher(
 s_id INT NOT NULL,
 t_id INT NOT NULL,
 PRIMARY KEY(s_id,t_id),
 FOREIGN KEY(s_id) REFERENCES student(sid),
 FOREIGN KEY(t_id) REFERENCES teacher(tid)
);
INSERT INTO student(sname) VALUES('张三'),('李四');
INSERT INTO teacher (tname) VALUES('刘老师'),('李老师');
INSERT INTO student_teacher(s_id,t_id) 
VALUES(1,1),(1,2),(2,1)

pom

 <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

Xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--  环境配置:支持多环境开发  -->
    <environments default="development">
        <!--  开发环境  -->
        <environment id="development">
            <!--  事务管理器  -->
            <transactionManager type="JDBC"/>
            <!--  数据源:驱动、连接、用户名、密码  -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://localhost:3306/person?useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123"/>
            </dataSource>
        </environment>
    </environments>
    <!--  配置映射文件:SQL语句所在位置  -->
    <mappers>
        <package name="com.springbmybtis.mapper"/>
    </mappers>
</configuration>

dao类

Student

public class Student {

    private int id;
    private String name;
    private List<StudentTeacher> studentTeacherList;

    public Student() {
    }

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public Student(int id, String name, List<StudentTeacher> studentTeacherList) {
        this.id = id;
        this.name = name;
        this.studentTeacherList = studentTeacherList;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<StudentTeacher> getStudentTeacherList() {
        return studentTeacherList;
    }

    public void setStudentTeacherList(List<StudentTeacher> studentTeacherList) {
        this.studentTeacherList = studentTeacherList;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", studentTeacherList=" + studentTeacherList +
                '}';
    }
}

StudentTeacher

public class StudentTeacher {

    private int sid;
    private int tid;
    private Teacher teacher;

    public StudentTeacher() {
    }

    public StudentTeacher(int sid, int tid) {
        this.sid = sid;
        this.tid = tid;
    }


    public StudentTeacher(int sid, int tid, Teacher teacher) {
        this.sid = sid;
        this.tid = tid;
        this.teacher = teacher;
    }

    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public int getTid() {
        return tid;
    }

    public void setTid(int tid) {
        this.tid = tid;
    }

    @Override
    public String toString() {
        return "StudentTeacher{" +
                "sid=" + sid +
                ", tid=" + tid +
                ", teacher=" + teacher +
                '}';
    }
}

Teacher

public class Teacher {

    private int id;
    private String name;

    public Teacher() {
    }

    public Teacher(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "TeacherMapper{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

Mapper

StudentMapper

public interface StudentMapper {
    Student queryById(int id);

}

Mapper.Xml

StudentMapper.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">
<!-- namespace:命名空间,隔离SQL -->
<mapper namespace="com.springbmybtis.mapper.StudentMapper">
    <!--
       id:SQL语句名称,具有唯一性
       resultType:返回结果类型  实体类全限定名
       parameterType:输入参数类型  int  Integer
   -->
    <resultMap id="StudentMap" type="com.springbmybtis.dao.Student">
        <id column="sid" property="id"></id>
        <result column="sname" property="name"></result>
        <collection property="studentTeacherList" ofType="com.springbmybtis.dao.StudentTeacher">
            <result column="s_id" property="sid"></result>
            <result column="t_id" property="tid"></result>
            <association property="teacher" javaType="com.springbmybtis.dao.Teacher">
                <id column="tid" property="id"></id>
                <result column="tname" property="name"></result>
            </association>
        </collection>
    </resultMap>

    <select id="queryById" parameterType="int" resultMap="StudentMap">
        SELECT s.*,st.*,t.*
        FROM student s,student_teacher st,teacher t
        WHERE s.sid=st.s_id
        AND st.t_id=t.tid
        AND s.sid=#{id}
    </select>


</mapper>

测试类

@Test
    public void queryByIdplus() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        Student student = mapper.queryById(1);
        System.out.println(student);
        sqlSession.close();
    }

测试结果

log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Student{id=1, name='张三', studentTeacherList=[StudentTeacher{sid=1, tid=1, teacher=TeacherMapper{id=1, name='刘老师'}}, StudentTeacher{sid=1, tid=2, teacher=TeacherMapper{id=2, name='李老师'}}]}

Process finished with exit code 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
假设我们有两个表,一个是订单表(order),另一个是订单详情表(order_item),订单表和订单详情表是一对多的关系(即一个订单可以对应多个订单详情),下面是使用MyBatis实现一对多查询的代码示例。 1. 定义Order类和OrderItem类 ```java public class Order { private Integer id; private String orderNo; private List<OrderItem> orderItemList; // 省略getter和setter方法 } public class OrderItem { private Integer id; private Integer orderId; private String productName; private Integer quantity; // 省略getter和setter方法 } ``` 2. 编写OrderMapper.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"> <mapper namespace="com.example.dao.OrderMapper"> <!-- 根据订单ID查询订单详情 --> <select id="findOrderDetailsByOrderId" resultMap="orderResultMap"> SELECT o.*, oi.id AS oi_id, oi.product_name, oi.quantity FROM `order` o LEFT JOIN order_item oi ON o.id = oi.order_id WHERE o.id = #{orderId} </select> <resultMap id="orderResultMap" type="com.example.entity.Order"> <!-- 订单信息映射 --> <id property="id" column="id"/> <result property="orderNo" column="order_no"/> <!-- 订单详情映射 --> <collection property="orderItemList" ofType="com.example.entity.OrderItem"> <id property="id" column="oi_id"/> <result property="productName" column="product_name"/> <result property="quantity" column="quantity"/> </collection> </resultMap> </mapper> ``` 3. 编写OrderMapper接口 ```java public interface OrderMapper { List<Order> findOrderDetailsByOrderId(Integer orderId); } ``` 4. 在Spring配置文件中配置OrderMapper ```xml <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="typeAliasesPackage" value="com.example.entity"/> <property name="mapperLocations"> <array> <value>classpath*:mapper/*.xml</value> </array> </property> </bean> <bean id="orderMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.example.dao.OrderMapper"/> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean> ``` 5. 调用OrderMapper接口方法进行一对多查询 ```java @Autowired private OrderMapper orderMapper; public void testFindOrderDetailsByOrderId() { Integer orderId = 1; List<Order> orderList = orderMapper.findOrderDetailsByOrderId(orderId); for (Order order : orderList) { System.out.println(order.getOrderNo()); List<OrderItem> orderItemList = order.getOrderItemList(); for (OrderItem orderItem : orderItemList) { System.out.println(orderItem.getProductName() + ", " + orderItem.getQuantity()); } } } ``` 通过以上步骤,我们就可以实现使用MyBatis进行一对多查询了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「我想」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值