Mybatis-多表查询(注解)

1.1 项目目录

使用注解实现复杂映射开发

1.2 一对一查询

一对一查询语句

-- 先查询订单
Select * from orders;
-- 再根据订单oid外键,查询用户
select * from user where id = #{根据订单查询的oid}

1.2.1 代码示例

sqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!--在内部配置属性 -->
    <properties resource="db.properties">
        <property name="jdbc.username" value="root"/>
        <property name="jdbc.password" value="root"/>
    </properties>

    <settings>
        <!--标准的日志工厂实现-->
        <setting name="logImpl" value="LOG4J"/>
        <!--开启全局延迟加载功能-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--
        因为cacheEnabled的取值默认就为true,所以这一步可以省略不配置。
        为true代表开启二级缓存;为false代表不开启二级缓存。
        -->
        <setting name="cacheEnabled" value="true"/>
    </settings>

    <!--定义实体类别名-->
    <typeAliases>
        <package name="cn.guardwhy.domain"/>
    </typeAliases>

    <!-- 一个核心配置文件 -->
    <environments default="default">
        <!-- 其中的一个运行环境,通过id来进行标识-->
        <environment id="default">
            <!--事务管理器 -->
            <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>

    <!--映射器-->
    <mappers>
        <package name="cn.guardwhy.dao"/>
    </mappers>
</configuration>

OrderMapper接口

@Select("select * from orders")
@Results({
    
    
    @Result(id = true, column = "id", property = "id"),
    @Result(column = "ordertime", property = "ordertime"),
    @Result(column = "total", property = "total"),
    @Result(column = "oid", property = "oid"),
    @Result(property = "user", javaType = User.class, column = "oid",
            one = @One(select = "cn.guardwhy.dao.UserMapper.findById", fetchType = FetchType.EAGER)) 
})
// 1.查询所有订单,同时查询订单所属的用户信息
List<Orders> findAllWithUser();

UserMapper接口

@Select("select * from user where id = #{id}")
@Results({
    
    
    @Result(column = "id", property = "id", id = true), // 映射主键
    @Result(column = "user_name", property = "username"),
    @Result(column = "birthday", property = "birthday"),
    @Result(column = "sex", property = "sex"),
    @Result(column = "address", property = "address")
})
// 1.通过id查询用户
User findById(Integer id);

测试代码

// 查询一个订单,与此同时查询出该订单所属的用户
@Test
public void testOrderWithUser(){
    
    
    // 1.通过工具类得到会话对象
    SqlSession sqlSession = MybatisUtils.getSession();
    // 2.会话对象的得到mapper接口代理对象
    OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
    // 3.调用方法
    List<Orders> list = mapper.findAllWithUser();
    for (Orders orders : list) {
    
    
        System.out.println(orders);
    }
    // 4.关闭会话
    sqlSession.close();
}

1.2.2 执行结果

1.3 一对多查询

一对多查询语句

-- 先查询用户
Select * from user;
-- 再根据用户id主键,查询订单列表
select * from orders where oid = #{用户id}

1.3.1 代码示例

UserMapper接口

// 查询所有用户,及关联的订单信息
@Select("select * from user")
@Results({
    
    
    @Result(column = "id", property = "id", id = true), // 映射主键
    @Result(column = "user_name", property = "username"),
    @Result(column = "birthday", property = "birthday"),
    @Result(column = "sex", property = "sex"),
    @Result(column = "address", property = "address"),
    @Result(property = "ordersList", javaType = List.class, column = "id",
            many = @Many(select = "cn.guardwhy.dao.OrderMapper.findByOid"))
})
List<User> findAllWithOrders();

OrderMapper接口

// 根据传递过来的用户id,查询该用户所具有的订单信息
@Select("select * from orders where id = #{oid}")
List<Orders> findByOid(Integer oid);

测试代码

// 查询一个用户,与此同时查询出该用户具有的订单
@Test
public void testUserWithOrders(){
    
    
    // 1.通过工具类得到会话对象
    SqlSession sqlSession = MybatisUtils.getSession();
    // 2.会话对象的得到mapper接口代理对象
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    // 3.调用方法
    List<User> userList = mapper.findAllWithOrders();
    for (User user : userList) {
    
    
        System.out.println(user);
    }
}

1.3.2 执行结果

1.4 多对多查询

多对多查询语句

-- 先查询用户
select * from user;
-- 再根据用户id主键,查询角色列表
 select * from role r inner join user_role ur on r.id = ur.user_id where ur.role_id = #{用户id};

1.4.1 代码示例

UserMapper接口

// 查询所有用户及关联的角色信息
@Select("select * from user")
@Results({
    
    
    @Result(column = "id", property = "id", id = true), // 映射主键
    @Result(column = "user_name", property = "username"),
    @Result(column = "birthday", property = "birthday"),
    @Result(column = "sex", property = "sex"),
    @Result(column = "address", property = "address"),
    @Result(property = "roleList", javaType = List.class, column = "id",
            many = @Many(select = "cn.guardwhy.dao.RoleMapper.findByOid"))
})
List<User> findAllWithRole();

RoleMapper接口

// 根据传递过来的用户id,查询该用户所具有的角色信息
@Select("select * from role r inner join user_role ur on r.id = ur.user_id where ur.role_id = #{id}")
@Results({
    
    
    @Result(id = true, column = "id", property = "id"),
    @Result(column = "role_name", property = "roleName"),
    @Result(column = "role_detail", property = "roleDetail")
})
List<Role> findByOid(Integer id);

测试代码

// 3.多对多查询
@Test
public void testUserWithRole(){
    
    
    // 1.通过工具类得到会话对象
    SqlSession sqlSession = MybatisUtils.getSession();
    // 2.会话对象的得到mapper接口代理对象
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    // 3.调用方法
    List<User> list = mapper.findAllWithRole();
    // 4.遍历操作
    for (User user : list) {
    
    
        System.out.println(user);
    }
}

1.4.2 执行结果

猜你喜欢

转载自blog.csdn.net/hxy1625309592/article/details/114912331