8.平凡之路 - 高级映射一对一和多对一

一 resultMap标签之一对一映射

1.准备阶段

User.java文件

public class User {

    private Integer user_id;
    private String account;
    private String password;
    private String user_name;
    private Integer status;
    private Date login_time;
    private String ip;
    private Integer fk_role_id;
    //关联对象
    private Role role;
        
        //省略getter和setter方法
}

Role.java 文件

public class Role {

    private Integer role_id;
    private String role_name;
    private String role_key;
    private Integer status;

        //省略getter和setter方法
}

2.传统方式

  • UserMapper.xml映射文件
<mapper namespace="com.shxt.model.User">
    <resultMap type="com.shxt.model.User" id="BaseResultMapper">
        <id column="user_id" property="user_id"/>
        <result column="account" property="account"/>
        <result column="password" property="password"/>
        <result column="user_name" property="user_name"/>
        <result column="status" property="status"/>
        <result column="login_time" property="login_time"/>
        <result column="ip" property="ip"/>
        <result column="fk_role_id" property="fk_role_id"/>
    </resultMap>
    <sql id="sys_user_columns">
        user_id,account,password,user_name,status,login_time,ip,fk_role_id
    </sql>    
    <select id="load" parameterType="_int" resultMap="BaseResultMapper">
        SELECT
            <include refid="sys_user_columns"/>
        FROM
            sys_user
        WHERE
            user_id=#{user_id}
    </select>
</mapper>
  • UserDao接口和UserDaoImpl实现类

UserDao.java接口代码

public interface UserDao {
    User getUserByPK(int user_id);
}

UserDaoImpl.java实现类

public class UserDaoImpl implements UserDao {
    @Override
    public User getUserByPK( int user_id ) {
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();
            return sqlSession.selectOne(User.class.getName()+".load", user_id);
        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }
}
  • RoleMapper.xml映射文件
<mapper namespace="com.shxt.model.Role">
    <resultMap type="com.shxt.model.Role" id="BaseResultMapper">
        <id column="role_id" property="role_id"/>
        <result column="role_name" property="role_name"/>
        <result column="role_key" property="role_key"/>
        <result column="status" property="status"/>
    </resultMap>
    <sql id="sys_role_columns">
        role_id,role_name,role_key,status
    </sql>
    <select id="get" parameterType="_int" resultMap="BaseResultMapper">
        SELECT
            <include refid="sys_role_columns"/>
        FROM
            sys_role
        WHERE role_id=#{role_id}
    </select>
</mapper>
  • RoleDao.java文件和RoleDaoImpl.java实现类

RoleDao.java接口

public interface RoleDao {
    Role getRoleByPK(int role_id);
}

RoleDaoImpl.java实现类

public class RoleDaoImpl implements RoleDao {
    @Override
    public Role getRoleByPK( int role_id ) {
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();

            return sqlSession.selectOne(Role.class.getName()+".get", role_id);
        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }
}
  • Java代码测试
    @Test
    public void 获取用户信息(){
        UserDao userDao = new UserDaoImpl();//接口回调
        User user = userDao.getUserByPK(-999);
        //获取对应外键信息
        if(user.getFk_role_id()!=null){
            RoleDao roleDao = new RoleDaoImpl();
            //查询角色对应的信息
            Role role = roleDao.getRoleByPK(user.getFk_role_id());
            //建立关系
            user.setRole(role);
        }
        System.out.println(user);
    }
  • 图解说明


    一对一传统方式

3.resultMap标签之select方式

其实就是替换了

//获取对应外键信息
if(user.getFk_role_id()!=null){
  RoleDao roleDao = new RoleDaoImpl();
   //查询角色对应的信息
   Role role = roleDao.getRoleByPK(user.getFk_role_id());
   //建立关系
   user.setRole(role);
}

这段代码

  • 映射文件
     <resultMap type="com.shxt.model.User" id="BaseResultMapper">
        <id column="user_id" property="user_id"/>
        <result column="account" property="account"/>
        <result column="password" property="password"/>
        <result column="user_name" property="user_name"/>
        <result column="status" property="status"/>
        <result column="login_time" property="login_time"/>
        <result column="ip" property="ip"/>
        <result column="fk_role_id" property="fk_role_id"/>
    </resultMap>

 <resultMap type="com.shxt.model.User" id="SimpleResultMapper"  extends="BaseResultMapper">
        <!-- association 用来映射关联对象  -->
        <association property="role" javaType="com.shxt.model.Role"
        column="fk_role_id"
        select="com.shxt.model.Role.get"
        />
    </resultMap>

    <sql id="sys_user_columns">
        user_id,account,password,user_name,status,login_time,ip,fk_role_id
    </sql>
    <!-- 使用了另一个ID resultMap="SimpleResultMapper"  -->
    <select id="load" parameterType="_int" resultMap="SimpleResultMapper">
        SELECT
            <include refid="sys_user_columns"/>
        FROM
            sys_user
        WHERE
            user_id=#{user_id}
    </select>

  • Java测试代码
    @Test
    public void SELECT方式(){
        UserDao userDao = new UserDaoImpl();//接口回调
        User user = userDao.getUserByPK(-999);
        System.out.println(user);
    }
  • 图解说明


    select方式说明

    结果集继承

4.resultMap标签之resultMap属性方式

  • UserDao接口和UserDaoImpl实现类
    UserDao.java代码
public interface UserDao {
    User getUserLeftJoin(int user_id);
}

UserDaoImpl.java代码


public class UserDaoImpl implements UserDao {
    @Override
    public User getUserLeftJoin( int user_id ) {
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();

            return sqlSession.selectOne(User.class.getName()+".getUserLeftJoin", user_id);
        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }
}
  • 映射文件
<mapper namespace="com.shxt.model.User">

    <sql id="sys_user_columns_alias">
        ${alias}.user_id,${alias}.account,${alias}.password,
        ${alias}.user_name,${alias}.status,${alias}.login_time,
        ${alias}.ip,${alias}.fk_role_id
    </sql>
    

     <resultMap type="com.shxt.model.User" id="BaseResultMapper">
        <id column="user_id" property="user_id"/>
        <result column="account" property="account"/>
        <result column="password" property="password"/>
        <result column="user_name" property="user_name"/>
        <result column="status" property="status"/>
        <result column="login_time" property="login_time"/>
        <result column="ip" property="ip"/>
        <result column="fk_role_id" property="fk_role_id"/>
    </resultMap>
    <resultMap type="com.shxt.model.User" 
        id="JoinResultMapper" 
        extends="BaseResultMapper">
         <association property="role" javaType="com.shxt.model.Role"
            resultMap="com.shxt.model.Role.BaseResultMapper"
        >
            <!-- <id column="role_id" property="role_id"/>
            <result column="role_name" property="role_name"/>
            <result column="role_key" property="role_key"/>
            <result column="status" property="status"/> -->
        </association>
    
    </resultMap>
    <select id="getUserLeftJoin" parameterType="_int" 
        resultMap="JoinResultMapper">
        SELECT
            <include refid="sys_user_columns_alias">
                <property name="alias" value="u"/>
            </include>
            , 
            <!-- 关键如何找到那些字段 -->
            <include refid="com.shxt.model.Role.sys_role_columns_alias">
                <property name="alias" value="r"/>
            </include>
        FROM
            sys_user u
        LEFT JOIN sys_role r ON u.fk_role_id = r.role_id
        WHERE
            u.user_id =#{user_id}
    </select>
  • Java测试代码
    @Test
    public void 连接查询_结果集处理(){
        UserDao userDao = new UserDaoImpl();//接口回调
        User user = userDao.getUserLeftJoin(-999);
        System.out.println(user);
    }
  • 图解说明


    推荐说明

二 多对一映射测试

  • UserDao接口和UserDaoImpl实现类
    UserDao.java代码
public interface UserDao {
    List<User> list01();
    List<User> list02();

}

UserDaoImpl.java代码

public class UserDaoImpl implements UserDao {
    @Override
    public List<User> list01() {
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();

            return sqlSession.selectList(User.class.getName()+".list01");
        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }

    @Override
    public List<User> list02() {
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();

            return sqlSession.selectList(User.class.getName()+".list02");
        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }

}
  • 映射文件
    <select id="list01" resultMap="SimpleResultMapper">
        SELECT
            <include refid="sys_user_columns"/>
        FROM
            sys_user
    </select>
    <select id="list02"  resultMap="JoinResultMapper">
        SELECT
            <include refid="sys_user_columns_alias">
                <property name="alias" value="u"/>
            </include>
            , 
            <include refid="com.shxt.model.Role.sys_role_columns_alias">
                <property name="alias" value="r"/>
            </include>
        FROM
            sys_user u
        LEFT JOIN sys_role r ON u.fk_role_id = r.role_id
    </select>
  • 图解说明


    多对一测试
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,425评论 0 4
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,504评论 25 707
  • 匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 ...
    星空下的诺言阅读 1,635评论 0 4
  • 一直都不怎么喜欢印度这个国家,多是因为那里治安差,女性被严重歧视,但对这个国家的电影,从歌舞剧到三傻大闹宝莱坞,至...
    遥可及阅读 249评论 2 4
  • 一.准备工作:在安装CocoaPods之前,首先要安装好Ruby环境。MAC系统自带ruby环境,有时会出错。可能...
    龙之天下阅读 234评论 0 1