• MyBatis学习总结02


    1 ResultMap

    1.1 编写代码

    public class User {
    
       private int id;  //id
       private String name;   //姓名
       private String password;   //密码和数据库不一样!
       
       //构造
       //set/get
       //toString()
    }
    //根据id查询用户
    User selectUserById(int id);
    <resultMap id="UserMap" type="User">
       <!-- id为主键 -->
       <id column="id" property="id"/>
       <!-- column是数据库表的列名 , property是对应实体类的属性名 -->
       <result column="name" property="name"/>
       <result column="pwd" property="password"/>
    </resultMap>
    
    <select id="selectUserById" resultMap="UserMap">
      select id , name , pwd from user where id = #{id}
    </select>

    2 分页

    2.1 为什么需要分页?

      在学习mybatis等持久层框架的时候,会经常对数据进行增删改查操作,使用最多的是对数据库进行查询操作,如果查询大量数据的时候,我们往往使用分页进行查询,也就是每次处理小部分数据,这样对数据库压力就在可控范围内。

    2.2 编写代码

    <select id="selectUser" parameterType="map" resultType="user">
      select * from user limit #{startIndex},#{pageSize}
    </select>
    //选择全部用户实现分页
    List<User> selectUser(Map<String,Integer> map);
    //分页查询 , 两个参数startIndex , pageSize
    @Test
    public void testSelectUser() {
       SqlSession session = MybatisUtils.getSession();
       UserMapper mapper = session.getMapper(UserMapper.class);
    
       int currentPage = 1;  //第几页
       int pageSize = 2;  //每页显示几个
       Map<String,Integer> map = new HashMap<String,Integer>();
       map.put("startIndex",(currentPage-1)*pageSize);
       map.put("pageSize",pageSize);
    
       List<User> users = mapper.selectUser(map);
    
       for (User user: users){
           System.out.println(user);
      }
    
       session.close();
    }

    3 多对一处理

    3.1 多对一的理解

    • 多个学生对应一个老师

    • 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师!

    3.2 数据库设计

    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');

    3.3 编写代码

    public class Teacher {
       private int id;
       private String name;
    }
    public class Student {
       private int id;
       private String name;
       //多个学生可以是同一个老师,即多对一
       private Teacher teacher;
    }
    public interface StudentMapper {
       //获取所有学生及对应老师的信息
        public List<Student> getStudents();
    }
    <!--
    按查询结果嵌套处理
    思路:
       1. 直接查询出结果,进行结果集的映射
    -->
    <select id="getStudents" resultMap="StudentTeacher" >
      select s.id sid, s.name sname , t.name tname
      from student s,teacher t
      where s.tid = t.id
    </select>
    
    <resultMap id="StudentTeacher" type="Student">
       <id property="id" column="sid"/>
       <result property="name" column="sname"/>
       <!--关联对象property 关联对象在Student实体类中的属性-->
       <association property="teacher" javaType="Teacher">
           <result property="name" column="tname"/>
       </association>
    </resultMap>
    @Test
    public void testGetStudents2(){
       SqlSession session = MybatisUtils.getSession();
       StudentMapper mapper = session.getMapper(StudentMapper.class);
    
       List<Student> students = mapper.getStudents();
    
       for (Student student : students){
           System.out.println(
                   "学生名:"+ student.getName()
                           +"	老师:"+student.getTeacher().getName());
      }
    }

    4 一对多的处理

    4.1 一对多的理解

    • 一个老师拥有多个学生

    • 如果对于老师这边,就是一个一对多的现象,即从一个老师下面拥有一群学生(集合)!

    4.2 编写代码

    public class Student {
       private int id;
       private String name;
       private int tid;
    }
    public class Teacher {
       private int id;
       private String name;
       //一个老师多个学生
       private List<Student> students;
    }
    public interface TeacherMapper {
        //获取指定老师,及老师下的所有学生
        public Teacher getTeacher(int id);
    } 
    @Test
    public void testGetTeacher(){
       SqlSession session = MybatisUtils.getSession();
       TeacherMapper mapper = session.getMapper(TeacherMapper.class);
       Teacher teacher = mapper.getTeacher(1);
       System.out.println(teacher.getName());
       System.out.println(teacher.getStudents());
    }
    <mapper namespace="com.mapper.TeacherMapper">
    
       <!--
       思路:
           1. 从学生表和老师表中查出学生id,学生姓名,老师姓名
           2. 对查询出来的操作做结果集映射
               1. 集合的话,使用collection!
                   JavaType和ofType都是用来指定对象类型的
                   JavaType是用来指定pojo中属性的类型
                   ofType指定的是映射到list集合属性中pojo的类型。
       -->
       <select id="getTeacher" resultMap="TeacherStudent">
          select s.id sid, s.name sname , t.name tname, t.id tid
          from student s,teacher t
          where s.tid = t.id and t.id=#{id}
       </select>
    
       <resultMap id="TeacherStudent" type="Teacher">
           <result  property="name" column="tname"/>
           <collection property="students" ofType="Student">
               <result property="id" column="sid" />
               <result property="name" column="sname" />
               <result property="tid" column="tid" />
           </collection>
       </resultMap>
    </mapper>

    4.3 小结

    1、关联-association

    2、集合-collection

    3、所以association是用于一对一和多对一,而collection是用于一对多的关系

    4、JavaType和ofType都是用来指定对象类型的

    • JavaType是用来指定pojo中属性的类型

    • ofType指定的是映射到list集合属性中pojo的类型。

  • 相关阅读:
    yum、RPM常用的命令(转)
    10个你可能从未用过的PHP函数(转)
    sphinx 增量索引 及时更新、sphinx indexer索引合成时去旧和过滤办法(转)
    MySQL查询in操作 查询结果按in集合顺序显示(转)
    sphinx配置文件继承
    开源搜索引擎Sphinx 中启动多个搜索进程的方法(转)
    sphinx的简单实例
    Python中的join()函数的用法
    django queryset values&values_list
    Django中的QuerySet查询优化之select_related
  • 原文地址:https://www.cnblogs.com/MoooJL/p/13798672.html
Copyright © 2020-2023  润新知