- 多个学生 对应 一个老师
- 【学生】多个学生 关联 一个老师【多对一】
- 【老师】一个老师 集合 多个学生【一对多】
案例
- 创建新表: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中使不能直接使用&连接参数,我们需要转义,使用&代替&--> <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在同一文件夹下)
- 测试