Mybatis输入映射和输出映射

Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心。

 输入参数映射

 parameterType(输入类型)

传递简单类型:

如:
	<select id="queryUserById" parameterType="Integer" resultType="User">
		select * from t_user where id = #{id}
	</select>
如上中parameterType为输入类型、resultType为输出类型,sql语句中记得用占位符#{}(防sql注入功能并且默认加'`'飘字符)或者${}(相反)进行sql拼接。

传递pojo对象

Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。

补充:什么叫ognl表达式? OGNL表达式是Object-Graph Navigation Language的缩写,是一种功能强大的表达式语言,通过简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转换。

ognl表达式的使用?

首先看一个代码:

User.xml中

	<update id="updateUser" parameterType="com.firtDay.sqlMapconFig.User">
		UPDATE t_user set _name = #{_name},_money = #{_money} WHERE id = #{id}
	</update>

User.java中
	public Integer id;
	private String _name;
	private int _money;

测试类
	//更新数据
	@Test
	public void testDemo5(){
		SqlSession openSession = sqlSessionFactory.openSession();
		User user = new User();
		user.setId(1);
		user.set_name("魏杰");
		user.set_money(1000);
		int update = openSession.update("updateUser", user);
		openSession.commit();
		openSession.close();
	}
数据库

运行测试类:
我们可以看到数据更改成功,因为我们的传入的参数类型为user对象,那么我们怎么获取需要更新的数据呢,就通过ognl表达式可以去解析user对象中的成员变量,而我们的User.xml中
UPDATE t_user set _name = #{_name},_money = #{_money} WHERE id = #{id}

中的#{_money}和#{id}和我们对象的成员变量中的名称相同,因此才会更改成功,倘若我们把_money改成money再执行就会报错:org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'money' in 'class com.firtDay.sqlMapconFig.User'
表示找到参数值。

 传递pojo包装对象

开发中通过可以使用pojo传递查询条件。

查询条件可能是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如查询用户信息的时候,将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。

包装对象:Pojo类中的一个属性是另外一个pojo。

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

Mapper接口

public interface mapper {
	User queryUserById(Integer id);
	User queryUserByIdQueryVo(QueryVo vo);
	Integer queryUserCount();
	User queryUserByName(User user);
	List<User> queryUserByIds(QueryVo vo);
	List<User> queryUserByIds(List<Integer> ids);
	List<User> queryUserByIds(Integer[] ids);
	List<OrderDemo> queryOrders();//一对一
	List<UserDemo> queryOrdersDemo();//一对多
}


编写QueryVo

public class QueryVo implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private User user;
	private List<Integer> ids;
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public List<Integer> getIds() {
		return ids;
	}
	public void setIds(List<Integer> ids) {
		this.ids = ids;
	}
	
}

xml中传递参数类型设置

<select id="queryUserByIds" resultType="User" parameterType="QueryVo">

测试类

	@Test
	public void testDemo2(){
		SqlSession openSession = sqlSessionFactory.openSession();
		mapper m = openSession.getMapper(mapper.class);
		User user = new User();
		user.setId(3);
//		知识点一
		QueryVo vo = new QueryVo();
		vo.setUser(user);
		user = m.queryUserByIdQueryVo(vo);
		System.out.println(user);
		System.out.println("----------------");
		user = m.queryUserById(user.getId());
		System.out.println(user);
		System.out.println("---------------------------");
		Integer queryUserCount = m.queryUserCount();
		System.out.println(queryUserCount);
		openSession.close();
	}

resultType(输出类型)

简单参数类型、输出pojo对象、输出pojo列表(List,resultType仍然为user)




猜你喜欢

转载自blog.csdn.net/dreamzuora/article/details/80035973