Mybatis基本使用(2)
指定resultType 和 parameterType中的别名
-
mybatis-config.xml中配置typeAlias
<typeAliases> <!--<typeAlias type="net.xdclass.online_class.domain.Video" alias="Video"/>--> <package name="net.xdclass.online_class.domain"/> </typeAliases>
第一种被注释掉的 找到的是相应的类
第二种找到的包,然后我们的resultType和parameterType返回的中就可以是包下的类名。可以直接找到
当在xml中配置了上述的两种中的随意一种
<select id="selectById" resultType="Video"> select * from video where id = #{video_id,jdbcType=INTEGER} </select>
就相当于我们没有配置的时候如此写
<select id="selectById" resultType="net.xdclass.online_class.domain.Video"> select * from video where id = #{video_id,jdbcType=INTEGER} </select>
查询多个字段的时候 使用标签减少书写量
是在mapper.xml中配置
<sql id="base_video_field">
id,title,summary,cover_img
</sql>
然后我们就可以查询到指定字段了
<select id="selectById" resultType="net.xdclass.online_class.domain.Video">
select <include refid="base_video_field"/> from video where
id = # {video_id,jdbcType=INTEGER}
</select>
resultMap的使用
Mybatis中sql语句返回的结果有两种
- resultType
- 可以返回指定的类(查出的字段必须和我们所构建的类中的属性有对应) 和 基础数据类型,一般用于简单查询
- resultMap
- 这个需要自定义字段,一般都用于复杂的sql查询语句,多表查询
-
当需要查询的数据用当前的语句不能全部查询出来的时候,我们使用resultMap辅助查询,resultMap的作用就是在同一张表中进行二次查询。然后将查询到的数据,根据resultMap中的配置映射到我们所需要的实体类中。
- 场景: 我们查询一个班级,但是班级里面有多个学生。当我们需要查询到班级的具体信息并且需要查询到里面具体的学生对象的时候,我们就需要用到resultMap,简单的resultType已经无法满足我们的程序需求了。
具体使用
-
比如 我们一个订单表中内嵌着一个用户,并且包含着这个用户信息。这是一对一情况。
import java.util.Date; /** * 视频订单 * */ public class VideoOrder { private int id; private String outTradeNo; private int state; private Date createTime; private int totalFee; private int videoId; private String videoTitle; private String videoImg; private int userId; private User user; @Override public String toString() { return "VideoOrder{" + "id=" + id + ", outTradeNo='" + outTradeNo + '\'' + ", state=" + state + ", createTime=" + createTime + ", totalFee=" + totalFee + ", videoId=" + videoId + ", videoTitle='" + videoTitle + '\'' + ", videoImg='" + videoImg + '\'' + ", userId=" + userId + ", user=" + user + '}'; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getOutTradeNo() { return outTradeNo; } public void setOutTradeNo(String outTradeNo) { this.outTradeNo = outTradeNo; } public int getState() { return state; } public void setState(int state) { this.state = state; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public int getTotalFee() { return totalFee; } public void setTotalFee(int totalFee) { this.totalFee = totalFee; } public int getVideoId() { return videoId; } public void setVideoId(int videoId) { this.videoId = videoId; } public String getVideoTitle() { return videoTitle; } public void setVideoTitle(String videoTitle) { this.videoTitle = videoTitle; } public String getVideoImg() { return videoImg; } public void setVideoImg(String videoImg) { this.videoImg = videoImg; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } } /** * 用户 * */ public class User { private int id; private String name; private String pwd; private String headImg; private String phone; private Date createTime; @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + ", headImg='" + headImg + '\'' + ", phone='" + phone + '\'' + ", createTime=" + createTime + '}'; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getHeadImg() { return headImg; } public void setHeadImg(String headImg) { this.headImg = headImg; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } }
当我们需要查询一个订单的时候,若是想要知道订单中的用户信息,就需要使用resultMap
因为是一对一关系 并且是订单表中包含用户,所以使用 <association> </association\ > 包裹住我们所需的用户信息
使用<id /> 标签的为唯一主键
使用<result /> 标签为其他属性
其中 column 为我们数据库中的字段 property 为我们实体类中的字段
我们从下面的sql语句中查询到数据库中具体的信息,然后根据resultMap中的配置具体映射到实体类对象,然后我们获取到相应的数据
<!-- type 为我们实体类绝对位置 (我配置了typeAliases,所以这样写) --> <resultMap id="ResultVideoOrderMap" type="VideoOrder"> <id column="id" property="id"/> <result column="user_id" property="userId"/> <result column="out_trade_no" property="outTradeNo"/> <association property="user" javaType="User"> <id column="id" property="id"/> <result column="name" property="name"/> </association> </resultMap> <!--resultMap = "上面的resultMap中的id"--> <select id="queryVideoOrderList" resultMap="ResultVideoOrderMap"> select o.id, o.user_id, o.out_trade_no, u.id, u.name from video_order o left join user u on o.user_id = u.id; </select>
-
但是如果是一对多的关系, 比如班级与学生的关系,或者 一个用户可以下单多个。那木一个用户信息中可以含有多个订单。这样看来就成为了 一对多的关系。
改一下User类
/** * 用户 * */ public class User { private int id; private String name; private String pwd; private String headImg; private String phone; private Date createTime; private ArrayList<VideoOrder> list; @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + ", headImg='" + headImg + '\'' + ", phone='" + phone + '\'' + ", createTime=" + createTime + ", list=" + list + '}'; } public ArrayList<VideoOrder> getList() { return list; } public void setList(ArrayList<VideoOrder> list) { this.list = list; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getHeadImg() { return headImg; } public void setHeadImg(String headImg) { this.headImg = headImg; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } }
然后我们一对多resultMap 需要用的关键字就是<collection> < collection>
<resultMap id="queryUserListResultMap" type="User"> <id column="" property="id"/> <result column="name" property="name"/> <!-- 这个 property 所赋值的 必须是User 中所包含的一个字段--> <!-- 这里是一对多关系 不可以用javaType 需要用ofType ofType 为链表或者其他数据结构中的泛型 --> <collection property="list" ofType="VideoOrder"> <id column="id" property="id"/> <result column="user_id" property="userId"/> <result column="out_trade_no" property="outTradeNo"/> </collection> </resultMap> <select id="queryUserList" resultMap="queryUserListResultMap"> select u.id, u.name, o.id, o.user_id, o.out_trade_no from user u left join video_order o on u.id = o.user_id; </select>
-
总结一下
<resultMap id="标识,与sql语句相关联" type="映射的对象类"> <id column="数据库表的主键字段" jdbcType="字段类型" property="映射对象类的主键属性" /> <result column="数据库表的一个字段" jdbcType="字段类型" property="映射到对象类中的一个属性"/> <association property="对象类中的一个对象属性" javaType="对象类关联的对象"> </association> <collection property="对象类中集合属性名称" ofType="集合中对象类型"> </collection> </resultMap>