mybatis - 关于多表查询 结果的两种封装方式(注解版 , xml版)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_42986107/article/details/84147037

需求: 一对多查询,查询用户,同时查询账号的集合!

案例分析:
       1.一个用户可以有多个账号 , 也可以没有账号.
       2.所以sql语句使用左表查询 ( 以左表为主 )
在这里插入图片描述
一、配置文件XML的使用!
准备数据:
       1.创建数据库 并 初始化数据 !
       2.创建表对应的JavaBean 类.

User类:

public class User implements Serializable {
    private int id;
    private String username;
    private String sex;
    private String address;
    private Date birthday;

    // 用户表中添加账号集合.
    private List<Account> accountList;
    
	// 提供get / set 方法  和 toString方法. 
}

Account类:

public class Account {
    private int id;
    private int uid;
    private double money;
	
	// 提供get / set 方法  和 toString方法. 
}

UserMapper接口:

public interface UserMapper {
    //  一对多查询:  查询用户,同时查询账号的集合
    public List<User> findUserAndAccountList();
}

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">
<!--  接口的全路径名  -->
<mapper namespace="com.aaa.dao.UserMapper">
	<!--  一对多查询,  查询用户,同时查询账号的集合  -->
    <resultMap id="aaa" type="User">
        <!-- 主键字段 -->
        <id property="id" column="user_id"></id>
        <result property="username" column="username"></result>
        <result property="sex" column="sex"></result>
        <result property="address" column="address"></result>
        <result property="birthday" column="birthday"></result>
        <!-- 关联账号的集合属性 collectoin -->
        <collection property="accountList" column="account_id" ofType="Account">
            <id property="id" column="account_id"></id>
            <result property="uid" column="uid"></result>
            <result property="money" column="money"></result>
        </collection>
    </resultMap>
    <select id="findUserAndAccountList" resultMap="aaa">
        select u.*,a.*,a.UID account_id,u.id user_id
        from user u left join account a
        on u.id = a.uid
    </select> 
</mapper>

主配置文件: mybatis-config.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>
    <!-- 引入jdbc的配置文件.  -->
    <properties resource="jdbc.properties"></properties>

    <!-- 设置 -> 返回类型的别名 -->
    <typeAliases>
        <!-- 扫描包:这个包下的所有类都以类名为别名   -->
        <package name="com.aaa.domain"></package>
    </typeAliases>

    <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>
    <mappers>
        <!-- 扫描包:
               前提: 接口的包名必须要和关联sql语句的配置文件包名一致.
         -->
        <package name="com.aaa.dao"></package>
    </mappers>
</configuration>

测试类:

public class UserMapperTest {
    InputStream in = null;
    SqlSession sqlSession= null;
    UserMapper mapper = null;

    @Before
    public void init() throws Exception {
        // 1.读取主配置文件的输入流.
        in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
        // 2.获取sql对象.
        sqlSession = sqlSessionFactory.openSession();
        // 3.获取dao接口的实现类对象(代理)
        mapper = sqlSession.getMapper(UserMapper.class);
    }

    @After
    public void destory() throws Exception {
        // 提交事务.
        sqlSession.commit();

        // 5.释放资源.
        sqlSession.close();
        in.close();
    }
   
    @Test
    public void findUserAndAccountAndRoleList() {
        User user = mapper.findUserAndAccountAndRoleList(41);
        System.out.println(user);
    }
}

 
二、注解版的使用.

注: 使用注解版 , 就不能使用xml配置文件了.

UserMapper.java

public interface UserDao {
    /**
     *  一对多查询:
     *     查询用户信息 并且 查询账号集合信息.
     */
    @Select("select * from user ")
    @Results(id = "findUserAndAccontResult" , value = {
            @Result(id = true , property = "userId" , column = "id"),
            @Result(property = "username" , column = "username"),
            @Result(property = "userBirthday" , column = "birthday"),
            @Result(property = "userSex" , column = "sex"),
            @Result(property = "userAddress" , column = "address"),
            // 封装账户集合信息.
            @Result(property = "accountList" , column = "id" ,
                    many = @Many(select = "com.aaa.dao.AccountDao.findByUserId" , fetchType = FetchType.LAZY))
    })
    public List<User> findUserAndAccount();

AccountDao.java

public interface AccountDao {
	// 根据uid查询账号信息.
    @Select("SELECT * FROM account WHERE uid=#{user_id}")
    public List<Account> findByUserId(@Param("user_id") int user_id);
}

猜你喜欢

转载自blog.csdn.net/qq_42986107/article/details/84147037