java之 Mybatis(二)
0x01、parameterType深入
3.1传递简单类型
基本的类型,字符串
直接写#{任意字符串}
或者'${value}'
3.2传递 pojo 对象 或者 Map
Mybatis 使用 ognl 表达式解析对象字段的值, #{}或者'${}'括号中的值为 pojo 属性名称或者Map的key。
3.3传递 pojo 包装对象类型
开发中通过 pojo 传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。Pojo 类中包含 pojo。
京东查询的例子:
需求:根据用户id查询用户信息,查询条件放到 QueryVo 的 user 属性中。
- QueryVo
@Data
public class QueryBean {
private User user;
}
- UserDao接口
public interface UserDao {
/**
* 复杂参数查询
* @return
*/
List<User> findByQueryBean(QueryBean queryBean);
}
- UserDao.xml文件
<mapper namespace="com.itheima.dao.UserDao">
<select id="findByQueryBean" resultType="com.itheima.pojo.User" parameterType="com.itheima.pojo.queryBean">
SELECT * FROM t_user WHERE username > #{user.username}
</select>
</mapper>
- 测试代码
@Test
public void test04(){
//使用POJO的包装类作为参数
SqlSession sqlSession = SqlSessionFactoryUtils.openSession();
//获取LinkManDao的代理对象
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = new user();
linkMan.setUSername("李");
List<User> userList = userDao.query(new QueryBean(user));
for (User user : userList) {
System.out.println(user);
}
//提交事务关闭资源
SqlSessionFactoryUtils.commitAndClose(sqlSession);
}
0x02、resultType深入
2.1输出简单类型
直接写对应的Java类型. eg: 返回int
<select id="findCount" parameterType="int" resultType="int">
SELECT COUNT(*) FROM t_user
</select>
2.2输出pojo对象(一个pojo对象就对应一行数据)或者一个Map
直接写当前pojo类的全限定名 eg: 返回User
<select id="findByUid" parameterType="int" resultType="com.itheima.bean.User">
select * from t_user where uid = #{uid}
</select>
2.3输出pojo列表(一个pojo列表就对应多行数据)或者Map的列表
直接写当前pojo类的全限定名 eg: 返回 List
<select id="findAll" resultType="com.itheima.bean.User">
select * from t_user
</select>
2.4resultMap结果类型
resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。(下次课讲)
那我们今天就来看返回的列名与实体类的属性不一致时的情况. 下次课再接着研究复杂的封装(多表查询)
通过改别名的方式,现在返回结果集的列名已经与 User 类的属性名不相同了。
select uid uid_,username username_ ,birthday birthday_ ,sex sex_ ,address address_ from t_user where uid = #{id}
- UserDao.java
public interface UserDao {
/**
* 根据uid查询
* @param uid
* @return
*/
User findByUid(int uid);
}
- UserDao.xml
<select id="findByUid" parameterType="int" resultMap="findByUidMap">
select uid uid_,username username_ ,birthday birthday_ ,sex sex_ ,address address_ from t_user where uid = #{id}
</select>
<resultMap id="findByUidMap" type="com.itheima.bean.User">
<id property="uid" column="uid_"></id>
<result property="username" column="username_"></result>
<result property="birthday" column="birthday_"></result>
<result property="sex" column="sex_"></result>
<result property="address" column="address_"></result>
</resultMap>
<!--
id:此属性表示查询结果集的唯一标识,非常重要。如果是多个字段为复合唯一约束则定义多个id。
type: 当前resultMap封装后返回的结果
property:表示 User 类的属性。
column:表示 sql 查询出来的字段名。(column 和 property 放在一块儿表示将 sql 查询出来的字段映射到指定的 pojo 类属性上。)
-->
4.小结
-
输出简单类型 直接写
java类型名
eg: int -
输出pojo对象 直接写
pojo类型名
eg: User -
输出pojo列表类型 写
列表里面的泛型的类型
eg: List写User -
ResultMap
- 解决查询出来的结果的列名和javaBean属性不一致的请求