参数深入
1. ParameterType(输入类型)
1.1 通过ParameterType传递Pojo对象
Mybatis 使用 ognl 表达式解析对象字段的值
ognl 表达式
object graphic navigation language
对象 图 导航 语言
通过对象的取值方法(属性的get方法)来获取数据,在写法上把get给省略了。
eg:获取用户的名称属性
类中的写法:user.getUsername();
ognl表达式:user.username
mybatis中为什么能直接写username,而不用user.呢,因为在parameterType中已经提供了属性所属的类,所以此时不需要写对象名,直接写属性名即可
1.2 多个对象组成一个查询条件(通过ParameterType传递Pojo包装对象)
- 首先将查询条件所用到的多个实体类封装到查询类
QueryVo
中
- 在Dao中加入查询方法,将查询类作为输入参数
- 在mapper中创建对应的查询标签
- 测试类中创建测试方法
2. ResultType(输出类型)
2.1 怪异的现象
实体类属性如下
数据库字段如下
查询语句如下
查询结果如下
我日???????,实体类属性和数据库字段不是不对应么,userName竟然有值??????
原来,Mysql数据库在windows系统下不区分大小写
,但是,Mysql数据库在Linux系统下严格区分大小写
2.2 解决实体类属性与数据表字段的对应关系
2.2.1 背景
当ResultType的值为pojo对象,数据库在返回查询结果时需要将数据表各个字段的值封装进pojo对象中(注意:是数据库进行封装
),此时,若属性名与字段名不匹配,就会出现字段值无法封装进pojo对象的属性中导致pojo对象属性为null
的现象
2.2.2 在Sql语句层面上解决
2.2.3 在Mybatis层面上解决
type是指查询结果实体类的全限定类名
2.2.4 总结
不同的解决方案通过不同的场景进行选择
解决方法 | 运行效率 | 开发效率 |
---|---|---|
Sql别名 | 高 | 低 |
resultMap标签 | 低 | 高 |