Mybatis框架|输入/输出参数映射


文章使用的数据库表仍然为之前测试时使用的user表—数据库表在本文中

一、输入映射parameterType

1.简单的参数类型(参数只有一个的时候)

使用#{任意的变量名}${value}${_parameter}

2.pojo类型

  • #{对象的属性名}:可以把Java里面的参数和数据库中的类型进行自动转换。
  • ${对象的属性名}:可以取出传了参数里面的属性值,智商税原封不动的取出。缺点:不能防止sql注入。

这种方式是利用OGNL表达式来解析pojo对象中属性对应的值。

3.pojo对象的包装类型

可以将pojo类型和扩展字段结合,封装一个新的类型。下面演示使用pojo对象的包装类型。查询数据库中姓名中包含"小"字的人的姓名。

(1)UserQueryvo类

package com.gql.pojo;
/**
 * 类说明:
 *		pojo的包装对象
 * @guoqianliang1998.
 */
public class UserQueryvo {
	private User user;
	//扩展的字段
	private int producteId;
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public int getProducteId() {
		return producteId;
	}
	public void setProducteId(int producteId) {
		this.producteId = producteId;
	}	
}

(2)UserMapper接口

package com.gql.mapper;

import java.util.List;

import com.gql.pojo.User;
import com.gql.pojo.UserQueryvo;
/**
 * 类说明:
 *		接口
 * @guoqianliang1998.
 */
public interface UserMapper {
	User getUserById(int id);
	
	List<User> getUserListByName(String name);
	
	void saveUser(User user);
	
	void updateUser(User user);
	
	void deleteUser(int id);
	
	List<User> getUserListByQueryvo(UserQueryvo vo);
}

(3)UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gql.mapper.UserMapper">
	<select id="getUserListByQueryvo" parameterType="com.gql.pojo.UserQueryvo" resultType="com.gql.pojo.User">
		SELECT id,
		username as name,
		sex,
		address,
		birthday 
		FROM user 
		WHERE username like '%${user.name}%';
	</select>
</mapper>

(4)全局配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<properties resource="db.properties">
			
	</properties>

	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<!-- <mapper resource="UserMapper.xml" /> -->
		<!-- 如果使用接口的全限定名,接口名必须和sql配置文件同名且同级目录 -->
		<mapper class="com.gql.mapper.UserMapper"/>
		<!-- <package name="com.gql.mapper"/> -->
	</mappers>
</configuration>

(5)测试类

package com.gql.mapper;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

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.Before;
import org.junit.Test;

import com.gql.pojo.User;
import com.gql.pojo.UserQueryvo;

public class UserMapperTest {
	private SqlSessionFactory sqlSessionFactory;
	@Before
	public void init() throws IOException{
		String resource = "mybatis-config.xml";
		InputStream in = Resources.getResourceAsStream(resource);
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);		
	}	
	@Test
	public void testQueryVo(){
		SqlSession session = sqlSessionFactory.openSession();
		UserMapper userMapper = session.getMapper(UserMapper.class);
		UserQueryvo vo = new UserQueryvo();
		User user = new User();
		user.setName("小");
		vo.setUser(user);
		List<User> userList = userMapper.getUserListByQueryvo(vo);	
		for (User i : userList) {
			System.out.println(i.getName());
		}
	}
}

成功打印出名字中包含"小"字的人的姓名。
在这里插入图片描述

二、输出类型resultType

1.返回简单的类型

下面的代码演示返回一个简单的int类型。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gql.mapper.UserMapper">
	<select id="getCount" parameterType="com.gql.pojo.UserQueryvo" resultType="java.lang.Integer">
		SELECT COUNT(1) FROM user WHERE username LIKE '%${user.name}%';
	</select>
</mapper>
package com.gql.mapper;

import java.util.List;

import com.gql.pojo.User;
import com.gql.pojo.UserQueryvo;
/**
 * 类说明:
 *		接口
 * @guoqianliang1998.
 */
public interface UserMapper {
	int getCount(UserQueryvo vo);
}
package com.gql.mapper;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

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.Before;
import org.junit.Test;

import com.gql.pojo.User;
import com.gql.pojo.UserQueryvo;

public class UserMapperTest {
	private SqlSessionFactory sqlSessionFactory;
	@Before
	public void init() throws IOException{
		String resource = "mybatis-config.xml";
		InputStream in = Resources.getResourceAsStream(resource);
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);		
	}
	@Test
	public void testGetCount(){
		SqlSession session = sqlSessionFactory.openSession();
		UserMapper userMapper = session.getMapper(UserMapper.class);
		UserQueryvo vo = new UserQueryvo();
		User user = new User();
		user.setName("小");
		vo.setUser(user);
		int result = userMapper.getCount(vo);
		System.out.println(result);
	}
}

在这里插入图片描述

2.返回pojo对象

pojo对象的映射可能为单个或者多个,如何知道是单个还是多个呢?实际上当代理对象通过接口创建完成后,代理对象就知道了每个方法的返回值,如果返回类型是pojo类型就说明是单个对象,如果是list就说明是多个对象,

三、输出映射ResultMap

输出映射ResultMap完成较复杂的一对多,多对多的对应关系,下面的代码测试使用输出映射ResultMao,注意这里的Map指的是映射,而不是集合。

1.UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gql.mapper.UserMapper">
	<!-- 将数据库列名与pojo对象中的属性进行映射 -->
	<select id="getUserByResultMap" parameterType="int" resultMap="userResultMap">
		select id id_,
		username,
		sex sex_,
		address ad
		from user where id=#{id};
	</select>
	
	<resultMap type="com.gql.pojo.User" id="userResultMap">
		<id column="id_" property="id"/>
		<result column="username" property="name"/>
		<result column="sex_" property="sex"/>
		<result column="ad" property="address"/>
	</resultMap>
</mapper>

2.UserMapper接口

package com.gql.mapper;

import java.util.List;

import com.gql.pojo.User;
import com.gql.pojo.UserQueryvo;
/**
 * 类说明:
 *		接口
 * @guoqianliang1998.
 */
public interface UserMapper {

	User getUserByResultMap(int id);
}

3.测试使用ResultMap进行

package com.gql.mapper;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

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.Before;
import org.junit.Test;

import com.gql.pojo.User;
import com.gql.pojo.UserQueryvo;

public class UserMapperTest {
	private SqlSessionFactory sqlSessionFactory;
	@Before
	public void init() throws IOException{
		String resource = "mybatis-config.xml";
		InputStream in = Resources.getResourceAsStream(resource);
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);		
	}

	@Test
	public void testResultMap(){
		SqlSession session = sqlSessionFactory.openSession();
		UserMapper userMapper = session.getMapper(UserMapper.class);
		User user = userMapper.getUserByResultMap(1);
		System.out.println(user.getName());
	}
}

成功查询出数据库中的结果:
在这里插入图片描述

发布了413 篇原创文章 · 获赞 1081 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/weixin_43691058/article/details/104238936
今日推荐