MyBatis——SQL映射文件 使用resultMap实现结果匹配

二、使用resultMap实现简单的结果匹配
首先创建另一张数据库表RoleInfo(角色表),字段就是ID、RoleName,同时创建实体类Role。

resultMap常用的两个基本属性:

1、id:resultMap的唯一标识;

2、type:表示此resultMap映射的结果类型,通常是Java实体类。

在resultMap标签中,可使用和子标签指定一个属性名跟字段名的映射,property是实体类的属性名,column是数据库中的字段名。子节点一般对应该记录行的数据库主键字段,可提升MyBatis性能,二者作用差不多。

先说一下resultMap的自动映射级别:

PARTIAL,默认值,自动匹配基本类型

NONE,不进行自动匹配

FULL,自动匹配所有类型,包括复杂的JavaBean、引用类型。

一般设置为自动匹配所有,这样只需要在resultMap中配置名称不对应的属性即可,其他不做手动映射的属性依然可以映射上。此选项在mybatis-config.xml(核心配置文件)中的settings标签中设置,代码如下

<!--设置为FULL,自动匹配所有,则在resultMap中不进行匹配的字段也可以映射-->
        <setting name="autoMappingBehavior" value="FULL"/>

接下来举个例子,在实体类User中增加String类型的属性roleName,在UserMapper.java接口中定义如下方法

public User getNameAndRole(@Param("uName")String userName);  //查询用户信息同时获取角色名称

在UserMapper.xml中添加如下内容

<!--resultMap属性指向一个resultMap标签的id-->
    <select id="getNameAndRole" resultMap="nameAndRole">
        SELECT u.*,r.RoleName FROM UserInfo u,RoleInfo r WHERE UserName=#{
     uName} AND u.UserRole=r.ID
    </select>
    <!--type类型指定返回的实体类-->
    <resultMap id="nameAndRole" type="User">
        <id property="id" column="ID"/>
        <result property="roleName" column="RoleName"/> <!--因为设置是映射级别为FULL,所以一些可以对应上的字段不必进行配置-->
    </resultMap>

不再贴出服务层,列位自行补充实现吧,测试类添加如下代码

System.out.println("通过resultMap手动映射获取信息");
        User userRole=new UserServiceImpl().getNameAndRole("张三");  //查询张三的
        System.out.println(userRole.getUserName()+"的角色名称是:"+userRole.getRoleName());
        System.out.println(user.getUserName()+"的编码是:"+userRole.getUserCode());
        System.out.println(userRole.getUserName()+"的地址是:"+userRole.getUserAddress());

使用resultMap实现高级结果映射

在上文中,我们使用resultMap实现了简单的手动映射,处理实体类的属性与数据库字段不一致的情况。那么想一下,在实际的开发中,一个类所拥有的属性可能是复杂的,比如一个类拥有另一个类,或者拥有一个泛型集合,那么此时通过简单的映射已经无法实现,这时就引入resultMap的另一个子节点:association。association可以映射到Java实体类的某个复杂类型,比如一个类中嵌套另一个类。注意,association只能处理一对一的关联关系,不能处理一个类所包含的集合,处理集合用collection,用法跟association一样。association的使用方法很简单,只需要在resultMap标签中写上这个子标签,property代表实体类中的属性名,javaType代表这个属性实际要映射的类。接下来举个例子,在实体类User中添加一个Role类型的属性,属性名就叫role,在UserMapper.java接口中定义如下方法

public User getUserRole(@Param("uName")String userName);  //高级映射,映射到类中的复杂数据类型
<select id="getUserRole" resultMap="userAndRole">
        SELECT u.*,r.RoleName,r.RoleCode FROM UserInfo u,RoleInfo r WHERE UserName=#{
     uName} AND u.UserRole=r.ID
    </select>
    <resultMap id="userAndRole" type="User">
        <!--省略其他属性的映射-->
        <association property="role" javaType="Role" resultMap="userRoleInfo"/>  <!--映射User类中的实体类Role-->
    </resultMap>
 
    <!--此resultMap供association标签调用,写在外面有利于复用。返回Role类-->
    <resultMap id="userRoleInfo" type="Role">
        <!--省略其他属性的映射-->
        <result property="roleName" column="RoleName"/>
    </resultMap>
@Override
    public User getUserRole(@Param("uName") String userName) {
     
        SqlSession sqlSession=MyBatisUtil.getSqlSession();
        User user=sqlSession.getMapper(UserMapper.class).getUserRole(userName);
        MyBatisUtil.close(sqlSession);
        return user;
    }
System.out.println();
        System.out.println("resultMap实现高级映射获取信息");
        User user_gao=new UserServiceImpl().getUserRole("张三");
        System.out.println("用户名称:"+user_gao.getUserName());
        System.out.println("角色编号:"+user_gao.getRole().getRoleCode());
        System.out.println("角色名称"+user_gao.getRole().getRoleName());

使用SQL映射文件实现增删改

1、增:<insert id='' parameterType=''>SQL语句</insert>
2、删:<delete id='' parameterType=''>SQL语句</delete>
3、改:<update id='' parameterType=''>SQL语句</update>

你可能感兴趣的:(MyBatis——SQL映射文件 使用resultMap实现结果匹配)