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映射文件
- 使用POJO包装类型,根据用户名称模糊查询用户
- 在核心配置文件中已经定义了类的别名
- 占位符使用 ‘%${user.username}%’,user是QueryVo中的属性
- 占位符使用#{start}和#{end}
- 分别使用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 测试代码
- 创建封装条件的对象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);
}
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映射文件
- 定义映射,指定id和type,type为实体类的别名。
- id标签:映射主键字段,如果列名与属性名相同可以省略。
- result标签:映射普通字段,指定哪个属性对应哪个列,这里只需映射username即可。
- 在查询的结果中使用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);
}