Mybatis(13) ——多对一处理环境搭建

在这里插入图片描述

  • 多个学生 对应 一个老师
    • 【学生】多个学生 关联 一个老师【多对一】
    • 【老师】一个老师 集合 多个学生【一对多】

在这里插入图片描述


案例

  • 创建新表:teacher和student
    -- 创建teacher表
    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');
    

在这里插入图片描述

  • 创建新的子模块:MyBatis-06,复制05中的资源文件、工具类即可,其他的不需要,然后按照数据库的结构创建POJO

    package com.thhh.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Teacher {
        private int id;
        private String name;
    }
    
    package com.thhh.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Student {
        private int id;
        private String name;
        private Teacher teacher;
    }
    
  • 只要有一个POJO,不管用不用,我们都给它创建一个MAPPER接口
    在这里插入图片描述

  • 为对应的MAPPER接口创建对应的MAPPER.XML
        这次我们将mapper.xml放在resources文件夹中,并且按照java文件夹中对应的接口文件来创建文件夹
    在这里插入图片描述

    这么创建的原因就是将java文件和资源文件分开,更加符合MAVEN规范,使用相同的文件路径是因为最后的target会将这两个文件夹中的文件合并,只有文件路径相同才会合并到一起

  • 编写mapper.xml
        直接复制mybatis的核心配置文件,然后进行修改
    ①mybatis核心配置文件

    <?xml version="1.0" encoding="UTF8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <!--引入外部配置文件-->
        <properties resource="db.properties">
            <property name="username" value="root"/>
            <property name="password" value="123"/>
        </properties>
        <settings>
            <setting name="logImpl" value="STDOUT_LOGGING"/>
        </settings>
        <typeAliases>
            <package name="com.thhh.pojo"/>
        </typeAliases>
    
        <!--数据库环境节点-->
        <environments default="development"><!--environments节点的default属性指定配置的众多环境中默认使用哪一个数据库环境-->
            <!--环境1,我们还可以配置其他很多的环境节点-->
            <environment id="development">
                <transactionManager type="JDBC"/><!--事务管理,这里使用的就是JDBC中的事务管理-->
                <dataSource type="POOLED">
                    <!--属性节点,name设置属性名称,value设置属性值-->
                    <!--这里配置的就是JDBC4大参数-->
                    <property name="driver" value="${driver}"/><!--驱动-->
                    <!--注意:在XML中使不能直接使用&连接参数,我们需要转义,使用&amp;代替&-->
                    <property name="url" value="${url}"/><!--数据库的URL-->
                    <property name="username" value="${username}"/><!--连接数据库的账号-->
                    <property name="password" value="${password}"/><!--连接数据库的密码-->
                </dataSource>
            </environment>
        </environments>
    <!--    <mappers>
            <mapper class="com.thhh.dao.UserMapper"/>
        </mappers>-->
        <mappers>
            <mapper class="com.thhh.dao.UserMapper"/>
        </mappers>
        
    </configuration>
    

    ②删除没用的部分

    <?xml version="1.0" encoding="UTF8" ?>
    <!DOCTYPE configuration
    	PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    	"http://mybatis.org/dtd/mybatis-3-config.dtd">
    

    ③将上面的configuration和config改成mapper

    <?xml version="1.0" encoding="UTF8" ?>
    <!DOCTYPE mapper
           PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
           "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    

    ④添加mapper节点和它的命名空间

    <?xml version="1.0" encoding="UTF8" ?>
    <!DOCTYPE mapper
           PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
           "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.thhh.dao.StudentMapper">
    
    </mapper>
    
    <?xml version="1.0" encoding="UTF8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.thhh.dao.TeacherMapper">
    
    </mapper>
    

    ⑤去mybatis核心配置文件中注册SQL的映射mapper.xml或使用注解的接口

    <mappers>
        <mapper class="com.thhh.dao.TeacherMapper"/>
        <mapper class="com.thhh.dao.StudentMapper"/>
    </mappers>
    

    ⑥现在我们先不写复杂的SQL,先进行测试,所以mapper.xml中先不写什么东西,先使用注解测试一下我们的项目环境是不是搭建成功

    package com.thhh.dao;
    
    import com.thhh.pojo.Student;
    import org.apache.ibatis.annotations.Select;
    
    import java.util.List;
    
    public interface StudentMapper {
       @Select("select * from student")
       List<Student> selectStudentList();
    }
    
    package com.thhh.dao;
    
    import com.thhh.pojo.Student;
    import com.thhh.utils.MyBatisUtils;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    import java.util.List;
    
    public class TestMapper {
       @Test
       public void testSelectStudentList(){
           SqlSession sqlSession = MyBatisUtils.getSqlSession();
           StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
           List<Student> studentList = mapper.selectStudentList();
           for (Student student : studentList) {
               System.out.println(student);
           }
           sqlSession.close();
       }
    }
    

    在这里插入图片描述

    问题:但是我们可以明显的发现查询的结果是有BUG的,数据表中的数据我们确实是查询出来了,但是我们输出的实体类student的teacher属性为NULL
    原因:数据表中的字段为tid,它只是一个外键,是一个数字;而student的实体类的teacher属性是一个对象,所以查询出来数据set的时候,teacher并没有被调用set方法进行赋值,所以teacher的值为NULL
    解决:这个问题我们在14里解决

在这里插入图片描述
在这里插入图片描述

小结一下现在的环境搭建步骤

  • 在数据库中创建表
  • 在IDEA中创建一个子模块
    • 为子模块引入资源mybatis核心配置文件、资源文件和工具类,最后导入lombok
    • 按照数据表结构创建POJO
    • 为每一个POJO创建一个mapper/Dao 接口设计文件(不管有没有用)
    • 为每一个要使用的mapper/dao创建创建一个mapper.xml文件
      • 这个文件可以和mapper接口在同一个文件夹下,也可以创建在resources文件夹下,但是要和mapper接口有相同的文件夹结构
    • 编写mapper.xml文件
    • 去mybatis核心配置文件中注册SQL的映射,使用mapper.xml映射就使用resources属性注册;使用注解,就使用class或包扫描的方式注册(这两种方式的前提都是mapper接口和mapper.xml在同一文件夹下)
    • 测试
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值