mybatis的学习探讨(下)

            剩下的知识点其实和之前也差不多,所剩无几了。前面讲到的都是单表的CRUD操作,现在在前面的基础上讲讲多表联合查询的内容。 我把上次的数据表copy一下吧,就不再重新写了:

         现在数据库中有3个表,分别是:

                person (玩家表,user_qq(pk),user_name,age, sex )

                                                1234           tom       30    man

                                                1235          mary     18  woman

               record (游戏记录表,中间表。id(pk),user_qq,game_id,game_score) 

                                                                 1       1234       103         99

                                                                 2       1234       104         89

                                                                 3       1235       102         100

                                                                 4       1235       104         93

              game (游戏详情表,id(pk),game_id,game_name)

                                                1       102           lol英雄联盟

                                                2       103           刀塔

                                                3       104         魔兽世界 

                       注:主键自增  

               第一步: 分析关系

                从上面的数据表中可以看出:

                   1.person 和 record 呈  1:n的关系

                   2. record 和 game 呈   n:1 的关系

                   3.自然得到: person 和 game 呈 n:n的关系:  一个人可以玩多款游戏,一款游戏也可以被多个人玩。

              第二步: 分别建立实体类  Person  Record   Game

                    package xyz.dream.data.model;

                         class   Person   {

                            private  int userQq;

                            private  String userName;

                            priavte  int  age;

                            private  String  sex;

                            //自己添加  字段 set get方法,重写toString方法方便测试,

                       } 

           测试准备:  

               1.  与前面不同的是,第一步:    我们需要把数据库的关系模型转换为对象模型

                     我们知道,在数据库当中,一条记录和对象模型所对应的是一个类的一个实例,记录的列(字段)则是对象的属性。 现在我们先联合  person和record表进行联合查询。person与record的关系为1:n 的关系。

              2. Person模型转换

                    在Person实体类当中添加一个属性即可完成从person中设定的条件,联合查询到person和record表的信息。

               class   Person{

                      private  int userQq;

                      private  String userName;

                      priavte  int  age;

                      private  String  sex;

                      private List<Record>  records;  //   person: record       1 : n

                    //自己添加  字段 set get方法,重写toString方法方便测试,

                }

              3.Record模型转换

                     在Record实体类当中添加一个属性即可完成从record中设定的条件,联合查询到person和record表的信息。

                  class Record{

                         private int  id;       //主键唯一标识

                         private  int user_qq;  //用户qq号

                         private int  game_id;  //游戏编号

                         private  int  game_score;  //游戏得分

                         private  Person  person;//   record : person    n : 1

                         //自己添加  字段 set get方法,重写toString方法方便测试,

                   }

          测试一: 通过  用户qq号=1234  为条件,查询此用户所玩的游戏记录信息。

                  在DataBaseMapper.xml中,<resultMap>   定义:

                                                  <!--PersonResultMap --> 

                               <resultMap id="PersonResultMap" class="xyz.dream.data.model.Person">

                                                <id column="user_qq" property="userQq"/>  <!-- 主键映射 -->

                                                <result column="user_name" property="userName"/> <!-- 普通字段映射--> 

                                                 <result column="age" property="age"/>

                                                 <result column="sex" property="sex"/>

                                                          <!--record的字段映射-->    

                                          <collection property="records" ofType="xyz.dream.data.model.Record"

                                                          <id column="id" property="id" jdbcType="INTEGER" />

                                                          <result column="user_qq" property="userQq" jdbcType="INTEGER" />

                                                          <result column="game_id" property="gameId" jdbcType="INTEGER" />

                                                          <result column="game_score" property="game_score" jdbcType="INTEGER" /> 

                                                 </collection>

                                    </resultMap> 

                   -----------------------------------------------------------------------------------------------------------------

                                                             <!--RecordResultMap-->

                                  <resultMap id="RecordResultMap" type="xyz.dream.data.model.Record" >

                                                                               <!-- 普通字段映射-->  

                                                     <id column="id" property="id" jdbcType="INTEGER" />

                                                     <result column="user_qq" property="userQq" jdbcType="INTEGER" />

                                                     <result column="game_id" property="gameId" jdbcType="INTEGER" />

                                                     <result column="game_score" property="game_score" jdbcType="INTEGER" /> 

                                                                               <!--新增字段映射-->

                                                <association property="person" javaType="xyz.dream.data.model.Person"

                                                            <id column="user_qq" property="userQq" jdbcType="INTEGER" />

                                                            <result column="user_name" property="userName" jdbcType="VARCHAR" />

                                                            <result column="age" property="age" jdbcType="SMALLINT" />

                                                            <result column="sex" property="sex" jdbcType="VARCHAR" /> 

                                                 </association>  

                                     </resultMap>

                    -----------------------------------------------------sql查询语句------------------------------------------------------------

                               <select   id="selectInfoFromPersonAndRecord"  parameterType="int"  resultMap="PersonResultMap">

                                                       select * from  person  join  record on  person.user_qq=record.user_qq   where 

                                                           person.user_qq=#{id} 

                                </select>

                测试代码:---------------------------------------------------------------------------------------------------------------------

                                  Person   person=session.selectOne("selectInfoFromPersonAndRecord",1234);

                                    session.commit();//事务提交,查询到信息

            测试二多对一的查询  n:1也是一样的。 以 record中字段的条件去查询信息,查询   游戏编号id=104的游戏息。

                             <select   id="selectInfoFromPersonAndRecord2"  parameterType="int"  resultMap="RecordResultMap">

                                         select * from  person  join  record on  person.user_qq=record.user_qq   where  record.game_id=104                             

                              </select>

                测试代码:---------------------------------------------------------------------------------------------------------------------

                                                                 //返回的是List集合,玩过104游戏的记录有两条。  

                                Record   records=session.selectOne("selectInfoFromPersonAndRecord2");                              

                                                session.commit();//事物提交,自己查询records里面的信息

            测试三:  多对多:   n:n的查询       person   :game   通过 game  游戏id查询玩家,以及玩家游戏记录

                               Person和Game互相添加新字段: List<Game> games;  List<Person> persons;

                                 编写映射文件的ResultMap.

                                   <select id="selectPersonToManyGame" parameterType="int"  resultMap="PersonGameMap">

                                              select * from person  as p join record as r on p.user_qq=r.user_qq join game as g on 

                                                      r.game_id=g.game_id  where g.game_id=#{id}   //三表联合查询

                                   </select>

                测试代码:---------------------------------------------------------------------------------------------------------------------

                                    List<Person>   persons=session.selectList("selectPersonToManyGame",104);//多对多查询

                                              session.commit();//事物提交,查询结果。

                        今天就讲到这里,结束对mybatis的学习。大家花时间不超过4天时间就能比较熟悉了,后面要多花时间运用到实际当中去,才能更好地掌握!






  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GEEK JUMP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值