第四章:输入映射
如果看了前几章节,这一章会很容易懂。如果是第一次看,可能会看不懂,建议从第一章开始。
重要知识点:通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类型。
还是老样子,以一个需求案例为引导学习这一知识点
需求:用户信息综合查询
User.java实体类:
package cn.mybatis.pojo;
import java.util.Date;
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;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex
+ ", birthday=" + birthday + ", address=" + address + "]";
}
}
用户扩展类:
package cn.mybatis.po;
import cn.mybatis.pojo.User;
/**
* 用户扩展类
* @author Hanson
*
*/
public class UserCustom extends User{
}
用户包装类:
package cn.mybatis.po;
/**
* 用户包装类型
* @author Hanson
*
*/
public class UserQueryVo {
//在这里包装所需要的查询条件
//用户查询条件
private UserCustom userCustom;
//可以包装其他的查询条件
public UserCustom getUserCustom() {
return userCustom;
}
public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}
}
疑问:
可能会有人对这边有疑问,为什么查询一个用户需要建立三个java类,而不是把所有查询条件放在user类里面不就可以了么?
其实全部放在一起也没有错,但是为了程序的扩展,我们最好不要动原始的User类,因为这个类有可能对你来说只要User里面的成员变量就够了,但是其他人也需要用的时候可能就不是这样了,因此我们最好就是自己定义一个,不该动原始的直接继承就好了。方便扩展。
UserMapper.java
package cn.mybatis.mapper;
import java.util.List;
import cn.mybatis.po.UserCustom;
import cn.mybatis.po.UserQueryVo;
public interface UserMapper {
//用户的信息综合查询
public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
}
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接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象。
规范:
1、namespace等于mapper接口地址
2、mapper.java接口中的方法名等于mapper.xml中statement的id一致
3、mapper.java接口中的方法的输入参数类型和mapper.xml中statement的parameterType指定的类型一致
4、mapper.java接口中的方法的返回值类型和mapper.xml中statement的resultType指定的类型一致。
-->
<mapper namespace="cn.mybatis.mapper.UserMapper">
<!--
用户信息的综合查询 的一个statement
#{userCoustom.sex}:取出pojo对象中包装对象性别的值
%${userCoustom.username}%:取出pojo对象中包装对象姓名的值
-->
<select id="findUserList" parameterType="cn.mybatis.po.UserQueryVo"
resultType="cn.mybatis.po.UserCustom">
select * from user where user.sex = #{userCustom.sex} and
user.username like '%${userCustom.username}%'
</select>
</mapper>
SqlMapConfig.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">
<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>
<!-- 加载mapper.xml映射文件 使用批量加载方式 规范:
mapper.xml和mapper.java的名称一致并且在同一目录
使用的是mapper代理的方法
-->
<mappers>
<package name="cn.mybatis.mapper" />
</mappers>
</configuration>
测试用例:
package cn.mybatis.mapper;
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.After;
import org.junit.Before;
import org.junit.Test;
import cn.mybatis.po.UserCustom;
import cn.mybatis.po.UserQueryVo;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources//
.getResourceAsStream("MyBatisConfig.xml"));
}
@After
public void tearDown() throws Exception {
}
@Test
public void testFindUserList() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper对象,mybatis自动生成mapper代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//创建包装对象
UserCustom userCustom = new UserCustom();
userCustom.setSex("1");
userCustom.setUsername("张三丰");
UserQueryVo userQueryVo = new UserQueryVo();
userQueryVo.setUserCustom(userCustom);
//调用userMapper的方法
List<UserCustom> list = userMapper.findUserList(userQueryVo);
for (UserCustom userCustom2 : list) {
System.out.println(userCustom2);
}
}
}
复制代码试一试吧。
到这里基本上输入映射就学完了,下一章会介绍输出映射。
本文为慕课网作者原创,转载请标明【原文作者及本文链接地址】。侵权必究,谢谢合作!
热门评论
学习了,受益匪浅,感谢楼主
这两天一干完工作,就来看看楼主的帖子
问个问题啊楼主!xml中查询的返回结果的时候,是建立扩展类,接受该返回结果好呢?还是,在xml中,写resultMap,在后台java代码中,用map去接收好呢??
请问输入映射体现在哪个方面了,还有在UserQueryVo类里包装所需要的查询条件是指的什么,能够简单举个例子吗?谢谢