Mybatis知识点(一对多,一对一,自动返回主键)
准备:两个表模拟一对多和多对多业务。
表一:voteUser(调查问卷用户表)

表二:Vote(调查问卷表)

逻辑:一个用户能建立多个调查问卷,一个调查问卷对应一个用户
实现一对多
创建实体类(体现一对多)
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的映射过程如下图:

实现一对一
创建实体类(体现一对一)
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的字段而是选择接受数据的实体类属性

浙公网安备 33010602011771号