mybatis笔记-7、输入输出映射

输入映射


Contents


本文主要讲解mybatis的输入映射。

在mapper的子标签中,通过parameterType指定输入参数的类型,类型可以是

  • 简单类型
  • hashmap
  • pojo的包装类型

对于综合查询,建议parameterType使用包装的pojo,有利于系统扩展。

传递pojo的包装对象

需求:完成用户信息的综合查询。需要传入查询条件很复杂(可能包括用户信息、其他信息,比如商品的、订单的)

针对上面需求,建议使用自定义的包装类型pojo。在包装类型的pojo中将复杂的查询条件包装进去

定义包装类型pojo
package com.iot.mybatis.po;

public class UserQueryVo {
    //在这里包装所需要的查询条件

    //用户查询条件
    private UserCustom userCustom;

	getter..settter...
    //装其它的查询条件,订单、商品....

}

其中,UserCustom类继承User
public class UserCustom extends User{
}   
mapper.xml映射文件
<!--在UserMapper.xml中定义用户信息综合查询(查询条件复杂,通过高级查询进行复杂关联查询)。-->
<mapper namespace="cn.incast.mabatis.mapper.UserMapper">
<!-- 用户信息综合查询
        #{userCustom.sex}:取出pojo包装对象中性别值
        ${userCustom.username}:取出pojo包装对象中用户名称
     -->
    <select id="findUserList" parameterType="com.iot.mybatis.po.UserQueryVo"
            resultType="com.iot.mybatis.po.UserCustom">
        SELECT * FROM user WHERE user.sex=#{userCustom.sex} AND user.username LIKE '%${userCustom.username}%'
    </select>
    
如果用的不是userCustom,而是user作为成员,只需要#{sex}即可
mapper.java接口
public interface UserMapper{
	//用户信息综合查询
	public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
UserMapperTest.java测试代码
public class UserMapperTest {  

    private SqlSessionFactory sqlSessionFactory;  
      
    //注解Before是在执行本类所有测试方法之前先调用这个方法  
    @Before  
    public void setup() throws Exception{  
        //创建SqlSessionFactory  
        String resource="SqlMapConfig.xml";  
          
        //将配置文件加载成流  
        InputStream inputStream = Resources.getResourceAsStream(resource);  
        //创建会话工厂,传入mybatis配置文件的信息  
        sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);  
    }  
    
	//用户信息的综合 查询
	@Test
	public void testFindUserList() throws Exception {

		SqlSession sqlSession = sqlSessionFactory.openSession();

		//创建UserMapper对象,mybatis自动生成mapper代理对象
		UserMapper userMapper  sqlSession.getMapper(UserMapper.class);

		//创建包装对象,设置查询条件
		UserQueryVo userQueryVo = new UserQueryVo();
		UserCustom userCustom = new UserCustom();
		//由于这里使用动态sql,如果不设置某个值,条件不会拼接在sql中
		userCustom.setSex("1");
		userCustom.setUsername("张三");
		userQueryVo.setUserCustom(userCustom);
		//调用userMapper的方法

		List<UserCustom> list = userMapper.findUserList(userQueryVo);

		System.out.println(list);
	}
}


# 输出映射


Contents


本文主要讲解mybatis的输出映射。

输出映射有两种方式

  • resultType:如果数据库中字段与实体bean类保持一致时,用resultType。
  • resultMap:你想要的数据跟数据库不保持一致时,需要手动映射。

一、resultType

  • 使用resultType进行输出映射,只有查询出来的【列名】和pojo中的【属性名】一致,该列才可以映射成功。
  • 如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
  • 只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。

1.1 输出简单类型

输出只有一行也只有一列

mapper.xml
<mapper namespace="cn.incast.mabatis.mapper.UserMapper">
	<!-- 用户信息综合查询总数
        parameterType:指定输入类型和findUserList一样
        resultType:输出结果类型
    -->
    <select id="findUserCount" parameterType="com.iot.mybatis.po.UserQueryVo" resultType="int">
        SELECT count(*) FROM user WHERE user.sex=#{userCustom.sex} AND user.username LIKE '%${userCustom.username}%'
    </select>
mapper.java接口
public interface UserMapper{
	//用户信息综合查询
	public int findUserCount(UserQueryVo userQueryVo) throws Exception;
public class UserMapperTest {  
	//用户信息综合查询总数
	@Test
	public void testFindUserCount() throws Exception {

		SqlSession sqlSession = sqlSessionFactory.openSession();

		//创建UserMapper对象,mybatis自动生成mapper代理对象
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

		//创建包装对象,设置查询条件
		UserQueryVo userQueryVo = new UserQueryVo();
		UserCustom userCustom = new UserCustom();
		//由于这里使用动态sql,如果不设置某个值,条件不会拼接在sql中
		userCustom.setSex("1");
		userCustom.setUsername("小");
		userQueryVo.setUserCustom(userCustom);
		//调用userMapper的方法

		int count = userMapper.findUserCount(userQueryVo);

		System.out.println(count);
	}
}
  • 小结

查询出来的结果集只有一行且一列,可以使用简单类型进行输出映射。

1.2 输出pojo对象和pojo列表

不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的。

mapper.java

在mapper.java指定的方法返回值类型不一样:

  • 输出单个pojo对象,方法返回值是单个对象类型
//根据id查询用户信息
public User findUserById(int id) throws Exception;
  • 输出pojo对象list,方法返回值是List
//根据用户名列查询用户列表
public List<User> findUserByName(String name) throws Exception;

生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList (返回集合对象调用 ).

二、resultMap

mybatis中使用resultMap完成高级输出结果映射。(一对多,多对多)

需求:如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。

SELECT id id_,username username_ FROM USER WHERE id=#{value}

resultMap的本质还是一个类而已,只是映射了不同名的列。

mapper.xml

需要配置两个地方:

1.定义resultMap

2.使用resultMap作为statement的输出映射类型

  • 定义reusltMap
<mapper namespace="cn.incast.mabatis.mapper.UserMapper">
    
	<!-- 定义resultMap
	将SELECT id id_,username username_ FROM USER 和User类中的属性作一个映射关系
	
	type:java类。resultMap最终映射的java对象类型,可以使用别名
	id:对resultMap的唯一标识
	 -->
	 <resultMap type="user" id="userResultMap">
	 	<!-- id表示查询结果集中唯一标识 
	 	column:查询出来的列名
	 	property:type指定的pojo类型中的属性名
	 	最终resultMap对column和property作一个映射关系 (对应关系)
	 	-->
	 	<id column="id_" property="id"/>
	 	<!-- 
	 	result:对普通名映射定义
	 	column:查询出来的列名
	 	property:type指定的pojo类型中的属性名
	 	最终resultMap对column和property作一个映射关系 (对应关系)
	 	 -->
	 	<result column="username_" property="username"/>
	 
	 </resultMap>
  • 使用resultMap作为statement的输出映射类型
<!-- 使用resultMap进行输出映射
        resultMap:指定定义的resultMap的id,如果这个resultMap在其它的mapper文件,前边需要加namespace
        -->
    <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
        SELECT id id_,username username_ FROM USER WHERE id=#{value}
    </select>

mapper.java接口
public interface UserMapper{
    //根据id查询用户信息,使用resultMap输出
    public User findUserByIdResultMap(int id) throws Exception;
UserMapperTest.java测试代码
public class UserMapperTest {  
    @Before  
    public void setup() throws Exception{  ...}
        
    @Test
    public void testFindUserByIdResultMap() throws Exception {

        SqlSession sqlSession = sqlSessionFactory.openSession();

        //创建UserMapper对象,mybatis自动生成mapper代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        //调用userMapper的方法

        User user = userMapper.findUserByIdResultMap(1);

        System.out.println(user);

}

小结

使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。

如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值