乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      MyBatis 詳解(一對一,一對多,多對多)

       ywasdfghjkl 2019-04-25

      1、什么是MyBatis?

        MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。2013年11月遷移到Github。

        iBATIS一詞來源于“internet”和“abatis”的組合,是一個基于Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)。

        MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatis 使用簡單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java對象)映射成數(shù)據(jù)庫中的記錄。

      PS:本文所有代碼下載鏈接:http://pan.baidu.com/s/1gf8CPQN 密碼:t2x9 

        再給大家推薦一個比較好的mybatis學(xué)習(xí)網(wǎng)站:www.

      2、MyBatis 入門實例基于xml配置

        ①、創(chuàng)建MySQL數(shù)據(jù)庫:mybatisDemo和表:person

      1
      2
      3
      create database mybatisDemo;
      use mybatisDemo;
      create table person(pid int primary key AUTO_INCREMENT, pname varchar(50), page int);

        

        ②、建立一個Java工程,并導(dǎo)入相應(yīng)的jar包

         

        相應(yīng)的 jar 包下載鏈接:http://pan.baidu.com/s/1skZM09Z  密碼:nkt6

         ③、在 MyBatisDemo 工程中添加數(shù)據(jù)庫配置文件 mybatis-configuration.xml

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      <?xml version='1.0' encoding='UTF-8'?>
      <!DOCTYPE configuration PUBLIC '-////DTD Config 3.0//EN' 'http:///dtd/mybatis-3-config.dtd'>
      <configuration>
      <!-- 可以配置多個運行環(huán)境,但是每個 SqlSessionFactory 實例只能選擇一個運行環(huán)境  
        一、development:開發(fā)模式
         二、work:工作模式-->
       <environments default='development'>
       <!--id屬性必須和上面的default一樣  -->
          <environment id='development'>
          <!--事務(wù)管理器
              一、JDBC:這個配置直接簡單使用了 JDBC 的提交和回滾設(shè)置。它依賴于從數(shù)據(jù)源得到的連接來管理事務(wù)范圍
              二、MANAGED:這個配置幾乎沒做什么。它從來不提交或回滾一個連接。而它會讓容器來管理事務(wù)的整個生命周期
                  比如 spring 或 JEE 應(yīng)用服務(wù)器的上下文,默認(rèn)情況下,它會關(guān)閉連接。然而一些容器并不希望這樣,
                  因此如果你需要從連接中停止它,就可以將 closeConnection 屬性設(shè)置為 false,比如:
                  <transactionManager type='MANAGED'>
                      <property name='closeConnection' value='false'/>
                  </transactionManager>
            -->
            <transactionManager type='JDBC'/>
            <!--dataSource 元素使用標(biāo)準(zhǔn)的 JDBC 數(shù)據(jù)源接口來配置 JDBC 連接對象源  -->
            <dataSource type='POOLED'>
              <property name='driver' value='com.mysql.jdbc.Driver'/>
              <property name='url' value='jdbc:mysql://localhost:3306/mybatisdemo'/>
              <property name='username' value='root'/>
              <property name='password' value='root'/>
            </dataSource>
          </environment>
        </environments>
      </configuration>

        ④、定義表所對應(yīng)的實體類

        

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      package com.ys.bean;
      public class Person {
          private int pid;
          private String pname;
          private int page;
           
          public int getPid() {
              return pid;
          }
          public void setPid(int pid) {
              this.pid = pid;
          }
          public String getPname() {
              return pname;
          }
          public void setPname(String pname) {
              this.pname = pname;
          }
          public int getPage() {
              return page;
          }
          public void setPage(int page) {
              this.page = page;
          }
          @Override
          public String toString() {
              return 'Person [pid=' + pid + ', pname=' + pname + ', page=' + page
                      + ']';
          }
      }

        ⑤、定義操作 person 表的sql映射文件personMapper.xml

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      <?xml version='1.0' encoding='UTF-8' ?>
      <!DOCTYPE mapper
        PUBLIC '-////DTD Mapper 3.0//EN'
        'http:///dtd/mybatis-3-mapper.dtd'>
      <mapper namespace='com.ys.bean.personMapper'>
        <!-- 根據(jù) pid 查詢 person 表中的數(shù)據(jù)
             id:唯一標(biāo)識符,此文件中的id值不能重復(fù)
             resultType:返回值類型,一條數(shù)據(jù)庫記錄也就對應(yīng)實體類的一個對象
             parameterType:參數(shù)類型,也就是查詢條件的類型
         -->
        <select id='selectPersonById'
                  resultType='com.ys.bean.Person' parameterType='int'>
          <!-- 這里和普通的sql 查詢語句差不多,對于只有一個查詢條件后面的 #{pid}表示占位符,里面不一定要寫pid,寫啥都可以,但是不要空著;如果有多個查詢條件,則要寫pojo類里面的屬性 -->
          select * from person where pid = #{pid}
        </select>
         
        <!-- 查詢person 表所有數(shù)據(jù) -->
        <select id='getAllPerson' resultType='com.ys.bean.Person'>
          select * from person
        </select>
         
        <!-- 根據(jù)id更新數(shù)據(jù) -->
        <update id='updatePersonById' parameterType='com.ys.bean.Person'>
          update person set pname=#{pname},page=#{page} where pid = #{pid}
        </update>
         
        <!-- 向 person 表插入一條數(shù)據(jù) -->
        <insert id='addPerson' parameterType='com.ys.bean.Person'>
          insert into person(pid,pname,page) values(#{pid},#{pname},#{page})
        </insert>
         
        <!-- 根據(jù) pid 刪除數(shù)據(jù) -->
        <delete id='deletePersonById' parameterType='Long'>
          delete from person where pid=#{pid}
        </delete>
         
      </mapper>

       ?、?strong>、向 mybatis-configuration.xml 配置文件中注冊 personMapper.xml 文件

      1
      2
      3
      4
      5
      <mappers>
             <!-- 注冊personMapper.xml文件,
             personMapper.xml位于com.ys.bean這個包下,所以resource寫成com/ys/bean/personMapper.xml-->
             <mapper resource='com/ys/bean/personMapper.xml'/>
      </mappers>

        如下圖所示:

         ⑦、創(chuàng)建測試類

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      package com.ys.test;
      import java.io.InputStream;
      import java.util.List;
      import org.apache.ibatis.session.SqlSession;
      import org.apache.ibatis.session.SqlSessionFactory;
      import org.apache.ibatis.session.SqlSessionFactoryBuilder;
      import org.junit.Before;
      import org.junit.Test;
      import com.ys.bean.Person;
      public class MyBatisTest {
          SqlSession session;
           
          @Before
          public void beforeLoadXML(){
              //加載 mybatis 配置文件
              InputStream inputStream = MyBatisTest.class.
                      getClassLoader().getResourceAsStream('mybatis-configuration.xml');
              //構(gòu)建sqlSession的工廠
              SqlSessionFactory sqlSessionFactory =
                      new SqlSessionFactoryBuilder().build(inputStream);
              //根據(jù) sqlSessionFactory 產(chǎn)生 session
              session = sqlSessionFactory.openSession();
          }
           
          //根據(jù) pid 查詢 person 表中的數(shù)據(jù)
          @Test
          public void testSelectById(){
              //這個字符串有 personMapper.xml 文件中 兩個部分構(gòu)成
              //<mapper namespace='com.ys.bean.personMapper'> 的 namespace 的值
              //<select id='selectPersonById' > id 值
              String statement = 'com.ys.bean.personMapper'+'.selectPersonById';
              Person p = session.selectOne(statement, 1);
              System.out.println(p);
              session.close();
          }
           
          //查詢person 表所有數(shù)據(jù)
          @Test
          public void testGetAllPerson(){
              String statement = 'com.ys.bean.personMapper.getAllPerson';
              List<Person> listPerson = session.selectList(statement);
              System.out.println(listPerson);
              session.close();
          }
           
          //根據(jù)id更新數(shù)據(jù)
          @Test
          public void updateById(){
              String statement = 'com.ys.bean.personMapper.updatePersonById';
              Person p = new Person();
              p.setPid(1);
              p.setPname('aaa');
              p.setPage(11);
              session.update(statement, p);
              session.commit();
              session.close();
          }
           
          //向 person 表插入一條數(shù)據(jù)
          @Test
          public void addPerson(){
              String statement = 'com.ys.bean.personMapper.addPerson';
              Person p = new Person();
              //由于我們設(shè)置了主鍵的自增長機制,故這里不需要手動設(shè)置 pid 的值
              //p.setPid(1);
              p.setPname('add');
              p.setPage(11);
              session.insert(statement, p);
              session.commit();
              session.close();
          }
           
          //根據(jù) pid 刪除person 表中的數(shù)據(jù)
          @Test
          public void deletePersonById(){
              String statement = 'com.ys.bean.personMapper.deletePersonById';
              session.delete(statement, 1);
              session.commit();
              session.close();
               
          }
           
      }

      3、MyBatis 入門實例注解配置

         ①、上面的前面四步都是一樣的,但是第五步不一樣,我們不需要創(chuàng)建 personMapper.xml 文件,首先在 src 目錄下創(chuàng)建 personMapper.java 文件

        

         內(nèi)容如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      package com.ys.annocation;
      import org.apache.ibatis.annotations.Delete;
      import org.apache.ibatis.annotations.Insert;
      import org.apache.ibatis.annotations.Select;
      import org.apache.ibatis.annotations.Update;
      import com.ys.bean.Person;
      public interface PersonMapper {
           
          @Insert('insert into person(pid,pname,page) values(#{pid},#{pname},#{page})')
          public int add(Person person);
           
          @Select('select * from person where pid = #{pid}')
          public Person getPerson(int pid);
           
          @Update('update person set pname=#{pname},page=#{page} where pid = #{pid}')
          public int updatePerson(Person preson);
           
          @Delete('delete from person where pid=#{pid}')
          public int deletePerson(int pid);
      }

       ?、?、向 mybatis-configuration.xml 配置文件中注冊 personMapper.xml 文件

         ③、編寫測試類

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      @Test
      public void testAnnocation(){
          PersonMapper mapper = session.getMapper(PersonMapper.class);
          Person p = new Person();
          p.setPid(7);
          p.setPname('abc');
          p.setPage(11);
          //調(diào)用增加方法
          mapper.add(p);
          //調(diào)用查詢方法
          Person p1 = mapper.getPerson(3);
          System.out.println(p1);
          //調(diào)用更新方法
          p.setPage(100);
          mapper.updatePerson(p);
          //調(diào)用刪除方法
          mapper.deletePerson(7);
          session.commit();
          session.close();
      }

      4、MyBatis 入門實例  一對一  基于xml配置

        這里我們以老師和班級為例,假設(shè)一般班級只能擁有有一個老師,一個老師只能帶一個班級。

        ①、創(chuàng)建實體類

        

        Teacher.java

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      package one.to.one;
      public class Teacher {
          private int tid;
          private String tname;
          private Classes classes;
           
          public int getTid() {
              return tid;
          }
          public void setTid(int tid) {
              this.tid = tid;
          }
          public String getTname() {
              return tname;
          }
          public void setTname(String tname) {
              this.tname = tname;
          }
          public Classes getClasses() {
              return classes;
          }
          public void setClasses(Classes classes) {
              this.classes = classes;
          }
          @Override
          public String toString() {
              return 'Teacher [tid=' + tid + ', tname=' + tname + ', classes=' + classes + ']';
          }
           
           
      }

        Classes.java

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      package one.to.one;
      public class Classes {
          private int cid;
          private String cname;
          private Teacher teacher;
           
          public int getCid() {
              return cid;
          }
          public void setCid(int cid) {
              this.cid = cid;
          }
          public String getCname() {
              return cname;
          }
          public void setCname(String cname) {
              this.cname = cname;
          }
          public Teacher getTeacher() {
              return teacher;
          }
          public void setTeacher(Teacher teacher) {
              this.teacher = teacher;
          }
          @Override
          public String toString() {
              return 'Classes [cid=' + cid + ', cname=' + cname + ', teacher=' + teacher + ']';
          }
           
      }

        ②、在數(shù)據(jù)庫中根據(jù)實體類創(chuàng)建相應(yīng)的數(shù)據(jù)表

       ?、?、定義操作 Classes 表的sql映射文件classesMapper.xml 

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      <?xml version='1.0' encoding='UTF-8' ?>
      <!DOCTYPE mapper
        PUBLIC '-////DTD Mapper 3.0//EN'
        'http:///dtd/mybatis-3-mapper.dtd'>
      <mapper namespace='one.to.one.classesMapper'>
          <!--
               方式一:嵌套結(jié)果:使用嵌套結(jié)果映射來處理重復(fù)的聯(lián)合結(jié)果的子集
                       封裝聯(lián)表查詢的數(shù)據(jù)(去除重復(fù)的數(shù)據(jù))
               select * from classes c, teacher t where c.tid=t.tid and c.tid=#{tid}
           -->
          <select id='getClasses' resultMap='getClassesMap' parameterType='int'>
              select * from classes c ,teacher t
                  where c.tid=t.tid and c.tid=#{tid}
          </select>
          <resultMap type='one.to.one.Classes' id='getClassesMap'>
              <id column='cid' property='cid'/>
              <result column='cname' property='cname'/>
              <association property='teacher' javaType='one.to.one.Teacher'>
                  <id column='tid' property='tid'></id>
                  <result column='tname' property='tname'/>
              </association>
          </resultMap>
          <!--
               方式一:嵌套結(jié)果:使用嵌套結(jié)果映射來處理重復(fù)的聯(lián)合結(jié)果的子集
                       封裝聯(lián)表查詢的數(shù)據(jù)(去除重復(fù)的數(shù)據(jù))
               select * from teacher t,classes c where t.cid = c.cid and t.cid=#{cid}
           -->
          <select id='getTeacher' resultMap='getTeacherMap' parameterType='int'>
              select * from teacher t,classes c
                  where t.cid = c.cid and t.cid=#{cid}
          </select>
          <resultMap type='one.to.one.Teacher' id='getTeacherMap'>
              <id column='tid' property='tid'/>
              <result column='tname' property='tname'/>
              <association property='classes' javaType='one.to.one.Classes'>
                  <id column='cid' property='cid'/>
                  <result column='cname' property='cname'/>
              </association>
          </resultMap>
           
           
          <!--
               方式二:嵌套查詢:通過執(zhí)行另外一個SQL映射語句來返回預(yù)期的復(fù)雜類型
               SELECT * FROM classes WHERE cid=1;
               SELECT * FROM teacher WHERE tid=1   //1 是上一個查詢得到的tid的值
               property:別名(屬性名)    column:列名 -->
                <!-- 把teacher的字段設(shè)置進去 -->
          <select id='getClasses2' resultMap='getClassesMap2'>
              select * from classes c where c.cid = #{cid}
          </select>
          <resultMap type='one.to.one.Classes' id='getClassesMap2'>
              <id column='cid' property='cid'/>
              <result column='cname' property='cname'/>
              <collection property='teacher' column='tid' select='getTeacherCollection'>
              </collection>
          </resultMap>
          <select id='getTeacherCollection' resultType='one.to.one.Teacher'>
              select tid tid,tname tname from teacher where tid=#{tid}
          </select>
         
      </mapper>

        說明:我們這里一對一的關(guān)聯(lián)操作,有兩種方式:

          1、使用嵌套結(jié)果映射來處理重復(fù)的聯(lián)合結(jié)果的子集

          2、通過執(zhí)行另外一個SQL映射語句來返回預(yù)期的復(fù)雜類型

          相關(guān)屬性解釋:

          

       ?、堋?strong>向 mybatis-configuration.xml 配置文件中注冊 classesMapper.xml 文件

        

        ⑤、編寫測試類

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      package one.to.one;
      import java.io.InputStream;
      import org.apache.ibatis.session.SqlSession;
      import org.apache.ibatis.session.SqlSessionFactory;
      import org.apache.ibatis.session.SqlSessionFactoryBuilder;
      import org.junit.Before;
      import org.junit.Test;
      import com.ys.test.MyBatisTest;
      public class OneToOneTest {
      SqlSession session;
           
          @Before
          public void beforeLoadXML(){
              //加載 mybatis 配置文件
              InputStream inputStream = MyBatisTest.class.
                      getClassLoader().getResourceAsStream('mybatis-configuration.xml');
              //構(gòu)建sqlSession的工廠
              SqlSessionFactory sqlSessionFactory =
                      new SqlSessionFactoryBuilder().build(inputStream);
              //根據(jù) sqlSessionFactory 產(chǎn)生 session
              session = sqlSessionFactory.openSession();
          }
           
          //一對一嵌套結(jié)果方式:根據(jù)教師id查詢班級信息
          @Test
          public void testGetClasses(){
              String statement = 'one.to.one.classesMapper.getClasses';
              Classes c = session.selectOne(statement, 1);
              System.out.println(c);
          }
           
          //一對一嵌套結(jié)果方式:根據(jù)班級id查詢教師信息
          @Test
          public void testGetTeacher(){
              String statement = 'one.to.one.classesMapper.getTeacher';
              Teacher t = session.selectOne(statement, 1);
              System.out.println(t);
          }
           
          //一對一嵌套查詢方式:根據(jù)教師id查詢班級信息
          @Test
          public void testGetClasses2(){
              String statement = 'one.to.one.classesMapper.getClasses2';
              Classes c = session.selectOne(statement, 1);
              System.out.println(c);
          }
           
           
      }

      4、MyBatis 入門實例  一對多,多對一  基于xml配置

        這里我們以班級和學(xué)生為例,一個班級里面對應(yīng)多個學(xué)生,這是一對多;反過來,多個學(xué)生對應(yīng)一個班級,這是多對一

       ?、佟⒔W(xué)生和班級的實體類

        Student.java

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      package one.to.many;
      public class Student {
          private int sid;
          private String sname;
          private Classes classes;
          public int getSid() {
              return sid;
          }
          public void setSid(int sid) {
              this.sid = sid;
          }
          public String getSname() {
              return sname;
          }
          public void setSname(String sname) {
              this.sname = sname;
          }
          public Classes getClasses() {
              return classes;
          }
          public void setClasses(Classes classes) {
              this.classes = classes;
          }
          @Override
          public String toString() {
              return 'Student [sid=' + sid + ', sname=' + sname + ', classes=' + classes + ']';
          }
           
      }

          Classes.java

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      package one.to.many;
      import java.util.Set;
      public class Classes {
          private int cid;
          private String cname;
          private Set<Student> students;
           
          public int getCid() {
              return cid;
          }
          public void setCid(int cid) {
              this.cid = cid;
          }
          public String getCname() {
              return cname;
          }
          public void setCname(String cname) {
              this.cname = cname;
          }
          public Set<Student> getStudents() {
              return students;
          }
          public void setStudents(Set<Student> students) {
              this.students = students;
          }
          @Override
          public String toString() {
              return 'Classes [cid=' + cid + ', cname=' + cname + ', students=' + students + ']';
          }
      }

        ②、在數(shù)據(jù)庫中根據(jù)實體類創(chuàng)建相應(yīng)的數(shù)據(jù)表

        ③、多對一:定義操作 Classes 表的sql映射文件classesMapper.xml 

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      <?xml version='1.0' encoding='UTF-8' ?>
      <!DOCTYPE mapper
        PUBLIC '-////DTD Mapper 3.0//EN'
        'http:///dtd/mybatis-3-mapper.dtd'>
      <mapper namespace='one.to.many.classesMapper'>
          <select id='getClasses' resultMap='getClassesMap'>
              select * from classes c,student s where s.cid=c.cid and c.cid=#{cid}
          </select>
          <resultMap type='one.to.many.Classes' id='getClassesMap'>
              <id column='cid' property='cid'></id>
              <result column='cname' property='cname'/>
              <collection property='students' ofType='one.to.many.Student'>
                  <id column='sid' property='sid'/>
                  <result column='sname' property='sname'/>
              </collection>
          </resultMap>
           
      </mapper>

       ?、?、一對多:定義操作 Student 表的sql映射文件studentMapper.xml

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      <?xml version='1.0' encoding='UTF-8' ?>
      <!DOCTYPE mapper
        PUBLIC '-////DTD Mapper 3.0//EN'
        'http:///dtd/mybatis-3-mapper.dtd'>
      <mapper namespace='many.to.one.studentMapper'>
          <select id='getStudents' resultMap='getStudentMap'>
              select * from classes c,student s where s.cid=c.cid and s.sid=#{sid}
          </select>
          <resultMap type='one.to.many.Student' id='getStudentMap'>
              <id column='sid' property='sid'></id>
              <result column='sname' property='sname'/>
              <association property='classes' javaType='one.to.many.Classes'>
                  <id column='cid' property='cid'/>
                  <result column='cname' property='cname'/>
              </association>
          </resultMap>
           
      </mapper>

        ⑤、向 mybatis-configuration.xml 配置文件中注冊 classesMapper.xml 、studentMapper.xml文件

        ⑥、編寫測試類

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      package one.to.many;
      import java.io.InputStream;
      import org.apache.ibatis.session.SqlSession;
      import org.apache.ibatis.session.SqlSessionFactory;
      import org.apache.ibatis.session.SqlSessionFactoryBuilder;
      import org.junit.Before;
      import org.junit.Test;
      import com.ys.test.MyBatisTest;
      public class OneToManyTest {
      SqlSession session;
           
          @Before
          public void beforeLoadXML(){
              //加載 mybatis 配置文件
              InputStream inputStream = MyBatisTest.class.
                      getClassLoader().getResourceAsStream('mybatis-configuration.xml');
              //構(gòu)建sqlSession的工廠
              SqlSessionFactory sqlSessionFactory =
                      new SqlSessionFactoryBuilder().build(inputStream);
              //根據(jù) sqlSessionFactory 產(chǎn)生 session
              session = sqlSessionFactory.openSession();
          }
           
          //一對多嵌套結(jié)果方式:根據(jù)班級id查詢班級所有的學(xué)生信息
          @Test
          public void testGetClasses(){
              String statement = 'one.to.many.classesMapper.getClasses';
              Classes c = session.selectOne(statement, 1);
              System.out.println(c);
              System.out.println(c.getStudents().size());
          }
           
           
          //多對一嵌套結(jié)果方式:根據(jù)學(xué)生id查詢班級信息
          @Test
          public void testGetStudents(){
              String statement = 'many.to.one.studentMapper.getStudents';
              Student s = session.selectOne(statement, 1);
              System.out.println(s);
              System.out.println(s.getClasses());
          }
           
           
      }

      5、MyBatis 入門實例  多對多  基于xml配置

        這里我們以 users 表和 groups 表為例,一個 users 可能加入多個 groups,而一個 groups 可能包含多個 users,故構(gòu)成 多對多 的關(guān)聯(lián)

        ①、在數(shù)據(jù)庫中建立相應(yīng)的表

        users 表

        

        groups 表

        

        兩者之間的關(guān)聯(lián)表users_groups表

        

        ②、建立對應(yīng)的實體類

        Users.java

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      package many.to.many;
      import java.util.Set;
      public class Users {
          private int uid;
          private String uname;
          private Set<Groups> groups;
          public int getUid() {
              return uid;
          }
          public void setUid(int uid) {
              this.uid = uid;
          }
          public String getUname() {
              return uname;
          }
          public void setUname(String uname) {
              this.uname = uname;
          }
          public Set<Groups> getGroups() {
              return groups;
          }
          public void setGroups(Set<Groups> groups) {
              this.groups = groups;
          }
          @Override
          public String toString() {
              return 'User [uid=' + uid + ', uname=' + uname + ', groups=' + groups + ']';
          }
           
      }

          Groups.java

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      package many.to.many;
      import java.util.Set;
      public class Groups {
          private int gid;
          private String gname;
          private Set<Users> users;
          public int getGid() {
              return gid;
          }
          public void setGid(int gid) {
              this.gid = gid;
          }
          public String getGname() {
              return gname;
          }
          public void setGname(String gname) {
              this.gname = gname;
          }
          public Set<Users> getUsers() {
              return users;
          }
          public void setUsers(Set<Users> users) {
              this.users = users;
          }
          @Override
          public String toString() {
              return 'Group [gid=' + gid + ', gname=' + gname + ', users=' + users + ']';
          }
           
      }

          Users_Groups.java

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      package many.to.many;
      public class Users_Groups {
          private Users user;
          private Groups group;
          public Users getUser() {
              return user;
          }
          public void setUser(Users user) {
              this.user = user;
          }
          public Groups getGroup() {
              return group;
          }
          public void setGroup(Groups group) {
              this.group = group;
          }
      }

       ?、?、多對多:定義操作 sql映射文件userMapper.xml

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      <?xml version='1.0' encoding='UTF-8' ?>
      <!DOCTYPE mapper
        PUBLIC '-////DTD Mapper 3.0//EN'
        'http:///dtd/mybatis-3-mapper.dtd'>
      <mapper namespace='many.to.many.userMapper'>
          <!-- 給一個用戶 id,查看該用戶下的所有用戶組信息 -->
          <select id='getUsers' resultMap='getGroupMap'>
              select g.gid,g.gname from users_groups ug,groups g
                  where ug.group_id=g.gid and ug.user_id=#{uid}
          </select>
          <resultMap type='many.to.many.Groups' id='getGroupMap'>
              <id column='gid' property='gid'/>
              <result column='gname' property='gname'/>
              <collection property='users' ofType='many.to.many.Users'>
                  <id column='uid' property='uid'/>
              <result column='uname' property='uname'/>
              </collection>
          </resultMap>
           
      </mapper>

       ?、?、向 mybatis-configuration.xml 配置文件中注冊 userMapper.xml文件

        ⑥、編寫測試類

      1
      2
      3
      4
      5
      6
      7
      8
      9
      //多對多:根據(jù)根據(jù)用戶 id 查詢所有的用戶組信息
          @Test
          public void testGetGroups(){
              String statement = 'many.to.many.userMapper.getUsers';
              List<Groups> listGroup = session.selectList(statement,1);
              for(Groups g : listGroup){
                  System.out.println(g.toString());
              }
          }

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多