Mybatis學習筆記之---多表查詢(1)
阿新 • • 發佈:2019-08-14
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&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