Mybatis参数深入

1.1 什么是输入与输出参数

Mybatis参数深入

  •  输入参数:parameterType,对应方法的形参
  • 输出参数:resultType,表示方法的返回值类型

 1.2 ParameterType输入参数

1.2.1 java简单类型(小结)

1.接口:接口方法参数是简单类型:基本类型、包装类型、String类型

Mybatis参数深入

 2.映射

Mybatis参数深入

3. 关于输入参数的其它写法

 parameterType="int" 参数类型写法,类型写法不区分大小写
                int
                _int
                integer
                Integer
                java.lang.Integer

                int_,不可以


1.2.2 POJO类型

  • pojo(Plain Ordinary java Object) :简单的java对象,实际就是普通javaBean
  • 方法参数除了是简单类型外,也可以是对象类型。

Mybatis参数深入 Mybatis参数深入

 


1.2.3 pojo包装类型

  • pojo包装类型就是指:一个对象里面又包含了另外一个对象。
  • 查询需求:按照姓名、生日的范围查询。
  • 分析:
  1. 新建一个对象QueryVo,封装所有的查询条件。
  2. 接口方法中根据QueryVo作为输入参数进行查询。

<!--
        根据条件POJO的包装类型QueryVO查询
            特殊字符,需要使用转义方式
                一个一个转义
                推荐做法:将一个区域里面的所有特殊字符批量转义:<![CDATA[数据]]>
    -->
 <!--   <select id="findByCondition" resultType="com.sunny.entity.User" parameterType="com.sunny.entity.QueryVO">
        select * from user where username like #{user.username} and birthday>=#{start} and birthday&lt;=#{end}
    </select>--> 

  •  queryVO
package com.sunny.entity;

import java.util.Date;

/**
 * 用于包装查询条件
 * QueryVO就是POJO的包装类型:一个类型里面包含了另外一个类型
 */
public class QueryVO {
    private User user;//封装用户的所有条件了
    private Date start;//最小日期
    private Date end;//最大日期

    public QueryVO() {
    }

    public QueryVO(User user, Date start, Date end) {
        this.user = user;
        this.start = start;
        this.end = end;
    }

    public User getUser() {
        return user;
    }

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

    public Date getStart() {
        return start;
    }

    public void setStart(Date start) {
        this.start = start;
    }

    public Date getEnd() {
        return end;
    }

    public void setEnd(Date end) {
        this.end = end;
    }
}
  •  dao接口添加查询方法
package com.sunny.dao;

import com.sunny.entity.QueryVO;
import com.sunny.entity.User;

import java.util.List;

public interface IUserDao {
    //根据QUeryVO多个条件查询用户列表
    List<User> findByCondition(QueryVO queryVO);
}
  •  接口映射

    <!--根据QUeryVO多个条件查询用户列表-->
    <select id="findByCondition" resultType="com.sunny.entity.User" parameterType="com.sunny.entity.QueryVO">
             <![CDATA[
select * from user where username like #{user.username} and birthday>=#{start} and birthday<=#{end}
        ]]>
    </select>
  • 测试
import com.sunny.dao.IUserDao;
import com.sunny.entity.QueryVO;
import com.sunny.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class UserDaoTest {

    InputStream in = null;

    SqlSession sqlSession = null;

    @Before
    public void before() throws IOException {
        //1.获取文件输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSession工厂构造器
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //3.根据SqlSession工厂构造器创建SqlSession工厂
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
        //4.根据SqlSession工厂创建SqlSession
        sqlSession = sqlSessionFactory.openSession();
    }

    /**
     * 使用POJO包装类型QueryVO多条件查询用户列表
     */
    @Test
    public void findByCondition() throws ParseException {
        //创建接口代理对象
        IUserDao userDao = sqlSession.getMapper(IUserDao.class);
        //封装QueryVO
        QueryVO queryVO  = new QueryVO();
        //封装User对象
        User user = new User();
        user.setUsername("%梅%");
        queryVO.setUser(user);
        //start
        queryVO.setStart(new SimpleDateFormat("yyyy-MM-dd").parse("1994-01-01"));
        //end
        queryVO.setEnd(new SimpleDateFormat("yyyy-MM-dd").parse("2018-10-16"));

        //使用POJO包装类型QueryVO多条件查询用户列表
        System.out.println(userDao.findByCondition(queryVO));
    }


    @After
    public void after() throws IOException {
        //手动提交事务
        sqlSession.commit();
        //关闭资源
        sqlSession.close();
        in.close();
    }
}
  • CDATA 批量转译:

Mybatis参数深入


1.3 resultType输出参数

  • java简单类型作为输出参数
  • dao接口
package com.sunny.dao;

import com.sunny.entity.QueryVO;
import com.sunny.entity.User;

import java.util.List;

public interface IUserDao {

    //查询总记录数
    int count();

}
  • 映射
 <!--查询总记录数,输出参数返回简单数据类型-->
    <select id="count" resultType="java.lang.Integer">
      SELECT count(*) FROM USER
    </select>
  • 测试
import com.sunny.dao.IUserDao;
import com.sunny.entity.QueryVO;
import com.sunny.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class UserDaoTest {

    InputStream in = null;

    SqlSession sqlSession = null;

    @Before
    public void before() throws IOException {
        //1.获取文件输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSession工厂构造器
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //3.根据SqlSession工厂构造器创建SqlSession工厂
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
        //4.根据SqlSession工厂创建SqlSession
        sqlSession = sqlSessionFactory.openSession();
    }
    /**
     * 查询总记录数,输出参数返回简单数据类型
     */
    @Test
    public void count() throws ParseException {
        //创建接口代理对象
        IUserDao userDao = sqlSession.getMapper(IUserDao.class);
        //封装QueryVo
        QueryVO queryVO = new QueryVO();
        //封装User对象
        User user = new User();
        user.setUsername("%李%");
        queryVO.setUser(user);
        //start
        queryVO.setStart(new SimpleDateFormat("yyyy-MM-dd").parse("1994-01-01"));
        //end
        queryVO.setEnd(new SimpleDateFormat("yyyy-MM-dd").parse("2018-10-16"));

        //获取总记录数
        System.out.println("获取总记录数为:"+userDao.count());
    }


    @After
    public void after() throws IOException {
        //手动提交事务
        sqlSession.commit();
        //关闭资源
        sqlSession.close();
        in.close();
    }
}

1.3.2 POJO类型

 Mybatis参数深入

 1.4 resultMap输出参数

  • resultType指定方法返回对象(POJO类型)
  • 前面通过resultType作为输出参数,可以把查询的结果,自动封装为对象。但是有要求:数据库中的列名称,要与对象的属性一致。否则,不能正确封装数据。此时,可以使用resultMap解决:设置列与属性的映射关系,从而解决列与属性不一致的时候不能正确封装数据的问题
  •    <!--
            查询所有用户列表
                由于数据库字段名与属性名不一样了,使用resultType类型封装数据是封装不了的,使用resultMap
            resultMap用于建立数据库字段名称与对象属性的映射
                type:用于设置对象类型
                id:数据库表主键字段映射
                    column:代表数据库表字段名称
                    property:对象类型里面的属性名
        -->
  • 接口
package com.sunny.dao;

import com.sunny.entity.QueryVO;
import com.sunny.entity.User;

import java.util.List;

public interface IUserDao {
    //查找所有的用户列表
    List<User> findAllUser();

}

 

  • 映射 
<!--
        查询全部,使用resultMap建立:列与属性的映射关系
        resultMap  建立列与属性的映射关系
           id="userResultMap"  需要与select中引用的resultMap名称一致
           type                要封装的对象的类型
    -->
    <resultMap id="userMap" type="com.sunny.entity.User">
        <!--建立对象的唯一标记与表的主键映射关系-->
        <id column="_id" property="id"></id>
        <!--建立对象的其他属性与表的非主键字段的映射关系-->
        <result column="_username" property="username"></result>
        <result column="_birthday" property="birthday"></result>
        <result column="_sex" property="sex"></result>
        <result column="_address" property="address"></result>
    </resultMap>
    <select id="findAllUser" resultMap="userMap">
        SELECT id _id,username _username,birthday _birthday,sex _sex,address _address FROM USER
    </select>
  • 测试
import com.sunny.dao.IUserDao;
import com.sunny.entity.QueryVO;
import com.sunny.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class UserDaoTest {

    InputStream in = null;

    SqlSession sqlSession = null;

    @Before
    public void before() throws IOException {
        //1.获取文件输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSession工厂构造器
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //3.根据SqlSession工厂构造器创建SqlSession工厂
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
        //4.根据SqlSession工厂创建SqlSession
        sqlSession = sqlSessionFactory.openSession();
    }

    /**
     * 获取所有用户列表
     */
    @Test
    public void findAllUser(){
        //创建接口代理对象
        IUserDao userDao = sqlSession.getMapper(IUserDao.class);
        userDao.findAllUser().forEach(System.out::println);
    }


    @After
    public void after() throws IOException {
        //手动提交事务
        sqlSession.commit();
        //关闭资源
        sqlSession.close();
        in.close();
    }
}