Mybatis多表查詢 結果的兩種封裝方式


 
需求: 一對多查詢,查詢用戶,同時查詢賬號的集合!
案例分析:       
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
<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
<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);
}

 

 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM