1. 程式人生 > >Mybatis學習筆記之---多表查詢(1)

Mybatis學習筆記之---多表查詢(1)

Mybatis多表查詢(1)

(一)舉例(使用者和賬戶)

一個使用者可以有多個賬戶
一個賬戶只能屬於一個使用者(多個賬戶也可以屬於同一個使用者)

(二)步驟

1、建立兩張表:使用者表,賬戶表,讓使用者表和賬戶表之間具備一對多的關係:需要使用外來鍵在賬戶表中新增

2、建立兩個實體類:使用者實體類和賬戶實體類,讓使用者和賬戶的實體類能體現出來一對多的關係

3、建立兩個配置檔案,使用者的配置檔案賬戶的配置檔案

4、實現配置:當我們查詢使用者時,可以同時得到使用者下所包含的賬戶資訊當我們查詢賬戶時,可以同時得到賬戶的所屬使用者資訊

(三)程式碼實現

 

1.pom.xml

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
  </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.41</version>
  </dependency>
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
  </dependency>

</dependencies>

 

2.Users.java

package entity;



import java.util.List;



public class Users {

    private int uid;

    private String username;

    private String password;

    //一對多的關係對映,主表實體應該包含從表實體的集合引用

    private List<Account> accounts;



    public int getUid() {

        return uid;

    }



    public void setUid(int uid) {

        this.uid = uid;

    }



    public String getUsername() {

        return username;

    }



    public void setUsername(String username) {

        this.username = username;

    }



    public String getPassword() {

        return password;

    }



    public void setPassword(String password) {

        this.password = password;

    }



    public List<Account> getAccounts() {

        return accounts;

    }



    public void setAccounts(List<Account> accounts) {

        this.accounts = accounts;

    }



    @Override

    public String toString() {

        return  accounts+

                "uid=" + uid +

                ", username='" + username + '\'' +

                ", password='" + password + '\''

                ;

    }

}

 

3.Account.java

package entity;



public class Account {

    private int aid;

    private String accountname;

    private int uid;

    private Users users;



    public int getAid() {

        return aid;

    }



    public void setAid(int aid) {

        this.aid = aid;

    }



    public String getAccountname() {

        return accountname;

    }



    public void setAccountname(String accountname) {

        this.accountname = accountname;

    }



    public int getUid() {

        return uid;

    }



    public void setUid(int uid) {

        this.uid = uid;

    }



    public Users getUsers() {

        return users;

    }



    public void setUsers(Users users) {

        this.users = users;

    }



    @Override

    public String toString() {

        return

                "aid=" + aid +

                ", accountname='" + accountname + '\'' +

                ", uid=" + uid

               ;

    }

}

 

4.UsersAccount.java

package entity;



public class UsersAccount extends Account{

    private String username;

    private String password;



    public String getUsername() {

        return username;

    }



    public void setUsername(String username) {

        this.username = username;

    }



    public String getPassword() {

        return password;

    }



    public void setPassword(String password) {

        this.password = password;

    }



    @Override

    public String toString() {

        return "uid="+super.getUid()+",aid="+super.getAid()+", username='" + username + '\'' +

                ", password='" + password + '\'' +",accountname="+super.getAccountname();

    }

}

 

5.SqlMapperConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPEconfiguration

        PUBLIC"-//mybatis.org//DTD Config 3.0//EN"

        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<!--mybatis的主配置檔案-->

<configuration>

    <!--配置環境-->

    <environments default="mysql">

        <!--配置mysql環境-->

        <environment id="mysql">

            <!--配置事務的型別-->

            <transactionManager type="JDBC"></transactionManager>

            <!--配置資料來源(連線池)-->

            <dataSource type="POOLED">

                <!--配置連線資料庫的4個基本資訊-->

                <property name="driver" value="com.mysql.jdbc.Driver"></property>

                <property name="url" value="jdbc:mysql://localhost:3306/zml01?useUnicode=true&amp;characterEncoding=utf-8"></property>

                <property name="username" value="root"></property>

                <property name="password" value="root"></property>

            </dataSource>

            

        </environment>

    </environments>

    <!--指定對映配置檔案的位置,對映配置檔案指的是每個dao獨立的配置檔案-->

<mappers>

    <mapper resource="dao/UserDao.xml"></mapper>

    <mapper resource="dao/AccountDao.xml"></mapper>

</mappers>

</configuration>

 

6.UserDao.java

package dao;

import entity.Users;



import java.util.List;



public interface UserDao {

     List<Users> findAll();

     Users find(int id);



}

 

7.UserDao.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPEmapper

        PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN"

        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="dao.UserDao">

    <!--定義Users的resultMap -->

    <resultMap id="userAccountMap" type="entity.Users">

        <id property="uid" column="uid"></id>

        <result property="username" column="username"></result>

        <result property="password" column="password"></result>

        <!--配置Users物件中Account集合的對映,一對多的關係對映-->

        <collection property="accounts" ofType="entity.Account">

            <id property="aid" column="aid"></id>

            <result property="accountname" column="accountname"></result>

            <result property="uid" column="uid"></result>

        </collection>

    </resultMap>

    <!--查詢所有,左外連線,返回左邊表的所有資料-->

    <select id="findAll" resultMap="userAccountMap">

        select * from users u left outer join account a on u.uid=a.uid

    </select>

    <!--根據ID查詢-->

    <select id="find" resultType="entity.Users">

        select * from users where uid=#{uid}

    </select>



</mapper>

 

8.UserTest.java

package test;



import dao.UserDao;

import entity.Users;

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;



import java.io.IOException;

import java.io.InputStream;

import java.util.List;



public class UserTest {

    private InputStream in;

    private SqlSession sqlSession;

    private UserDao UserDaoImpl;

    @Before

    public void init() throws IOException {

        //1.讀取配置檔案

        in= Resources.getResourceAsStream("SqlMapperConfig.xml");

        //2.建立SqlSessionFactory工廠

        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();

        SqlSessionFactory factory=builder.build(in);

        //3.使用工廠生產SqlSession物件

        sqlSession=factory.openSession();

        //4.使用SqlSession建立dao介面的代理物件

        UserDaoImpl=sqlSession.getMapper(UserDao.class);

    }

    @After

    public void destroy() throws IOException {

        //提交事務

        sqlSession.commit();

        //6.釋放資源

        sqlSession.close();

        in.close();

    }



    /**

     * 查詢所有

     * @throws IOException

     */

    @Test

    public void findall() throws IOException {



        //5.使用代理物件執行方法

        List<Users> users=UserDaoImpl.findAll();

        for(Users u:users){

            System.out.println(u);

        }



    }



}

 

9.AccountDao.java

package dao;



import entity.Account;

import entity.UsersAccount;



import java.util.List;



public interface AccountDao {

    List<Account> findAll();

    List<UsersAccount> find();

}

 

10.AccountDao.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPEmapper

        PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN"

        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="dao.AccountDao">

    <!--定義封裝Account和Users的resultMap-->

    <resultMap id="accountUsersMap" type="entity.Account">

        <id property="aid" column="aid"></id>

        <result property="accountname" column="accountname"></result>

        <result property="uid" column="uid"></result>

        <!--一對一的關係對映,配置封裝users的內容-->

        <association property="users" column="uid" javaType="entity.Users">

            <id property="uid" column="uid"></id>

            <result property="username" column="username"></result>

            <result property="password" column="password"></result>

        </association>

    </resultMap>

    <!--查詢所有 ,內連線-->

    <select id="findAll" resultMap="accountUsersMap">

        select a.*,u.username,u.password from account a,users u where a.uid=u.uid

    </select>

    <select id="find" resultType="entity.UsersAccount">

        select a.*,u.username,u.password from account a,users u where a.uid=u.uid

</select>

</mapper>

 

11.AccountTest.java

package test;



import dao.AccountDao;

import dao.UserDao;

import entity.Account;

import entity.Users;

import entity.UsersAccount;

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;



import java.io.IOException;

import java.io.InputStream;

import java.util.List;



public class AccountTest {

    private InputStream in;

    private SqlSession sqlSession;

    private AccountDao AccountDaoImpl;

    @Before

    public void init() throws IOException {

        //1.讀取配置檔案

        in= Resources.getResourceAsStream("SqlMapperConfig.xml");

        //2.建立SqlSessionFactory工廠

        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();

        SqlSessionFactory factory=builder.build(in);

        //3.使用工廠生產SqlSession物件

        sqlSession=factory.openSession();

        //4.使用SqlSession建立dao介面的代理物件

        AccountDaoImpl=sqlSession.getMapper(AccountDao.class);

    }

    @After

    public void destroy() throws IOException {

        //提交事務

        sqlSession.commit();

        //6.釋放資源

        sqlSession.close();

        in.close();

    }



    /**

     * 查詢所有

     * @throws IOException

     */

    @Test

    public void findall() throws IOException {



        //5.使用代理物件執行方法

        List<Account> account=AccountDaoImpl.findAll();

        for(Account a:account){

            System.out.println(a);

            System.out.println(a.getUsers());

        }



    }

    /**

     * 查詢使用者的所有訂單

     * @throws IOException

     */

    @Test

    public void find() throws IOException {



        //5.使用代理物件執行方法

        List<UsersAccount> ua=AccountDaoImpl.find();

        for(UsersAccount a:ua){

            System.out.println(a);

        }



    }



}

&n