java之 Mybatis(二)

0x01、parameterType深入

3.1传递简单类型

​ 基本的类型,字符串

​ 直接写#{任意字符串}或者'${value}'

1535099951604

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 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.小结

  1. 输出简单类型 直接写 java类型名 eg: int

  2. 输出pojo对象 直接写 pojo类型名 eg: User

  3. 输出pojo列表类型 写 列表里面的泛型的类型 eg: List 写User

  4. ResultMap

    • 解决查询出来的结果的列名和javaBean属性不一致的请求
posted @ 2021-01-26 21:40  0X7e  阅读(60)  评论(0编辑  收藏  举报