Mybatis中参数和返回值的了解

往期内容,如下
一、MyBatis简介
二、MyBatis环境搭建
三、MyBatis入门案例
四、MyBatis自定义
五、MyBatis CRUD操作

以下内容基于MyBatis CRUD操作中的代码
目录如下:
在这里插入图片描述

parameterType配置参数

这里我们来回顾以下OGNL表达式
OGNL是通过对象的取值方法来获取数据,在写法上表现为get省略掉
比如我们获取用户名:

  • 类中的写法为:User.getUsername();
  • OGNL表达式写法:user.username

那么Mybatis中为什么可以直接写username呢,而不用写成user.username

  • 原因是parameterType已经提供了属性的类,所以不需要写对象名

在实际的开发中,查询条件是复杂和综合的,一般我们都是直接封装成一个查询条件的类对象

模拟操作一下
IUserDao接口定义以下代码:

    /**
     * 根据queryVo中的条件查询用户
     * @param vo
     * @return
     */
    List<User> findUserByVo(QueryVo vo);

domian包中创建QueryVo.java

package com.itheima.domain;

public class QueryVo {

    private User user;

    public User getUser() {
        return user;
    }

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

IUserDao.xml配置查询条件

    <!-- 根据queryVo的条件查询用户 -->
    <select id="findUserByVo" parameterType="com.itheima.domain.QueryVo" resultType="com.itheima.domain.User">
        select * from user where username like #{user.username}
    </select>

编写测试方法

    /**
     * 测试使用QueryVo作为查询条件
     */
    @Test
    public void testFindByVo(){
        QueryVo vo = new QueryVo();
        User user = new User();
        user.setUserName("%王%");
        vo.setUser(user);
        //5.执行查询一个方法
        List<User> users = userDao.findUserByVo(vo);
        for(User u : users){
            System.out.println(u);
        }
    }
}

resultMap(结果类型)

上面的CRUD操作都是要求数据库的列名和实体类保持一致,以下内容举例说明不一致的时候应该如何修改代码。

首先需要修改实体类User.java

package com.itheima.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {

    private Integer userId;
    private String userName;
    private String userAddress;
    private String userSex;
    private Date userBirthday;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }

    public String getUserSex() {
        return userSex;
    }

    public void setUserSex(String userSex) {
        this.userSex = userSex;
    }

    public Date getUserBirthday() {
        return userBirthday;
    }

    public void setUserBirthday(Date userBirthday) {
        this.userBirthday = userBirthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", userAddress='" + userAddress + '\'' +
                ", userSex='" + userSex + '\'' +
                ", userBirthday=" + userBirthday +
                '}';
    }
}

还需要修改Mybatis.java的测试方法调用到User类的get/set方法的地方,这就不再演示了

还有两个错误的地方需要修改:

  • IUserDao.xml中的ketProperty属性
  • IUserDao.xml中的OGNL表达式
保存操作,修改IUserDao.xml

主要修改keyProperty和OGNL表达式

    <!-- 保存用户 -->
    <insert id="saveUser" parameterType="com.itheima.domain.User">
        <!-- 配置插入操作后,获取插入数据的id -->
        <selectKey keyProperty="userId" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user(username,address,sex,birthday)values(#{userName},#{userAddress},#{userSex},#{userBirthday});
    </insert>
查询所有操作,修改IUserDao.xml

再还未修改前运行以下,会发现除了userName属性以前,全部都封装不进去,这是因为Mysqlwindows环境下不区分大小写,但是再Liunx会区分大小写

第一种解决方法:起别名
IUserDao.xml

    <!-- 查询所有 -->
    <select id="findAll" resultType="com.itheima.domain.User">
        select id as userId,username as userName,address as userAddress,sex as userSex,birthday as userBirthday from user;
    </select>

这种方法的执行效率是最快的,因为他是在MySQL层面上进行执行的,不过Mybatis还提供另一种方法

第二种解决方法:配置查询结果的列名和实体类的属性名的对应关系

IUserDao.xml

    <resultMap id="userMap" type="com.itheima.domain.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>
    
    <!-- 查询所有 使用resultMap,值为上面的id值-->
    <select id="findAll" resultMap="com.itheima.domain.User">
        select * from user;
    </select>

所有的方法有用到映射的,resultType都要改为resultMap,这种方法显然比不上起别名,但是这种方法减少了代码量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值