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

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

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

    实验内容

    执行多对一关联查询

    上一章实现了一对多查询,以一为发起点,是一对多,以多为起点,则为多对一。

    操作步骤

    一、安装

    添加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, 2, '汉武大帝', '');
    

    三、创建 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.TopicMapper"></mapper>
            <mapper resource="mybatis/Topic.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 类,内容如下

    其中,Topic 类中添加了一个 userList 属性,用于存储用户信息

    public class User {
    
        private Long id;
    
        private String username;
    
        private String password;
        
        // 省略 get / set 方法
    }
    
    public class Topic {
    
        private Long id;
        
        private Long userId;
    
        private String title;
    
        private String content;
        
        private User userList;
        
        // 省略 get / set 方法
    }
    

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

    其中,User.xml 中的 resultMap 中添加了 association 属性,用于实现多对一的逻辑。

    association 必须设置的几个属性

    property:对应JavaBean中的属性

    javaType:JavaBean的路径

    Topic.xml

    <mapper namespace="tutorial.mybatis.mapper.TopicMapper">
    
        <resultMap id="BaseResultMap" type="tutorial.mybatis.model.Role">
            <id column="id" jdbcType="BIGINT" property="id" />
            <result column="user_id" jdbcType="BIGINT" property="userId" />
            <result column="title" jdbcType="VARCHAR" property="title" />
            <result column="content" jdbcType="VARCHAR" property="content" />
    
            <association property="userList" javaType="tutorial.mybatis.model.User">
                <id column="user_id" jdbcType="BIGINT" property="id" />
                <result column="username" jdbcType="VARCHAR" property="username" />
                <result column="password" jdbcType="VARCHAR" property="password" />
            </association>
        </resultMap>
    
        <select id="listAll" resultMap="BaseResultMap">
            SELECT a.id, a.username, a.password, b.id topic_id, b.title, b.content
                FROM `topic` b
                LEFT JOIN `user` a ON a.id = b.user_id
        </select>
    
    </mapper>
    

    五、创建接口类

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

    与上一章不同的地方:在接口类中使用注解的方式代替了XML文件中的SQL语句

    public interface TopicMapper {
    
        List<Topic> 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 {
                testMore2One(session);
            } finally {
                session.close();
            }
        }
    
        /**
         * 测试多对一
         */
        public static void testMore2One(SqlSession session) {
            TopicMapper topicMapper = session.getMapper(TopicMapper.class);
            System.out.println("------- 获取文章列表 --------");
            printTopic(topicMapper.listAll());
        }
    
        private static void printTopic(List<Topic> list) {
            if (list != null && !list.isEmpty()) {
                for (Topic topic : list) {
                    printTopic(topic);
                }
            }
        }
    
        private static void printTopic(Topic topic) {
            System.out.print("文章:" + topic.getTitle());
            if (topic.getUser() != null) {
                System.out.print(",属于用户:" + topic.getUser().getUsername());
            }
            System.out.println("");
        }
    
    }
    

    打印结果为:

    ------- 获取文章列表 --------
    文章:论文学复兴,属于用户:user1
    文章:汉武大帝,属于用户:user2
    

    相关文章

      网友评论

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

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