Mybatis总结(5)---Mybatis输入输出映射

Mybatis输入输出映射

输入映射

通过parameterType指定输入参数的类型,类型可以是简单类型、hashmappojo的包装类型

 

1. 传递pojo的包装对象

(1) 需求

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

(2)定义包装类型pojo

针对上边需求,建议使用自定义的包装类型的pojo

在包装类型的pojo中将复杂的查询条件包装进去。

 

User.java
package com.ren.mybatis.po;

import java.util.Date;
import java.util.List;

/**
 * POJO类
 * 
 * @author 任志燕 
 * 2017年4月18日
 * 
 */
public class User {
	private int id;//使用自增字段
	private String username;// 用户姓名
	private String sex;// 性别
	private Date birthday;// 生日
	private String address;// 地址
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	
	public User() {
		// TODO Auto-generated constructor stub
	}
	public User(String username, String sex, Date birthday, String address) {
		super();
		this.username = username;
		this.sex = sex;
		this.birthday = birthday;
		this.address = address;
	}
	
}

UserCustom.java
package com.ren.mybatis.po;

/**
 * User的扩展类:如果修改了用户表后,不要修改User类,可以定义一个它的扩展类
 * 
 * @author 任志燕 
 * 2017年4月19日
 * 
 */
public class UserCustom extends User {
	

}

UserQueryVo.java
package com.ren.mybatis.po;

import java.util.List;

/**
 * POJO的包装类型:
 * 用于包装所需要的查询条件:
 * @author 任志燕 
 * 2017年4月19日
 * 
 */
public class UserQueryVo {
	//用户查询条件
	private UserCustom userCustom;
	//包含其他的查询条件:订单、商品..
	
	private List
   
   
    
     ids;//定义一个查询id集合,用于如果查询id在某一个范围内时使用
	public void setIds(List
    
    
     
      ids) {
		this.ids = ids;
	}
	public List
     
     
      
       getIds() {
		return ids;
	}
	
	public void setUserCustom(UserCustom userCustom) {
		this.userCustom = userCustom;
	}
	public UserCustom getUserCustom() {
		return userCustom;
	}
	

}

     
     
    
    
   
   

 

(3)mapper.xml

UserMapper.xml中定义用户信息综合查询(查询条件复杂,通过高级查询进行复杂关联查询)。

 


   
   
	
  • select * from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%'
  • select count(*) from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%'
  •  (4) mapper.java

     

    	//多条件查询:使用POJO包装模型
    	public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
    	//查询总记录条数
    	public int findTotalCount(UserQueryVo userQueryVo) throws Exception;

     (5)测试代码


    	//多条件查询:使用POJO包装模型
    	@Test
    	public void testfindUserList() throws Exception
    	{
    		SqlSession sqlSession = sqlSessionFactory.openSession();
    		//得到Mapper接口的代理类对象
    		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    		UserCustom userCustom = new UserCustom();
    		UserQueryVo userQueryVo = new UserQueryVo();
    		userCustom.setSex("1");
    		userCustom.setUsername("小明");
    		userQueryVo.setUserCustom(userCustom);
    		List<Integer>ids = new ArrayList<>();
    		ids.add(16);
    		ids.add(22);
    		ids.add(42);
    		userQueryVo.setIds(ids);
    		List<UserCustom> list = userMapper.findUserList(userQueryVo);
    		for (UserCustom userCustom2 : list) {
    			System.out.println(userCustom2.getUsername());
    		}
    		
    	}
    	
    		//查询总记录条数
    		@Test
    		public void testfindCount() throws Exception
    		{
    			SqlSession sqlSession = sqlSessionFactory.openSession();
    			//得到Mapper接口的代理类对象
    			UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    			UserCustom userCustom = new UserCustom();
    			UserQueryVo userQueryVo = new UserQueryVo();
    			userCustom.setSex("1");
    			userCustom.setUsername("小明");
    			userQueryVo.setUserCustom(userCustom);
    			int totalCount = userMapper.findTotalCount(userQueryVo);
    			System.out.println(totalCount);
    		}


     

     

     

     输出映射


      resultType

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

    如果查询出来的列名和pojo中的属性名全部不一致,就不会创建pojo对象。

    只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。

     

        1.输出简单类型

    (1)需求

    用户信息的综合查询列表总数,通过查询总数和上边用户综合查询列表才可以实现分页。

     

    (2)mapper.xml

     

    <!--查询总记录条数 -->
    	<select id="findTotalCount" parameterType="UserQueryVo" resultType="int">
    		select count(*) from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%'
    	</select>


    (3) mapper.java

     

    public int findTotalCount(UserQueryVo userQueryVo) throws Exception;

     

    (4)测试代码

    		//查询总记录条数
    		@Test
    		public void testfindCount() throws Exception
    		{
    			SqlSession sqlSession = sqlSessionFactory.openSession();
    			//得到Mapper接口的代理类对象
    			UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    			UserCustom userCustom = new UserCustom();
    			UserQueryVo userQueryVo = new UserQueryVo();
    			userCustom.setSex("1");
    			userCustom.setUsername("小明");
    			userQueryVo.setUserCustom(userCustom);
    			int totalCount = userMapper.findTotalCount(userQueryVo);
    			System.out.println(totalCount);
    		}


     (5) 小结

     

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

     

     

    2. 输出pojo对象和pojo列表

     

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

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

    ①输出单个pojo对象,方法返回值是单个对象类型

      输出pojo对象list,方法返回值是List<Pojo>

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

     

     

     resultMap

     

    mybatis中使用resultMap完成高级输出结果映射。

     

    (1) resultMap使用方法

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

     

      1、定义resultMap;

     

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

     

    (2)将下边的sql使用User完成映射

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

     

    User类中属性名和上边查询列名不一致。

     

    ①定义reusltMap:
     
    	<!--
    		定义resultMap:
    		映射select id id_,username username_ from user和User类的属性
    		type:resultMap最终映射的java类型(可以使用别名)
    		id:是对resultMap的唯一标识
    	 -->
    	 <resultMap type="User" id="userResultMap">
    		<!--id:表示查询结果集中唯一标识(主键): column:查询出的列名;property:对应的java对象的属性名 -->
    		<id column="id_" property="id"/>
    		<!--result:表示查询结果集中普通字段: column:查询出的列名;property:对应的java对象的属性名 -->
    		<result column="username_" property="username"/>
    	</resultMap>

     

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

     

    	<!--
    		2.根据id查询用户,使用resultMap输出类型:  
    		3.select id id_,username username_ from user查询出来的列名
    		和User属性名不一致,所以需要定义一个resultMap将列名和User类的属性名
    		做一个映射;
    	-->
    	<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
    		select id id_,username username_ from user where id = #{id}
    	</select>
    	

     

      mapper.java

    public User findUserByIdResultMap(int id) throws Exception;

      测试

    	@Test
    	public void findUserByIdResultMap() throws Exception
    	{
    		SqlSession sqlSession = sqlSessionFactory.openSession();
    		//得到Mapper接口的代理类对象
    		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    		User user  = userMapper.findUserByIdResultMap(25);
    		System.out.println(user.getUsername());
    	}

     

     

     

      小结

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

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

     


    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 打赏
      打赏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    雅静8

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值