1.1 参数输入类型
简单类型
Java简单类型(9种:8种基本+String)

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

POJO包装类型
包装类型:就是在实体类中包含了其它的实体类。
package cn.guardwhy.domain;
/**
* 包装类
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class QueryVo {
private User user; // 包含用户对象
private String start; // 开始日期
private String end; // 结束日期
}
1.2 多条件查询
UserMapper
// 使用POJO包装类型,根据用户名称模糊查询用户
List<User> findUsersByCondition(QueryVo queryVo);
UserMapper.xml
<!--
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>
1.2.1 测试代码
- 创建封装条件的对象QueryVo
- 创建user实体类,设置用户名为"大",设置user为QueryVo的属性
- 设置开始日期和结束日期,为1980-1-1到1993-1-1之间出生的。
- 将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);
}
1.3 resultType输出类型
输出结果resultType的两种类型
- 简单类型:8种基本类型+String类型
- POJO实体类型
UserMapper
// 统计用户表中某种性别的数量
int getAmountBySex(String sex);
UserMapper.xml
统计用户表中的女生的用户数量
<!--统计用户表中某种性别的数量-->
<select id="getAmountBySex" resultType="int" parameterType="String" >
select count(*) from user where sex=#{sex};
</select>
1.3.1 测试代码
// 统计用户表某种性别的数量
@Test
public void testGetAmountBySex(){
int amount = userMapper.getAmountBySex("女");
System.out.println("女生的数量:" + amount);
}
1.4 resultMap输出映射
修改表结构
-- 复制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;
查询结果

1.4.1 用户实体类
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;
}
UserMapper
// 8.通过id查询用户
User findUser2ById(Integer id);
UserMapper.xml
<!--通过id查询user2表-->
<select id="findUser2ById" resultType="user" parameterType="int">
select * from user2 where id = #{id}
</select>
查询结果(属性与列表不匹配)

1.4.2 解决方法
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>
查询结果

使用resultMap实现
resultMap用于配置sql语句中字段(列)的名称,与java对象中属性名称的对应关系。本质上还是要把执行结果映射到java对象上。
- 定义一个映射关系,指定它的id。
- 在查询的时候,将查询的结果指定为上面定义的映射。
UserMapper.xml
- 定义映射,指定id和type,type为实体类的别名。
- id标签:映射主键字段,如果列名与属性名相同可以省略。
- result标签:映射普通字段,指定哪个属性对应哪个列,这里只需映射username即可。
- 在查询的结果中使用resultMap,为上面的映射id。
<!--
结果集映射
1. 定义映射 id: 映射的名字 type:实体类
-->
<resultMap id="userMap" type="user">
<!--id表示定义主键列 property: 实体类中属性名 column: 表中主键列 -->
<id property="id" column="id"/>
<!--
column数据库中的字段,property实体类中的属性
-->
<result property="username" column="user_name"/>
</resultMap>
<!-- 2.通过id查询user2表-->
<select id="findUser2ById" resultMap="userMap" parameterType="int">
select * from user2 where id = #{id}
</select>
1.4.3 测试代码
//通过id查询1个用户
@Test
public void testFindUser2ById(){
User user = userMapper.findUser2ById(1);
System.out.println(user);
}
1.4.4 查询结果

1.4.5 映射流程
总结:
- resultMap元素是Mybatis中的最强大元素。
- ResultMap的设计思想,对于简单的语句根本不需要配置显示的结果映射,而对于复杂一点的语句只需要描述他们的关系就行了。

版权声明:本文为hxy1625309592原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。