1. 程式人生 > 實用技巧 >MyBatis學習總結02

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()
                       +"\t老師:"+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的型別。