Mybatis参数深入
1.1 什么是输入与输出参数
- 输入参数:parameterType,对应方法的形参。
- 输出参数:resultType,表示方法的返回值类型。
1.2 ParameterType输入参数
1.2.1 java简单类型(小结)
1.接口:接口方法参数是简单类型:基本类型、包装类型、String类型
2.映射
3. 关于输入参数的其它写法
parameterType="int" 参数类型写法,类型写法不区分大小写
int
_int
integer
Integer
java.lang.Integerint_,不可以
1.2.2 POJO类型
- pojo(Plain Ordinary java Object) :简单的java对象,实际就是普通javaBean
- 方法参数除了是简单类型外,也可以是对象类型。
1.2.3 pojo包装类型
- pojo包装类型就是指:一个对象里面又包含了另外一个对象。
- 查询需求:按照姓名、生日的范围查询。
- 分析:
- 新建一个对象QueryVo,封装所有的查询条件。
- 接口方法中根据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<=#{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 批量转译:
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类型
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();
}
}