二、使用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>