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

实验内容

执行一对多关联查询

操作步骤

一、安装

添加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没有文章

猜你喜欢

转载自blog.csdn.net/gongm24/article/details/81093557