zoukankan      html  css  js  c++  java
  • mybatis知识点03

    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的类型。

  • 相关阅读:
    TAM实施范例
    xmanager连接到RHEL6.
    TAM安装过程中遇到的问题
    db29.1FP2升级FP12
    WAS常见问题及解答
    在 Lotus Quickr for Domino 环境中使用 Tivoli Access Manager WebSEAL 作为反向代理服务器
    TAM包含的内容全面的指南自IBM
    Setting up the Web Admin Tool in LDAP 6.x to communicate via SSL
    oracle字符集。
    redhat中设置环境变量PATH的方法和只显示目录的Tree
  • 原文地址:https://www.cnblogs.com/dazhi151/p/13800163.html
Copyright © 2011-2022 走看看