mybatis学习笔记-05 落日映苍穹つ 2022-09-17 01:54 139阅读 0赞 ### mybatis学习笔记-05 ### * 1、复杂环境搭建 * * 步骤 * 2、多对一处理 * * 2.1、实体类 * 2.2、按照查询嵌套处理 * 2.3、按照结果嵌套处理 * 3、一对多处理 * * 3.1、实体类 * 3.2、按结果嵌套查询 * 3.3、按查询嵌套处理 * 4、区别 这一篇来写一些相对复杂的SQL语句。 -------------------- # 1、复杂环境搭建 # 这个环境搭建跟我mybatis第一篇文章的环境搭建没有什么太大的区别,只不过这里会用到一些我前几篇说到的知识点,如果没看过我之前的文章,可以去看我前几篇的文章。 ## 步骤 ## 1. 工具类(和之前的一样,不变); 2. 创建实体类(属性名都要对应数据库列名); 3. 创建接口; 4. 在resources包下建立和接口对应的包和xml配置文件; 5. 在mybatis-config.xml核心配置文件中绑定所创建的接口。 ![在这里插入图片描述][watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5a6P6L-c5bCP5LiD_size_17_color_FFFFFF_t_70_g_se_x_16] 6. 设置别名 ![在这里插入图片描述][796ba65746244e5ea2dbb70e376b7cba.png] 环境搭建好后就可以接下来的操作了。 # 2、多对一处理 # 多对一:例如很多学生都有同一个老师,我们从学生方面去查询学生和老师。 ## 2.1、实体类 ## 实体类——学生 @Data @AllArgsConstructor @NoArgsConstructor public class Student { private int id; private String name; //老师的id是要从老师的表去查询,所以给返回老师的对象 private Teacher teacher; } 实体类——老师 @Data @AllArgsConstructor @NoArgsConstructor public class Teacher { private int id; private String name; } ## 2.2、按照查询嵌套处理 ## StudentMapper接口 public interface StudentMapper { List<Student> selectStudentAndTeacher(); } StudentMapper.xml配置文件 <mapper namespace="com.ZXF.dao.StudentMapper"> <!-- 通过查询嵌套=========================================--> <select id="selectStudentAndTeacher" resultMap="StudentTeacher"> select * from student; </select> <resultMap id="StudentTeacher" type="Student"> <result column="id" property="id"/> <result column="name" property="name"/> <!-- 复杂的属性,单独处理,如果要处理的是: 对象:用association 集合:用collection javaType:因为我们要处理的对象是一个类,所以我们把这个类传递进去 --> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> </resultMap> <select id="getTeacher" resultType="Teacher"> <!--单个参数时,#{id}这个参数名可以随意写,但为了命名规范和方便排错,建议一致 --> select * from teacher where id=#{id}; </select> 测试 @Test public void selectStudentAndTeacher(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); List<Student> students = mapper.selectStudentAndTeacher(); for (Student student : students) { System.out.println(student); } sqlSession.close(); } 测试结果 ![在这里插入图片描述][watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5a6P6L-c5bCP5LiD_size_20_color_FFFFFF_t_70_g_se_x_16] ## 2.3、按照结果嵌套处理 ## StudentMapper接口 public interface StudentMapper { List<Student> selectStudentAndTeacher2(); } StudentMapper.xml配置文件 <!-- 通过结果嵌套=========================================--> <select id="selectStudentAndTeacher2" 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 column="sid" property="id"/> <result column="sname" property="name"/> <association property="teacher" javaType="Teacher"> <result column="tname" property="name"/> </association> </resultMap> 测试 @Test public void selectStudentAndTeacher2(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); List<Student> students2 = mapper.selectStudentAndTeacher2(); for (Student student : students2) { System.out.println(student); } sqlSession.close(); } 测试结果 ![在这里插入图片描述][watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5a6P6L-c5bCP5LiD_size_20_color_FFFFFF_t_70_g_se_x_16 1] # 3、一对多处理 # 一对多:例如一个老师教好多个学生。我们从老师方面去查询学生和老师。 ## 3.1、实体类 ## 实体类——学生 @Data @AllArgsConstructor @NoArgsConstructor public class Student { private int id; private String name; private int tid; } 实体类——老师 @Data @AllArgsConstructor @NoArgsConstructor public class Teacher { private int id; private String name; //这里是从老师方向查学生,返回集合 private List<Student> students; } ## 3.2、按结果嵌套查询 ## TeacherMapper接口 public interface TeacherMapper { //查询老师和学生 List<Teacher> getTeacher(int id); } TeacherMapper.xml配置文件 <select id="getTeacher" resultMap="TeacherStudent"> select s.id sid,s.name sname,t.name tname,t.id tid from student s,teacher t where t.id=#{tid} </select> <resultMap id="TeacherStudent" type="Teacher"> <result property="id" column="tid"/> <result property="name" column="tname"/> <!-- javaType : 指定属性的类型 ofType : 集合中的泛型信息 --> <collection property="students" ofType="Student"> <result column="sid" property="id"/> <result column="sname" property="name"/> <result column="tid" property="tid"/> </collection> </resultMap> 测试 @Test public void getTeacherStudent(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class); List<Teacher> teacher = mapper.getTeacher(1); for (Teacher teacher1 : teacher) { System.out.println(teacher1); } sqlSession.close(); } 测试结果 ![在这里插入图片描述][watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5a6P6L-c5bCP5LiD_size_20_color_FFFFFF_t_70_g_se_x_16 2] ## 3.3、按查询嵌套处理 ## TeacherMapper接口 public interface TeacherMapper { //查询老师和学生 List<Teacher> getTeacher2(int id); } TeacherMapper.xml配置文件 <select id="getTeacher2" resultMap="TeacherStudent2"> select id,name from teacher where id=#{id} </select> <resultMap id="TeacherStudent2" type="Teacher"> <collection property="students" javaType="ArrayList" ofType="Student" select="getStudentById" column="id"> </collection> </resultMap> <select id="getStudentById" resultType="Student"> select * from student where tid=#{id} </select> </ 测试 @Test public void getTeacherStudent2(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class); List<Teacher> teacher2 = mapper.getTeacher2(1); for (Teacher teacher : teacher2) { System.out.println(teacher); } sqlSession.close(); } 测试结果 ![在这里插入图片描述][watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5a6P6L-c5bCP5LiD_size_20_color_FFFFFF_t_70_g_se_x_16 3] 这里查询结果有一个老师的id为0的问题!我也不清楚该怎么解决\[大哭\]。 # 4、区别 # * 对象:用association * 集合:用collection * javaType : 指定属性的类型 * ofType : 集合中的泛型信息 * 不论是association还是collection的property,传入的参数都是需要关联或者是集合的属性名。 还有一些细节写在代码的注释, -------------------- 这是我mybatis自学笔记的第5篇,没看过我之前的文章的话可以看看,前4篇的链接↓ [mybatis学习笔记-04][mybatis_-04] [mybatis学习笔记-03][mybatis_-03] [mybatis学习笔记-02][mybatis_-02] [mybatis学习笔记-01][mybatis_-01] -------------------- 本篇文章到这就结束了。**自学不易**,如果写得不详细,可以结合官方文档看,也可以评论区交流,这篇文章有可以优化的地方希望大佬指教指教。 [watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5a6P6L-c5bCP5LiD_size_17_color_FFFFFF_t_70_g_se_x_16]: /images/20220828/1c6d44415bff497aa7ee83997d3246b6.png [796ba65746244e5ea2dbb70e376b7cba.png]: /images/20220828/e4212f574ccc4ce1ad804cfcc2c3a0c7.png [watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5a6P6L-c5bCP5LiD_size_20_color_FFFFFF_t_70_g_se_x_16]: /images/20220828/8cc32c76e9e249799f587b710619f70c.png [watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5a6P6L-c5bCP5LiD_size_20_color_FFFFFF_t_70_g_se_x_16 1]: /images/20220828/a1fd5792091143a2863df233af653e87.png [watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5a6P6L-c5bCP5LiD_size_20_color_FFFFFF_t_70_g_se_x_16 2]: /images/20220828/40f680d8bd234a368a5d0bcad477ebf9.png [watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA5a6P6L-c5bCP5LiD_size_20_color_FFFFFF_t_70_g_se_x_16 3]: /images/20220828/813a8d5bbbfd4401bb1572e4ee184bdc.png [mybatis_-04]: https://blog.csdn.net/m0_50218636/article/details/120918735 [mybatis_-03]: https://blog.csdn.net/m0_50218636/article/details/120846531 [mybatis_-02]: https://blog.csdn.net/m0_50218636/article/details/120808251 [mybatis_-01]: https://blog.csdn.net/m0_50218636/article/details/120771968
还没有评论,来说两句吧...