• 【从零开始学Mybatis笔记】输入映射和输出映射


    parameterType(输入类型)

    传递简单类型

    参考上一篇博客内容。
    使用#{}占位符,或者${}进行sql拼接。

    传递pojo对象

    参考上一篇博客内容。
    Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。

    传递pojo包装对象

    开发中通过可以使用pojo传递查询条件。
    查询条件可能是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如查询用户信息的时候,将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。
    包装对象:Pojo类中的一个属性是另外一个pojo。

    需求:根据用户名模糊查询用户信息,查询条件放到QueryVo的user属性中。

    第一步:编写QueryVo

    public class QueryVo {
    	// 包含其他的pojo
    	private User user;
    
    	public User getUser() {
    		return user;
    	}
    	public void setUser(User user) {
    		this.user = user;
    	}
    }
    

    第二步 Sql语句
    SELECT * FROM user WHERE username LIKE '%张%'

    第三步 Mapper.xml文件
    在UserMapper.xml中配置sql,如下图。

    第四步 Mapper接口
    在UserMapper接口中添加方法,如下图:

    第五步 测试方法
    在UserMapeprTest增加测试方法,如下:

    @Test
    public void testQueryUserByQueryVo() {
    	// mybatis和spring整合,整合之后,交给spring管理
    	SqlSession sqlSession = this.sqlSessionFactory.openSession();
    	// 创建Mapper接口的动态代理对象,整合之后,交给spring管理
    	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    
    	// 使用userMapper执行查询,使用包装对象
    	QueryVo queryVo = new QueryVo();
    	// 设置user条件
    	User user = new User();
    	user.setUsername("张");
    	// 设置到包装对象中
    	queryVo.setUser(user);
    
    	// 执行查询
    	List<User> list = userMapper.queryUserByQueryVo(queryVo);
    	for (User u : list) {
    		System.out.println(u);
    	}
    
    	// mybatis和spring整合,整合之后,交给spring管理
    	sqlSession.close();
    }
    
    

    输出结果

    resultType(输出类型)

    输出简单类型

    需求:查询用户表数据条数
    第一步sql
    SELECT count(*) FROM user
    第二步Mapper.xml文件
    在UserMapper.xml中配置sql,如下图:

    第三步Mapper接口
    在UserMapper添加方法,如下图:

    第四步测试方法
    在UserMapeprTest增加测试方法,如下:

    @Test
    public void testQueryUserCount() {
    	// mybatis和spring整合,整合之后,交给spring管理
    	SqlSession sqlSession = this.sqlSessionFactory.openSession();
    	// 创建Mapper接口的动态代理对象,整合之后,交给spring管理
    	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    
    	// 使用userMapper执行查询用户数据条数
    	int count = userMapper.queryUserCount();
    	System.out.println(count);
    
    	// mybatis和spring整合,整合之后,交给spring管理
    	sqlSession.close();
    }
    
    

    输出结果

    注意:输出简单类型必须查询出来的结果集有一条记录,最终将第一个字段的值转换为输出类型。

    输出pojo对象

    参考上一篇博客内容。

    输出pojo列表

    参考上一篇博客内容。

    resultMap

    resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
    如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
    resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

    需求:查询订单表order的所有数据
    sql:SELECT id, user_id, number, createtime, note FROM order

    第一步 声明pojo对象
    数据库表如下图:

    第二步 Order对象:

    public class Orders implements Serializable {
    	
    	 /**
    		 * 
    		 */
    		private static final long serialVersionUID = 1L;
    
    		private Integer id;
    
    	    private Integer userId;
    
    	    private String number;
    
    	    private Date createtime;
    
    	    private String note;
    
    	    public Integer getId() {
    	        return id;
    	    }
    
    	    public void setId(Integer id) {
    	        this.id = id;
    	    }
    
    	    public Integer getUserId() {
    	        return userId;
    	    }
    
    	    public void setUserId(Integer userId) {
    	        this.userId = userId;
    	    }
    
    	    public String getNumber() {
    	        return number;
    	    }
    
    	    public void setNumber(String number) {
    	        this.number = number == null ? null : number.trim();
    	    }
    
    	    public Date getCreatetime() {
    	        return createtime;
    	    }
    
    	    public void setCreatetime(Date createtime) {
    	        this.createtime = createtime;
    	    }
    
    	    public String getNote() {
    	        return note;
    	    }
    
    	    public void setNote(String note) {
    	        this.note = note == null ? null : note.trim();
    	    }
    
    		@Override
    		public String toString() {
    			return "Orders [id=" + id + ", userId=" + userId + ", number=" + number + ", createtime=" + createtime
    					+ ", note=" + note + "]";
    		}
    	    
    	    
    
    }
    

    第三步 Mapper.xml文件

    <mapper namespace="com.tyust.mybatis.pojo.OrdersMapper">
    
    	<select id="selectAllInfo" resultType="1">
    		SELECT id, user_id, number, createtime, note FROM orders
    	</select>
    </mapper>
    

    第四步 Mapper接口
    编写接口如下:

    public interface OrdersMapper{
       
    
       public List<Orders> selectAllInfo(); 
        
    }
    

    第五步 测试方法

    public static void main(String[] args) throws Exception {
    		InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    		SqlSession sqlSession = sqlSessionFactory.openSession();
    		
    		OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
    		
    		List<Orders> ordersList = ordersMapper.selectAllInfo();
    		
    		for (Orders orders : ordersList) {
    			System.out.println(orders);
    		}
    
    
    	}
    

    输出结果

    发现userId为null
    原因:数据库中字段和orders实体类属性不同
    解决方案:使用resultMap

    使用resultMap
    由于上边的mapper.xml中sql查询列(user_id)和Order类属性(userId)不一致,所以查询结果不能映射到pojo中。
    需要定义resultMap,把orderResultMap将sql查询列(user_id)和Order类属性(userId)对应起来

    <!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,Mapper动态代理开发的时候使用,需要指定Mapper的类路径 -->
    <mapper namespace="com.tyust.mybatis.pojo.OrdersMapper">
    
    <!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo -->
    	<!-- id:设置ResultMap的id -->
    <resultMap type="com.tyust.mybatis.dao.Orders" id="1">
    <!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
    		<!-- property:主键在pojo中的属性名 -->
    		<!-- column:主键在数据库中的列名 -->
    	<id column="id" property="id"/>
    <!-- 定义普通属性 -->
    	<result column="user_id" property="userId"/>
    </resultMap>
    <!-- 查询所有的订单数据 -->
    	<select id="selectAllInfo" resultMap="1">
    		SELECT id, user_id, number, createtime, note FROM orders
    	</select>
    </mapper>
    

    输出结果

  • 相关阅读:
    JDOJ 1090: 矩阵
    JDOJ 2236: Random Num
    浅谈区间DP
    NOIP 2006 能量项链
    小技巧—处理环形区间
    NOI 1995 石子合并
    洛谷 P5640 【CSGRound2】逐梦者的初心
    JDOJ 1101: 邦德I
    JDOJ 1104: 最佳挑水
    JDOJ 1098: 夏娜的菠萝包
  • 原文地址:https://www.cnblogs.com/zllk/p/12793102.html
Copyright © 2020-2023  润新知