六、Mybatis代理方式之输入输出

本文详细介绍了在MyBatis框架中如何通过不同的方式传递参数到SQL语句中,包括基本类型、POJO对象和Map类型,并展示了如何使用resultType和resultMap处理查询结果,确保返回的数据能正确映射到Java对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

User类

public class User {
		private int id;
		private String username;// 用户姓名
		private String sex;// 性别
		private Date birthday;// 生日
		private String address;// 地址
}

QueryUserOV类(POJO类:里面还有自定义的User类)

public class QueryUserOV {
	private User user;
}

sqlMapcofig.xml配置

<?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">
<!--mybatis整体流程:
	1、配置全局文件SqlMapConfig.xml
	2、根据配置的全局配置文件,创建工厂。
	3、工厂创建一个会话sqlSession。
	4、会话调用mapper
  -->
<configuration>
	<!-- 加载java的配置文件或者声明属性信息,以后写xml配件,都是采用properties写参数,xml引入的方式 -->
	<properties resource="db.properties"></properties>
	<!-- 单个自定义别名 -->
    <!-- <typeAliases><typeAlias type="zym.com.po.User" alias="user"/></typeAliases> -->
	
	<!--推荐采用以下模式,指定包名称来为该包下的po类声明别名,默认的别名为类名,首字母大小写都可
	    以后在mapper文件中写Type的时候就可以直接用类名了。
	  -->
	<typeAliases>
		<package name="zym.com.po" />
	</typeAliases>
	<environments default="development">
		<environment id="development">
			<!-- 配置JDBC事务控制,由mybatis进行管理 -->
			<transactionManager type="JDBC"></transactionManager>
			<!-- 配置数据源,采用mybatis连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="${db.driver}" />
				<property name="url" value="${db.url}" />
				<property name="username" value="${db.username}" />
				<property name="password" value="${db.password}" />
			</dataSource>
		</environment>
	</environments>
	<!--package代表mapper文件底下的所有映射文件,采用此方法前提是,mapper接口和mapper映射文件都必须在同一个目录下,并且名称相同  -->
	<mappers>
		<package name="mapper"/>
	</mappers>
</configuration>

UserMapper.java (mapper接口)

public interface UserMapper {

	List<User> findUserByName(String username);
	List<User> findUserByNameAndSex1(QueryUserOV queryUserOV);
	List<User> findUserByNameAndSex2(Map<String, Object> map);
	List<User> getUserNameAndSex3(QueryUserOV queryUserOV);
	List<User> getUserNameAndSex4(QueryUserOV queryUserOV);
}

UserMapper.xml(mapper映射文件)

<?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">

<!--下面的resultType用的都是user,实际是zym.com.po.User。是由SqlMapConfig.xml里面的typeAliases别名配置来的  -->
<!--此处的命名空间=UserDao的类路径  -->
<mapper namespace="mapper.UserMapper">
	<select id="findUserByName" parameterType="java.lang.String"
		resultType="user">
		SELECT * FROM USER WHERE username ='${value}';
	</select>

	<!--传入类型pojo类型的时候,取里面的值用user.username,这里可以看到连接符${}对于pojo类型,是下面的方式。简单类型的话连接符只能是value  -->
	<select id="findUserByNameAndSex1" parameterType="zym.com.po.QueryUserOV" resultType="user">
		select *from USER WHERE USERNAME='${user.username}' and SEX=#{user.sex};
	</select>
	
	<!--传入参数是map类型的  -->
	<select id="findUserByNameAndSex2" parameterType="hashmap" resultType="user">
		select *from USER WHERE USERNAME='${username}' and SEX='${sex}';
	</select>	

	<!--传出参数是pojo类型的,sql返回的列名要和resultType定义类的属性名一致,如果不一致就为空,下面只有username\sex两个字段,其他字段返回就是null -->
	<select id="getUserNameAndSex3" parameterType="zym.com.po.QueryUserOV" resultType="user">
		select  username ,sex  from USER WHERE USERNAME = '${user.username}'
		and SEX=#{user.sex};
	</select>
	
	<!--传出参数是pojo类型的,如果查询出来的结果有别名,就要用 resultMap,将column列名再转成property名 -->
	<resultMap type="user" id="UserMapByName">
		<id column="_id" property="id"/>
		<result column="_username" property="username"/>
		<result column="_sex" property="sex"/>
	</resultMap>
	<select id="getUserNameAndSex4" parameterType="zym.com.po.QueryUserOV" resultMap="UserMapByName">
		select  id _id,username _username,sex _sex from USER WHERE USERNAME = '${user.username}'
		and SEX=#{user.sex} and id=#{user.id};
	</select>
</mapper>

测试java

public class sqlTest {
	private SqlSessionFactory sqlSessionFactory;

	@Before
	public void setup() throws IOException {
		String resource = "SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}

	/*传入参数是基本类型的*/
	@Test
	public void findUserByName(){
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		List<User> findUserByName = mapper.findUserByName("zym");
		System.out.println("结果:"+findUserByName);
		sqlSession.close();
	}
	/*传入类型pojo类型的时候*/	
	@Test
	public void findUserByNameAndSex(){
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		QueryUserOV queryUserOV = new QueryUserOV();
		User user = new User();
		user.setSex("男");
		user.setUsername("小明");
		queryUserOV.setUser(user);
		List<User> findUserByNameAndSex = mapper.findUserByNameAndSex1(queryUserOV);
		System.out.println("结果:"+findUserByNameAndSex);
		sqlSession.close();
		
	}
	/*传入参数是map类型的 */
	@Test
	public void findUserByNameAndSex2(){
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		Map<String, Object> map = new HashMap<>();
		map.put("username", "zym");
		map.put("sex", "男");
		List<User> findUserByNameAndSex2 = mapper.findUserByNameAndSex2(map);
		System.out.println("结果:"+findUserByNameAndSex2);
		sqlSession.close();
	}
	
	/*传出参数是pojo类型的 */
	@Test
	public void findUserByNameAndSex3(){
		SqlSession sqlSession = sqlSessionFactory.openSession();
		UserMapper mapper = sqlSession.getMapper(UserMapper.class);
		QueryUserOV queryUserOV = new QueryUserOV();
		User user = new User();
		user.setSex("男");
		user.setUsername("zym");
		user.setId(34);
		queryUserOV.setUser(user);
		List<User> getUserNameAndSex3 = mapper.getUserNameAndSex3(queryUserOV);
		List<User> getUserNameAndSex4 = mapper.getUserNameAndSex4(queryUserOV);
		System.out.println("结果1:"+getUserNameAndSex3);
		System.out.println("结果2:"+getUserNameAndSex4);
		sqlSession.close();
	}
	

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值