04- Mybatis_Multitable

7.1 参数输入类型

7.1.1 简单类型

Java简单类型(9种:8种基本+String)

7.1.2 POJO类型

POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBean,即我们前面封装数据使用的实体类。

7.1.3 POJO包装类型

包装类型:就是在实体类中包含了其它的实体类。

package cn.guardwhy.domain;
/**
 * 包装类
 */
public class QueryVo {
    
    
    private User user; // 包含用户对象
    private String start; // 开始日期
    private String end; // 结束日期

    public User getUser() {
    
    
        return user;
    }

    public void setUser(User user) {
    
    
        this.user = user;
    }

    public String getStart() {
    
    
        return start;
    }

    public void setStart(String start) {
    
    
        this.start = start;
    }

    public String getEnd() {
    
    
        return end;
    }

    public void setEnd(String end) {
    
    
        this.end = end;
    }
}

7.2 多条件查询

7.2.1 mapper接口方法

// 6.使用POJO包装类型,根据用户名称模糊查询用户
List<User> findUsersByCondition(QueryVo queryVo);

7.2.2 配置mapper映射文件

  1. 使用POJO包装类型,根据用户名称模糊查询用户
  2. 在核心配置文件中已经定义了类的别名
  3. 占位符使用 ‘%${user.username}%’,user是QueryVo中的属性
  4. 占位符使用#{start}和#{end}
  5. 分别使用between和小于大于编写SQL语句
<select id="findUsersByCondition" parameterType="queryVo" resultType="user">
    select * from user where username like '%${user.username}%' and birthday 
    between #{start} and #{end}
</select>

7.2.3 测试代码

  1. 创建封装条件的对象QueryVo
  2. 创建user实体类,设置用户名为"精",设置user为QueryVo的属性
  3. 设置开始日期和结束日期,为1980-1-1到1993-1-1之间出生的。
  4. 将QueryVo对象做为查询条件
// POJO多条件查询
@Test
public void testFindUsersByCondition(){
    
    
    QueryVo queryVo = new QueryVo();
    User user = new User();
    user.setUsername("大");
    queryVo.setUser(user);

    queryVo.setStart("1980-1-1");
    queryVo.setEnd("1993-1-1");
    List<User> userList = userMapper.findUsersByCondition(queryVo);
    userList.forEach(System.out::println);
}

7.3 resultType输出类型

输出结果resultType的两种类型

  • 简单类型:8种基本类型+String类型
  • POJO实体类型

7.3.1 mapper接口方法

 // 7.统计用户表中某种性别的数量
 int getAmountBySex(String sex);

7.3.2 配置mapper映射文件

统计用户表中的女生的用户数量

<!--统计用户表中某种性别的数量-->
<select id="getAmountBySex" resultType="int" parameterType="String" >
    select count(*) from user where sex=#{sex};
</select>

7.3.3 测试代码

// 统计用户表某种性别的数量
@Test
public void testGetAmountBySex(){
    
    
    int amount = userMapper.getAmountBySex("女");
    System.out.println("女生的数量:" + amount);
}

7.4 resultMap输出映射

7.4.1 修改表结构

-- 复制user为user2新表,新复制的表没有主键约束,没有自增
create table user2 select * from user;

-- 添加主键约束
alter table user2 add primary key (id);

-- 增加自增功能
alter table user2 modify id int auto_increment;

-- 从100开始自增
alter table user2 auto_increment = 100;

-- 修改用户表结构,将用户名字段由username改成user_name
alter table user2 change username user_name varchar(20);

select * from user2;

7.4.2 查询结果

7.4.3 用户实体类

package cn.guardwhy.domain;

import java.sql.Date;
/**
 * 用户实体类
*/
@Data
@NoArgsConstructor
@AllArgsConstructor

public class User {
    
    
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
}

7.4.4 mapper接口方法

// 8.通过id查询用户
User findUser2ById(Integer id);

7.4.5 配置mapper映射文件

<!--通过id查询user2表-->
<select id="findUser2ById" resultType="user" parameterType="int">
    select * from user2 where id = #{id}
</select>

7.4.6 查询结果(属性与列表不匹配)

7.5 解决方法

7.5.1 UserMapper.xml(定义别名)

<!--通过id查询user2表-->
<select id="findUser2ById" resultType="user" parameterType="int">
    	<!--在SQL语句中定义别名 as username-->
    select id, user_name as username, birthday,sex, address from user2 where id = #{id}
</select>

7.5.2 查询结果

7.5.3 使用resultMap实现

resultMap用于配置sql语句中字段(列)的名称,与java对象中属性名称的对应关系。本质上还是要把执行结果映射到java对象上。

  • 定义一个映射关系,指定它的id。
  • 在查询的时候,将查询的结果指定为上面定义的映射。

7.5.4 配置mapper映射文件

  1. 定义映射,指定id和type,type为实体类的别名。
  2. id标签:映射主键字段,如果列名与属性名相同可以省略。
  3. result标签:映射普通字段,指定哪个属性对应哪个列,这里只需映射username即可。
  4. 在查询的结果中使用resultMap,为上面的映射id。
<!-- 1. 定义映射 id: 映射的名字 type:实体类 -->
<resultMap id="userMap" type="user">
    <!--id表示定义主键列 property: 实体类中属性名 column: 表中主键列 -->
    <id property="id" column="id"/>
    <!--result 定义普通列和Java实体类中属性对应关系-->
    <result property="username" column="user_name"/>
</resultMap>
<!-- 2.通过id查询user2表-->
<select id="findUser2ById" resultMap="userMap" parameterType="int">
    select * from user2 where id = #{id}
</select>

7.5.5 测试代码

//通过id查询1个用户
@Test
public void testFindUser2ById(){
    
    
    User user = userMapper.findUser2ById(1);
    System.out.println(user);
}

7.5.6 查询结果

7.5.7 映射流程

猜你喜欢

转载自blog.csdn.net/hxy1625309592/article/details/113527256