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

整体还是在上个项目的基础上进行测试,单独学习这个知识点,所以大家需要重新来过

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;
}

这里没有设置关联对象了

Role.java持久化类

public class Role {

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

    //关联对象
    private List<User> userList;
}

一个角色对应多个用户,我们使用集合进行处理

2.collection标签之select方式

  • 映射文件说明
    RoleMapper.xml代码如下:
<mapper namespace="com.shxt.model.Role">
    <!-- 基础的映射 -->
    <resultMap type="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>
    <sql id="sys_role_columns_alias">
        ${alias}.role_id,${alias}.role_name,${alias}.role_key,${alias}.status
    </sql>
    
    <resultMap type="Role" id="SimpleResultMapper" 
        extends="BaseResultMapper">
        
        <!-- 配置集合 List<User>-->
        <collection property="userList" 
        
        javaType="java.util.List" 
        
        ofType="com.shxt.model.User"
        
        column="role_id"
        
        select="com.shxt.model.User.listUser"
        />
    </resultMap>
    
    <select id="load" parameterType="int" resultMap="SimpleResultMapper">
        SELECT
            <include refid="sys_role_columns"/>
        FROM
            sys_role
        WHERE
            role_id=#{role_id}
    </select>
</mapper>

这里使用了<collection> 标签

<collection property="类中的属性" 
        
        javaType="类中属性对应的类型,可以省略" 
        
        ofType="结果集处理的类型,也可以理解为结合中泛型的类型,必须填写"
        
        column="通过查询的那个字段的值,在进行查询,该字段必须有查询,不然无法查找数据"
        
        select="com.shxt.model.User.listUser  命名空间.ID 使用column的值去执行对应的SQL语句"
/>

UserMapp.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>
    <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>
    
    <select id="listUser" parameterType="int" resultMap="BaseResultMapper">
        SELECT
            <include refid="sys_user_columns"/>
        FROM
            sys_user
        WHERE
            fk_role_id=#{role_id}
    
    </select>
</mapper>
  • RoleDao接口和RoleDaoImpl实现类
    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()+".load", role_id);
        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }
}
  • Java测试代码
    @Test
    public void test01(){
        RoleDao roleDao = new RoleDaoImpl();

        System.out.println(roleDao.getRoleByPK(-100));
    }
  • 图解说明
select方式图解说明

3.collection标签之resultMap属性说明

因为select方式总是执行的SQL语句比较多,我们可以通过连接查询解决问题

  • 映射文件
    RoleMapper.xml代码如下:
<mapper namespace="com.shxt.model.Role">
    <resultMap type="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>
    <sql id="sys_role_columns_alias">
        ${alias}.role_id,${alias}.role_name,${alias}.role_key,${alias}.status
    </sql>
    <resultMap type="Role" id="JoinResultMapper" extends="BaseResultMapper">
        <collection property="userList" javaType="list" ofType="com.shxt.model.User"
        resultMap="com.shxt.model.User.BaseResultMapper"
        />
   
    </resultMap>
    <select id="getJoin" parameterType="int" resultMap="JoinResultMapper">
        SELECT
            <include refid="sys_role_columns_alias">
                <property name="alias" value="sr"/>
            </include>
            , 
           <include refid="com.shxt.model.User.sys_user_columns_alias">
                <property name="alias" value="su"/>
            </include>
        FROM
            sys_role sr
        LEFT JOIN sys_user su ON sr.role_id = su.fk_role_id
        WHERE
            sr.role_id =#{role_id}
    </select>
</mapper>

说明

 <collection property="userList" javaType="list" ofType="com.shxt.model.User"
        resultMap="com.shxt.model.User.BaseResultMapper 命名空间.ID找到结果集映射的位置"
  • RoleDao接口和RoleDaoImpl实现类
    RoleDao.java代码
public interface RoleDao {
    Role getJoinRolrByPK(int role_id);
}

RoleDaoImpl.java代码

public class RoleDaoImpl implements RoleDao {
    @Override
    public Role getJoinRolrByPK( int role_id ) {
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtils.getSqlSession();
            return sqlSession.selectOne(Role.class.getName()+".getJoin", role_id);
        } finally {
            MyBatisUtils.closeSqlSession(sqlSession);
        }
    }
}
  • Java测试代码
    @Test
    public void test02(){
        RoleDao roleDao = new RoleDaoImpl();

        System.out.println(roleDao.getJoinRolrByPK(-100222));
    }

后话:Hibernate的多对多和MyBatis的多对多处理方案不太一样,但是个人还是比较喜欢MyBatis的方式,其实Hibernate也可以一样优秀的处理

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,422评论 0 4
  • 一. Java基础部分.................................................
    wy_sure阅读 3,785评论 0 11
  • 2017.8.21 00:17-00:40 上海松江 1.我怎么如此幸运?回想起今天,真想把它从我的生命长河中删除...
    吴桂仪阅读 242评论 0 2
  • 他说莫奈牛的不能再牛 确实 同一照片加不同滤镜 效果果然不一样
    圈圈o0阅读 166评论 0 0