Mybatis多对一案例实现

1. 导入lombok

在进行测试之前,先把环境搭配好,把Lombok导入项目,Lombok jar包导入项目代码如下:

<dependencies>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>
    </dependencies>

具体代码可以查看网址:https://mvnrepository.com/artifact/org.projectlombok/lombok/1.18.20

2. 新建实体类Teacher、Student

import lombok.Data;
@Data
public class Student {
    
    
    private int id;
    private String name;
    //多个学生需要关联一个老师!
    private Teacher teacher;
}
import lombok.Data;
@Data
public class Teacher {
    
    
    private int id;
    private String name;
}

3. 建立Mapper接口

import com.mb.pojo.Student;
import java.util.List;
public interface StudentMapper {
    
    
    //查询所有的学生信息,以及对应的老师的信息
    public List<Student> getStudent();
    public List<Student> getStudent2();
}
import com.mb.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
public interface TeacherMapper {
    
    
  
}

4.建立Mapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--configuration核心配置文件-->
<mapper namespace="com.mb.mapper.StudentMapper"/>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--configuration核心配置文件-->
<mapper namespace="com.mb.mapper.TeacherMapper"/>

5. 在核心配置文件mybatis-config.xml中注册mapper接口

   <!--注册-->
    <mappers>
        <mapper class="com.mb.mapper.TeacherMapper"/>
        <mapper class="com.mb.mapper.StudentMapper"/>
    </mappers>

6. 开始测试

1. 编写工具类MybatisUtils

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;

public class MybatisUtils {
    
    
    private static SqlSessionFactory sqlSessionFactory;
    static {
    
    
        try {
    
    
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
    public static SqlSession getSqlSession() {
    
    
        return sqlSessionFactory.openSession();
    }
}

2. 在Mapper.xml文件编写查询语句

a. 按照查询嵌套处理

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--configuration核心配置文件-->
<mapper namespace="com.mb.mapper.StudentMapper">
    <!--
    思路:
        1.查询所有的学生信息
        2.根据查询出来的学生的tid,寻找对应的老师!	
    -->
    <select id="getStudent" resultMap="StudentTeacher">
          select * from mybatis.student;
    </select>
    <resultMap id="StudentTeacher" type="Student">
        <!--
        property对应数据库的名称
        column对应实体类中的名称
        -->
        <result property="id" column="id"/>
        <result property="name" column="name"/>
		<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
    </resultMap>
    <!-- 查询老师的代码, 下面#{tid}对应colum中的tid,注#{}里的名字可以随便赋值,但一般和数据库的相同-->
    <select id="getTeacher" resultType="Teacher">
        select * from teacher where id = #{tid};
    </select>
</mapper>

b.按照结果嵌套处理

 <!--
    方法二:按照结果嵌套处理
      	给数据库取别名
    -->
    <select id="getStudent2" 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">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <association property="teacher" javaType="Teacher">
            <result property="name" column="tname"/>
        </association>
    </resultMap>

3. 编写核心配置文件mybatis-config.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核心配置文件-->
<configuration>
    <!--引入外部配置文件-->
    <properties resource="db.properties"/>
    <settings>
        <!--标准的日志工厂实现-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    
    <!--给实体类取别名-->
    <typeAliases>
        <typeAlias type="com.mb.pojo.Teacher" alias="Teacher"/>
        <typeAlias type="com.mb.pojo.Student" alias="Student"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--注册-->
    <mappers>
        <mapper class="com.mb.mapper.TeacherMapper"/>
        <mapper class="com.mb.mapper.StudentMapper"/>
    </mappers>
</configuration>

4. 创建测试类MyTest开始测试

import com.mb.mapper.StudentMapper;
import com.mb.mapper.TeacherMapper;
import com.mb.pojo.Student;
import com.mb.pojo.Teacher;
import com.mb.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;

public class MyTest {
    
    
    @Test
    public void getStudent() {
    
    
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> studentList = mapper.getStudent();
        for (Student student : studentList) {
    
    
            System.out.println(student);
        }
        sqlSession.close();
    }
    @Test
    public void getStudent2() {
    
    
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> studentList2 = mapper.getStudent2();
        for (Student student2 : studentList2) {
    
    
            System.out.println(student2);
        }
        sqlSession.close();
    }
}

测试成功!

7. 小结

  1. 关联- association(复杂类型)。
  2. 注意:
    复杂类型需要在后面给tid它们赋值一个类型,使用JavaType来赋值
    select:用来表示嵌套查询(数据库是列,而封装的是一个对象,
    想要查询数据库中对应的tid赋值给teacher需要使用到嵌套查询。
  3. JavaType:用来指定实体类中对象属性的类型。

猜你喜欢

转载自blog.csdn.net/weixin_51012090/article/details/119637871
今日推荐