mybatis的学习探讨(下)

原文: https://blog.csdn.net/xyz_dream/article/details/52741113

剩下的知识点其实和之前也差不多,所剩无几了。前面讲到的都是单表的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天时间就能比较熟悉了,后面要多花时间运用到实际当中去,才能更好地掌握!