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);

        }

    }

}

Mybatis学习笔记之---多表查询(1)的更多相关文章

  1. MyBatis学习总结——实现关联表查询(转)

    原文链接:孤傲苍狼 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关 ...

  2. mybatis学习 十二 多表查询

    Mybatis 实现多表查询方式: (1)业务装配.对两个表编写单表查询语句,在业务(Service)把查询的两个结果进行关联. (2)使用Auto Mapping特性,在实现两表联合查询时通过别名完 ...

  3. Oracle学习笔记_04_多表查询

    一.概念: 1.多表连接有以下几种分法: (1)内连接           vs          外连接 (左.右.满) (2)等值连接        vs         不等值连接 (3)非自连 ...

  4. MySQL数据库学习笔记----MySQL多表查询之外键、表连接、子查询、索引

    本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...

  5. MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)

    mysql> create table test5( -> id int, ) -> )engine myisam charset utf8; Query OK, rows affe ...

  6. Mybatis学习——一对多关联表查询

    1.实体类 public class Student { private int id; private String name; } public class Classes { private i ...

  7. mysql学习笔记--数据库多表查询

    一.内连接[inner join] 1. 语法一:select 列名 from 表1 inner join 表2 on 表1.公共字段=表2.公共字段 2. 语法二:select 列名 from 表1 ...

  8. mysql学习笔记--数据库单表查询

    一.查询语句 1.  select [选项] 列名 [from 表名]  [where 条件]  [order by 排序]  [group by 分组]  [having 条件]  [limit 限 ...

  9. MySql cmd下的学习笔记 —— 有关多表查询的操作(多表查询练习题及union操作)

    先建立一张 m 表 mysql> create table m ( -> mid int, -> hid int, -> gid int, ), -> matime da ...

  10. mybatis学习笔记(10)-一对一查询

    mybatis学习笔记(10)-一对一查询 标签: mybatis mybatis学习笔记10-一对一查询 resultType实现 resultMap实现 resultType和resultMap实 ...

随机推荐

  1. Python 获得对象内存占用内存大小 sys.getsizeof

    from sys import getsizeof class A(object): pass class B: pass for x in (None, 1, 1L, 1.2, 'c', [], ( ...

  2. Hadoop设置环境变量注意事项

    路径是/etc/profile. 这个东西不能再普通下设置,打开是彩色的,即便是“:wq!”也不能保存,必须去root下,黑白的. 然后root下source /etc/profile,然后exit, ...

  3. document获取节点byId&amp;byName

    <script type="text/javascript"> /* *需要:获取页面中的DIV节点: *思路: *通过docment对象完成.因为div节点有ID属性 ...

  4. MySQL一些常用的时间函数

    https://my.oschina.net/sallency/blog/470370

  5. 20170109| javascript记录

    1.时间戳的使用: 在php中的时间戳是以秒为单位的,在js中转换过来的时间戳是以毫秒为单位的.当我们使用js和php同时开发的时候,就需要保证它们都是处于同一时间单位下才好进行相关的计算. 首先说一 ...

  6. 【vue】vue中ref用法

    1.获取当前元素: 例子: <div class="pop pos-a" :style="{ left: pop_x + 'px' ,top: pop_y + 'p ...

  7. 转:upload.parseRequest为空

    上传是items一直是空list.导致原因是struts2把原始的原来S2为简化上传功能,把所有的enctype="multipart/form-data"表单做了wrapper最 ...

  8. _skill,_skill_category

    _skill,_skill_category -- 自定义商业技能-- 小技巧:配合增加自定义商业技能._add skill [ID _skill `skillId`商业技能ID `skillIcon ...

  9. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之存储模型

    1.前言 关于存储系统体系架构,可以概述如下: 存储系统体系结构的形式 VMSA 存储属性   2. 存储系统体系结构 2.1.    地址空间 指令地址空间溢出 指令地址计算((address_of ...

  10. request.GetResponse()超时的解决办法

    var request = (HttpWebRequest)WebRequest.Create(url); request.Timeout = Timeout.Infinite; request.Ke ...