原文: 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天时间就能比较熟悉了,后面要多花时间运用到实际当中去,才能更好地掌握!