文章目录
3. Mybaits的参数深入 总览
参考狂神说MyBatis课程笔记
参考黑马程序员MyBaits课程笔记
MyBatis笔记思维导图:
问题扩展与汇总:
1. parameterType 配置参数
基本类型,引用类型(例如:String 类型)
-
可以直接写类型名称,包名类名可以不写
-
mybaits 在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名
实体类类型(POJO 类)
- 实体类默认没有注册别名,所以必须写全限定类名
- 今后可以在xml配置文件中或在SpringBoot框架中的配置文件中注册别名
实体类的包装类(传递 pojo 包装对象 )
- 开发中通过 pojo 传递查询条件 ,查询条件是综合的查询条件,
- 不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。
- 包装类中包含 pojo。
需求:根据用户名模糊查询到用户信息,查询条件放到 QueryVo 的 user 属性中。
代码实现
-
创建封装User用户信息的QueryUser类
package com.sheng.entity; public class QueryUser { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
-
在接口中定义查询方法
public interface QueryUserMapper { // 根据QueryVo中的条件查询用户 List<User> findByVo(QueryVo vo);
-
配置文件sql注入
- 注意:返回类型和参数类型,对应的属性名默认是参数里的,要明确指定属性中的属性
- parameterType=“com.sheng.entity.QueryVo”>
- #{user.username},等价于QueryVo.user.username
<!-- 根据用户名称模糊查询,参数变成一个 QueryVo 对象了 --> <select id="getUserByVo" resultType="com.sheng.entity.User" parameterType="com.sheng.entity.QueryVo"> select <include refid="selectFields"></include> from mybatis2.user where username like #{user.username}; </select>
-
测试
// 测试使用包装类查询 @Test public void testGetUserByVo() { QueryVo vo = new QueryVo(); User user = new User(); user.setUsername("%王%"); vo.setUser(user); List<User> users = userMapper.getUserByVo(vo); for(User u : users) { System.out.println(u); } }
2. Mybatis 的输出结果封装
resultType 配置结果类型
- 属性可以指定结果集的类型,它支持基本类型和实体类类型。
- 注意,它和 parameterType 一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须
使用全限定类名。 - 同时,当是实体类名称是,还有一个要求,没有进行配置时,默认状态下,
- 实体类中的属性名称必须和查询语句中的列名保持一致,否则无法实现封装。
解决方案一:
-
为列名指定别名 , 别名和java实体类的属性名一致
-
将实体类中属性名称修改与数据库字段名不同
// 原属性名为sax,改为gender private String gender;
-
在xml配置文件中,将sex起个别名,sex as gender
<!-- 查询所有用户--> <select id="getUserList" resultType="com.sheng.entity.User"> select id, username, birthday, sex as gender, address from mybatis2.user </select>
- 如果很多属性名称都不一致,都使用别名的话写起来比较麻烦,此种情况需要解决方案二
-
resultMap 结果类型
解决方案二:
- resultMap 标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装。
- 在 select 标签中使用 resultMap 属性指定引用即可。
- 同时 resultMap 可以实现将查询结果映射为复杂类型的 pojo,
- 比如在查询结果映射对象中包括 pojo 和 list 实现一对一查询和一对多查询。
定义 resultMap
- id 属性:id=“userMap”,给定一个唯一标识,是给查询 select 标签引用用的
- type 属性:指定实体类的全限定类名
- id 标签:用于指定主键字段
- result 标签:用于指定非主键字段
- column 属性:用于指定数据库列名
- property 属性:用于指定实体类属性名称
<resultMap id="userMap" type="com.sheng.entity.User">
<!-- id为主键 -->
<id column="id" property="userId"/>
<!-- column是数据库表的列名 , property是对应实体类的属性名 -->
<result column="username" property="username"/>
<result column="sex" property="gender"/>
<result column="address" property="address"/>
<result column="birthday" property="birthday"/>
</resultMap>
映射文件配置使用
- 返回类型为resultMap,将返回结果进行封装
<!-- 查询所有用户-->
<select id="getUserList" resultMap="userMap">
select <include refid="selectFields"></include>
from mybatis2.user
</select>