[Mybatis]复杂查询环境搭建(重点)

105 阅读1分钟

多对一处理

image.png

  • 多个学生,对应一个老师
  • 对于学生而言 多个学生关联一个老师(多对一)
  • 对于老师而言 集合一个老师有很多个学生(一对多)

案例实操

数据库

CREATE TABLE `teacher` (
  `id` INT(10) NOT NULL,
  `name` VARCHAR(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师'); 

CREATE TABLE `student` (
  `id` INT(10) NOT NULL,
  `name` VARCHAR(30) DEFAULT NULL,
  `tid` INT(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fktid` (`tid`),
  CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');​

测试环境搭建

1.导入lombok

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

2.新建实体类Student,Teacher

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {

    private int id;
    private String name;

    /**
     * 学生需要关联一位老师
     */
    private Teacher teacher;
}


// Teacher
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
    private int id;
    private String name;
}


3.建立mapper接口

public interface TeacherMapper {

    /**
     * 查询接口测试
     * @param id
     * @return
     */
    @Select("select * from teacher where id=#{tid}")
    Teacher getTeacher(@Param("tid") int id);
}

4.建立mapper.XML文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatisstudy.dao.TeacherMapper">

</mapper>

在核心配置文件中绑定注册Mapper接口或者文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件-->
<configuration>
    <!--映入外部配置文件-->
    <properties resource="db.properties">
        <!--可以全写在db.properties里  也可以两边搭配混合都能实现效果,如果存在 优先使用外部配置文件-->
<!--        <property name="username" value="root"/>-->
<!--        <property name="password" value="123456"/>-->
    </properties>

    <!--设置 日志配置logImpl规范填写,严格区分大小写,空格-->
    <settings>
        <!--标准的日志工厂实现-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <!--LOG4J-->
<!--        <setting name="logImpl" value="LOG4J"/>-->
    </settings>

    <!--设置类型别名-->
    <typeAliases>
        <!--给实体类起别名-->
<!--        <typeAlias type="mybatisstudy.pojo.User" alias="User"></typeAlias>-->
        <!--配置包名-->
        <package name="com.mybatisstudy.pojo" />
    </typeAliases>

    <!--default 切换环境-->
    <environments default="development">
        <!--开发环境-->
        <environment id="development">
            <!--事务管理器 默认事务处理器JDBC-->
            <transactionManager type="JDBC"/>
            <!--数据源 默认POOLED / UNPOOLED-->
            <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.mybatisstudy.dao.TeacherMapper"></mapper>
        <mapper class="com.mybatisstudy.dao.StudentMapper"></mapper>
    </mappers>

</configuration>

6.测试

@Test
public void testQueryTeacher(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
    Teacher teacher = mapper.getTeacher(1);
    System.out.println(teacher);

    sqlSession.close();
}

重点错误解析

invalid bound statement (not found)是由于xml映射文件错误引起的,需要核对mapper文件包名,配置文件有无指定包名,配置文件注册mapper组件路径,resources下建立包应该注意,挨个建立,一次建立可能无法识别.