mybatis的学习探讨(下)

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