美文网首页Mybatis实验室
MyBatis入门实验(七)之一对多关联查询

MyBatis入门实验(七)之一对多关联查询

作者: 学好该死的程序 | 来源:发表于2018-07-18 14:21 被阅读3次

实验内容

执行一对多关联查询

操作步骤

一、安装

添加Maven依赖(本文使用版本为3.4.6)

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>x.x.x</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.42</version>
</dependency>

二、创建数据库及表结构

分别创建用户表及文章表,一个用户拥有多篇文章,典型的一对多案例

CREATE TABLE `user` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` varchar(32) NOT NULL COMMENT '用户名',
  `password` varchar(64) NOT NULL COMMENT '密码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT '用户';

CREATE TABLE `topic` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` bigint(11) unsigned NOT NULL COMMENT '用户',
  `title` varchar(32) NOT NULL DEFAULT '' COMMENT '标题',
  `content` varchar(255) NOT NULL DEFAULT '' COMMENT '密码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT '文章';

初始化数据

delete from `user`;
delete from `topic`;
insert into `user` values (1, 'user1', '123');
insert into `user` values (2, 'user2', '123');
insert into `topic` values (1, 1, '论文学复兴', '');
insert into `topic` values (2, 1, '汉武大帝', '');

三、创建 Mybatis 配置文件

src/main/resources 目录下创建 mybatis-config.xml 文件,内容如下

<configuration>
    <properties resource="jdbc.properties"></properties>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加载XML,同时加载接口类 -->
    <mappers>
        <mapper class="tutorial.mybatis.mapper.UserMapper"></mapper>
        <mapper resource="mybatis/User.xml"></mapper>
    </mappers>
</configuration>

src/main/resources 目录下创建 jdbc.properties 文件,内容如下

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/tutorial_mybatis?characterEncoding=utf-8&useSSL=true
jdbc.username=root
jdbc.password=

四、创建实体类

创建包 tutorial.mybatis.model,并在该包下创建 UserTopic 类,内容如下

其中,User 类中添加了一个 roleList 属性,用于存储用户的文章列表

public class User {

    private Long id;

    private String username;

    private String password;
    
    private List<Topic> roleList;
    
    // 省略 get / set 方法
}

public class Topic {

    private Long id;
    
    private Long userId;

    private String title;

    private String content;
    
    // 省略 get / set 方法
}

src/main/resources 目录下创建目录 mybatis,并在该目录下创建 User.xml,内容如下

其中,User.xml 中的 resultMap 中添加了 collection 属性,用于实现一对多的逻辑,从标签名也可以看出这个属性对应的是一个集合。

这个标签只是起到了一个组合的作用,将其内部的几个属性值组装成一个对象集合,所以对于SQL而言,关注的是其内部的列设置

collection 必须设置的几个属性

property:对应JavaBean中的属性

ofType:JavaBean的路径

User.xml

<mapper namespace="tutorial.mybatis.mapper.UserMapper">

    <resultMap id="BaseResultMap" type="tutorial.mybatis.model.User">
        <id column="id" jdbcType="BIGINT" property="id" />
        <result column="username" jdbcType="VARCHAR" property="username" />
        <result column="password" jdbcType="VARCHAR" property="password" />

        <collection property="topicList" ofType="tutorial.mybatis.model.Topic">
            <id column="topic_id" jdbcType="BIGINT" property="id" />
            <result column="title" jdbcType="VARCHAR" property="title" />
            <result column="content" jdbcType="VARCHAR" property="content" />
        </collection>
    </resultMap>

    <select id="listAll" resultMap="BaseResultMap">
        SELECT a.id, a.username, a.password, b.id topic_id, b.title, b.content
            FROM `user` a
            LEFT JOIN `topic` b ON a.id = b.user_id
    </select>

</mapper>

五、创建接口类

创建包 tutorial.mybatis.mapper,并在该包下创建接口 UserMapper,内容如下

public interface UserMapper {

    List<User> listAll();

}

六、构建

准备工作就绪,开始最终章,创建启动类 MybatisConfig,内容如下:

public class MybatisConfig {

    private static SqlSessionFactory sqlSessionFactory;
    private static Reader reader;

    static {
        try {
            reader = Resources.getResourceAsReader("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws IOException {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            testOne2More(session);
        } finally {
            session.close();
        }
    }

    /**
     * 一对多查询
     */
    public static void testOne2More(SqlSession session) {
        UserMapper userMapper = session.getMapper(UserMapper.class);
        System.out.println("------- 获取用户列表 --------");
        printUser(userMapper.listAll());
    }

    private static void printUser(List<User> list) {
        if (list != null && !list.isEmpty()) {
            for (User user : list) {
                printUser(user);
            }
        }
    }

    private static void printUser(User user) {
        if (user == null) {
            System.out.println("没有找到数据");
        } else {
            System.out.println("用户:" + user.getUsername());
            printTopic(user.getTopicList());
        }
    }

    private static void printTopic(List<Topic> list) {
        if (list != null && !list.isEmpty()) {
            for (Topic topic : list) {
                printTopic(topic);
            }
        }
    }

    private static void printTopic(Topic topic) {
        if (topic == null) {
            System.out.println("没有找到文章数据");
        } else {
            System.out.println("文章:" + topic.getTitle());
        }
    }

}

打印结果为:

用户:user1
文章:论文学复兴
文章:历史
用户:user2

可以看出,用户user1拥有两篇文章,而用户user2没有文章

相关文章

  • MyBatis入门实验(七)之一对多关联查询

    实验内容 执行一对多关联查询 操作步骤 一、安装 添加Maven依赖(本文使用版本为3.4.6) 二、创建数据库及...

  • MyBatis入门使用

    MyBatis入门使用 1. MyBatis简介 MyBatis是支持普通SQL查询、存储过程和高级映射的持久层框...

  • MyBatis学习笔记(2)

    Mybatis入门案例中设计模式分析 自定义Mybatis分析-执行查询所有分析 mybatis在使用代理dao的...

  • Mybatis一对多关联查询

    一、在实体类增加属性并添加set、get方法 二、编写xml中sql语句 另一个mapper文件

  • MyBatis入门实验(八)之多对一关联查询

    实验内容 执行多对一关联查询 上一章实现了一对多查询,以一为发起点,是一对多,以多为起点,则为多对一。 操作步骤 ...

  • Mybatis框架

    Mybatis实现的是JDBC部分的功能 Mybatis入门程序 1、需求 ·根据用户id查询一个用户信息·根据用...

  • mybatis笔记整理

    mybatis的基本用法及配置: 本文涉及知识点: 1、mybatis入门2、配置版CRUD3、关联查询(1:1&...

  • 编程改变世界(7)mybatis中的一对一映射

    上一次我们入门了mybatis的单表查询,这一次我们学习mybatis的高级映射中最简单的一对一映射我们想象这样一...

  • mybatis入门-查询所有

    实现mybatis查询一张表中的所有数据1.新创建一个maven2.在pom文件中导入mybatis依赖,mysq...

  • 07 Mybatis 延迟加载策略

    我们已经掌握了 Mybatis 中一对一,一对多,多对多关系的配置及实现,可以实现对象的关联查询。实际开发过程中很...

网友评论

    本文标题:MyBatis入门实验(七)之一对多关联查询

    本文链接:https://www.haomeiwen.com/subject/mapopftx.html