Mybatis中resultType和resultMap的用途简介说明
下文笔者讲述ResultType和resultMap的用途说明及mybatis一对多查询的返回值写法说明
使用MyBatis查询数据库时 有两种返回类型分别为:resultType和resultMap ================================================= 我们可以理解为每一种返回值都是resultMap 当我们指定了resultType返回类型时,则直接将结果赋值给相应的返回值 resultType和resultMap两者不能同时使用例:返回一个值
@Mapper
public interface UserDao {
// 获取用户
public String getUser(Long id);
}
xml
<select id="getUserName" paramTyp="java.lang.Long" resultType="java.lang.String" >
select user_name from t_users
</select>
返回一个对象
实体类对象
@Data
public class User {
private Long id;
private String userName;
private Integer sex;
}
@Mapper
public interface UserDao {
// 获取用户
public User getUser(Long id);
}
xml
resultType:
<select id="getUsersType" parameterType="java.lang.Long" resultType="com.example.pojo.User">
select user_name userName, sex from t_users where id=#{id}
</select>
resultMap:
<resultMap id="userMap" type="com.zkzong.mybatis.domain.Users">
<id column="id" property="id"/>
<result column="user_name" property="userName"/>
<result column="sex" property="sex" />
</resultMap>
<select id="getUsersMap" parameterType="java.lang.Long" resultMap="userMap">
select id, user_name, sex from t_users where id=#{id}
</select>
column:字段对应的应当是数据库查询结果字段,而不是数据库中的字段
property与Javabean中属性值一致
查询标签中的resultMap要与表映射的resultMap标签中的id一致。
id标签与result标签的区别
id标签:代表resultMap的主键,只能有一个
result标签:代表resultMap的属性,可以有多个
id是作为唯一标识的,
当和其他对象实例对比的时候,
尤其是应用到缓存和内嵌的结果映射
mybatis多对一
多对一
在实际开发中经常使用
如:
多个学生对应一个学校多个工人对应一个工厂
可以通过在数据库中进行外键的关联物理上的实现
也可以通过sql语句实现逻辑上的关联
User.java
public class User {
private Integer id;
private String username;
private String password;
private Integer sid;
private School school;
}
实现方式一
UserMapping.xml
<resultMap type="com.java265.modle.User" id="UserMap">
<result column="t_id" property="id"/>
<result column="t_username" property="username"/>
<result column="t_password" property="password"/>
<result column="t_sid" property="sid"/>
<result column="s_name" property="school.name"/>
</resultMap>
<select id="getSchoolName" resultMap="UserMap" >
select t_id,t_username,t_password,s_name FROM t_user,school where t_sid=s_id AND s_id=1;
</select>
可以看到在resultMap中不配置了User自身的属性还多了<result column="s_name" property="school.name"/>,
即我们需要哪个附表的值就要在resultMap中配置相应的附表映射。
实现方式二
<resultMap type="com.java265.modle.User" id="UserMap">
<result column="t_id" property="id"/>
<result column="t_username" property="username"/>
<result column="t_password" property="password"/>
<result column="t_sid" property="sid"/>
<association property="school" javaType="com.java265.modle.School">
<result column="s_name" property="name" />
</association>
</resultMap>
<select id="getSchoolName" resultMap="UserMap" >
select t_id,t_username,t_password,s_name FROM t_user,school where t_sid=s_id AND s_id=1;
</select>
引入了association标签
不再在原有user映射关系上进行补充
此标签中的property属性值为UserBean中附表对象的引用名
javaType即为School类的的全路径
sql语句不变
一对多
一对多与多对一的配置有许多相似点 对多返回的类型是一个集合所以要在SchoolBean中加入学生的集合
School.java
public class School {
private Integer id;
private String name;
private list<User> user;
}
学校映射文件配置
<resultMap type="com.java265.modle.School" id="SchoolMap">
<result column="s_id" property="id"/>
<result column="s_name" property="name"/>
<collection property="user" ofType="com.java265.modle.User">
<result column="t_id" property="id"/>
<result column="t_username" property="username"/>
<result column="t_password" property="password"/>
<result column="t_sid" property="sid"/>
</collection>
</resultMap>
<select id="getSchool" resultMap="SchoolMap">
select s_id,s_name,t_id,t_username,t_password
FROM school,t_user WHERE s_id=t_sid AND s_id=1;
</select>
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


