MyBatis入门之一对多、多对多查询

       在生活中,一对多的例子更为普遍,例如:一个班级有多个学生,一个家庭有多个成员,一个部门有多个员工等等。下面,我将以一个作者有多个博客为例讲解,如何使用mybatis进行一对多关联查询。同样的,代码也会放在GitHub上,地址为:https://github.com/qiuxinfa/mybatis-study。我们还是先看下目录结构:

1.maven依赖和前面几篇是一样的,这里就不写了。

2.准备两张表:

(1)t_user表及其记录

-- ----------------------------
-- Table structure for `t_user`
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
  `id` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键id',
  `username` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名',
  `password` varchar(200) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码',
  `is_valid` int(1) DEFAULT NULL COMMENT '用户是否有效,0无效,1有效',
  `card_id` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户信息表';
 
-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES ('123', '张三', '123456', '1', '02');
INSERT INTO `t_user` VALUES ('456', '李四', '123456', '0', '01');

(2)t_blog表及其记录

-- ----------------------------
-- Table structure for `t_blog`
-- ----------------------------
DROP TABLE IF EXISTS `t_blog`;
CREATE TABLE `t_blog` (
  `id` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键id',
  `title` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '博客标题',
  `user_id` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '博客作者id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='博客';

-- ----------------------------
-- Records of t_blog
-- ----------------------------
INSERT INTO `t_blog` VALUES ('1', 'CSDN博客', '123');
INSERT INTO `t_blog` VALUES ('2', '博客园', '123');
INSERT INTO `t_blog` VALUES ('3', '简书', '456');

3.创建实体类:

(1)User.java

public class User implements Serializable{
    private String id;
    private String username;
    private String password;
    private Integer isValid;
    //一个用户,对应多篇博客
    private List<Blog> blogs;
    //省略set、get、toString
}

(2)Blog.java

public class Blog {
    private String id;
    private String title;
    private String userId;
    //省略set、get、toString
}

4.创建UserMapper接口:

public interface UserMapper {
    //根据id查询用户及其所有博客
    User getUserAndBlogByUserId(String id);
}

5.创建映射文件UserMapper.xml,详细的说明在配置中注释了:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace 因为要接口绑定,所以是接口的全限定类名-->
<mapper namespace="com.qxf.mapper.UserMapper">

    <!-- 自定义结果映射:
     id:是主键
     property:是Java对象的属性名
     column:是数据库中列名,或者查询中取的列的别名
    -->
    <resultMap id="userMap" type="User">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="password" column="password"></result>
        <result property="isValid" column="is_valid"></result>

        <!-- 一对多关联查询,使用collection,其中:
           collection中的property属性blogs:是User类中的属性名称,对应就可以了(private List<Blog> blogs);
           javaType:是User类中的blogs这个属性,属于哪个Java类型,这里当然是属于java.util.List
           ofType: 是List泛型中的类型,这里是Blog类型
           id中的column是t_blog表的id,只是在为了避免重名冲突,查询的时候取了别名blog_id
        -->
        <collection property="blogs" javaType="java.util.List" ofType="Blog">
            <id property="id" column="blog_id"></id>
            <result property="title" column="title"></result>
            <result property="userId" column="user_id"></result>
        </collection>
    </resultMap>

    <!--id 与接口的方法名相同,注意:
       这里的返回值类型不再是resultType了,而是resultMap
       而且resultMap的值,就是上面<resultMap>标签的id属性值
    -->
    <select id="getUserAndBlogByUserId" parameterType="string" resultMap="userMap">
        select u.id,u.username,u.password,u.is_valid,b.id as blog_id,b.title,b.user_id
         from t_user u,t_blog b
        where u.id = b.user_id
         and u.id=#{id}
    </select>

</mapper>

 6.创建mybatis的配置文件:与前面几篇是一样的,这里也不写了

7.测试:

public class One2ManyQuery {
    public static void main(String[] args) throws IOException {
        //读取配置信息
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        //根据配置信息,创建SqlSession工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        //SqlSession工厂创建SqlSession
        SqlSession sqlSession = factory.openSession();
        //获取接口的代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserAndBlogByUserId("123");
        System.out.println(user);
    }
}

查看测试结果:

 

可以看到,通过user的id,不仅可以查出User对象,还可以查询出该用户的所有博客列表。

8.补充说明:

(1)本篇博客没有讲多对多查询的原因是,它可以转化成一对多的模式,所以不再赘言。

(2)与一对一不同的是,多对多使用的是collection,而不是association,其他配置没有多大区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值