MyBatis笔记03 参数与结果封装
coconutnut

https://www.bilibili.com/video/av47952553
p28~29

参数

输入类型可以是:

  • 简单类型

  • pojo对象

    使用OGNL表达式解析对象字段的值,#{}或${}括号中的值为pojo属性名称

  • pojo包装对象

    把实体类包装起来,进行条件查询

OGNL表达式

Object Graphic Navigation Language

通过对象的取值方法来获取数据,省略get

如获取用户名,类中的写法:user.getUsername()

OGNL表达式写法:user.username

MyBatis中,由于parameterType中已经提供了属性所属的类,可以直接写username,不需要写对象名

条件查询例

通过QueryVo设置查询条件

1
2
3
4
5
6
7
8
9
10
11
12
13
public class QueryVo {

private User user;

public User getUser() {
return user;
}

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

此时用username就需要加对象名

1
2
3
4
<!-- 根据queryVo的条件查询用户 -->
<select id="findUserByVo" parameterType="com.itheima.domain.QueryVo" resultMap="userMap">
select * from user where username like #{user.username}
</select>
1
2
3
4
5
6
7
8
@Test
public void testFindByVo(){
QueryVo vo = new QueryVo();
User user = new User();
user.setUserName("%王%");
vo.setUser(user);
List<User> users = userDao.findUserByVo(vo);
}

结果封装

resultType可以是:

  • 简单类型
  • pojo对象
  • pojo列表

名称对应

如果本来属性名全是小写,数据库中也全是小写,可以正常执行

把属性名从全小写改成山峰,如userid改成userId,username改成userName,运行查所有

可能只有userName的值查出来了

因为windows系统下mysql不区分大小写

但是linux系统下区分

解决方法

  1. 取别名
1
select id as userId,username as userName,address as userAddress,sex as userSex,birthday as userBirthday from user

在sql语句层面解决问题,执行效率高

  1. MyBatis配置
1
2
3
4
5
6
7
8
9
10
<!-- 配置 查询结果的列名和实体类的属性名的对应关系 -->
<resultMap id="userMap" type="uSeR">
<!-- 主键字段的对应 -->
<id property="userId" column="id"></id>
<!--非主键字段的对应-->
<result property="userName" column="username"></result>
<result property="userAddress" column="address"></result>
<result property="userSex" column="sex"></result>
<result property="userBirthday" column="birthday"></result>
</resultMap>

此时resultType要改成resultMap,说明使用userMap解析结果封装

1
2
3
4
<select id="findAll" resultMap="userMap">
<!--select id as userId,username as userName,address as userAddress,sex as userSex,birthday as userBirthday from user;-->
select * from user;
</select>

开发效率高些