Mybatis知识点(一对多,一对一,自动返回主键)

准备:两个表模拟一对多和多对多业务。

表一:voteUser(调查问卷用户表)

image

表二:Vote(调查问卷表)

image

逻辑:一个用户能建立多个调查问卷,一个调查问卷对应一个用户

实现一对多

创建实体类(体现一对多)

public class VoteUser{
   //根据数据库建立属性
   private String userName;
   private String userPwd;
   private int userRank;
   private String userVote;
   private int userPower;
   private String applyVote;
   //一对多会存放一个关于问卷调查的List,放的是用户所有调查问卷
   private List<Vote> vote;
}

那么要实现查询一个用户所创建的所有调查问卷业务:

//该sql查询的是用户名叫小红创建的所有调查问卷
SELECT voteuser.*,voteTitle,voteDescription 
FROM voteuser JOIN vote
on vote.createuser=voteuser.username 
where voteuser.username="小红"

接下来就是映射resultmap

<!--resultmap用来自定义映射 type是映射的实体类  id是为resultmap起一个名称 -->
<!--每一个result 都代表一个字段映射 column是数据库字段 property是实体类字段-->
<resultMap type="entity.VoteUser" id="usermap">
 <result column="userName" property="userName"/>
 <result column="userPwd" property="userPwd"/>
 <result column="userRank" property="userRank"/>
 <result column="userVote" property="userVote"/>
 <result column="userPower" property="userPower"/>
 <result column="applyVote" property="applyVote"/>
<!-- 区分一下asssciation 用的是javatype 而 collettion用的是 oftype  --> 
 <collection property="vote" ofType="entity.Vote">
 <result column="voteTitle" property="voteTitle"/>
 <result column="voteDescription" property="voteDescription"/>
 <result column="createTime" property="createTime"/>
 </collection>
</resultMap>

<select id="selectVoteuserAllVote" resultMap="usermap">
select voteuser.*,voteTitle,voteDescription 
from voteuser join vote
on vote.createuser=voteuser.username 
where voteuser.username="小红"
</select>

运行成功后我想知道当我少了某个字段映射会不会产生什么影响,或者多写某个字段有什么影响!

经过尝试:当我们少写了某些字段的映射时候,即使select查询出来有值也不会把值映射出来

​ 当我们多写了某些不需要的映射字段,即select没有查询的字段也并没有关系。

于是大致搞懂了Mybatis的映射过程如下图:

image

实现一对一

创建实体类(体现一对一)

public class Vote {
	private int voteId;
	private String voteTitle;
	private String voteDescription;
	private String createTime;
	private String startTime;
	private String endTime;
	private String createUser;
	private String comments;
    //一对一需要在调查问卷表里面放一个用户对象-->一张调查问卷只属于一个用户
	private VoteUser user;
}

那么要实现查询一个调查问卷所有内容的业务:

 //该sql查询的是
 select vote.voteTitle,voteuser.username,voteuser.userpwd,voteuser.applyVote
 from vote,voteuser 
 where vote.createuser=voteuser.username 
 and voteid=1

接下来就是映射resultmap

<!-- 自己建立映射一对一使用的是association -->
<!-- type是resultmap的类型  id是标识符 -->
<resultMap type="entity.Vote" id="votemap">
 <!-- coulmn是字段数据库中的字段   ,告诉mybatis要用property来对应字段 -->
 <result column="voteTitle" property="voteTitle"/>
 <result column="voteDescription" property="voteDescription"/>
 <result column="createTime" property="createTime"/>
 <result column="startTime" property="startTime"/>
 <result column="endTime" property="endTime"/>
 <result column="createUser" property="createUser"/>
 <result column="comments" property="comments"/>
 <!-- association javaType是函数类型自定义的对象 -->
 <association property="user" javaType="entity.VoteUser">
	   <result column="userName" property="userName" />
	   <result column="userPwd" property="userPwd" />
 </association>
</resultMap>
<!-- 使用这个自定义的map -->
<select id="selectVoteByVoteuser" resultMap="votemap">
   select vote.voteTitle,voteuser.username,voteuser.userpwd,voteuser.applyVote from vote,voteuser 
   where vote.createuser=voteuser.username and voteid=1
</select>

插值操作自动返回主键的值

最后是插入操作时返回主键(有时候我们设置了主键自增,当我们需要的时候却不知道主键是多少)使用 useGeneratedKeys

  //插入时候返回·自增id
  public abstract int insertVote(@Param("vote")Vote vote);
<insert id="insertVote"  parameterType="entity.Vote" useGeneratedKeys="true" keyProperty="vote.voteId">
   insert  into vote(voteTitle,voteDescription) values (#{vote.voteTitle},#{vote.voteDescription})
</insert>

useGeneratedKeys="true"会在查询结束时把keyProperty="vote.voteId"里面的实体类字段赋值,赋予的值就是主键的值。

keyProperty设置的值不是sql的字段而是选择接受数据的实体类属性

posted @ 2021-10-22 15:07  旅祸少年  阅读(238)  评论(0)    收藏  举报