【4】. Mapper映射文件【 输入类型映射和输出类型映射:parameterType传递包装类型、resultType的使用、resultMap入门】
【resultType】:将 SQL查询结果映射为 JAVA对象。要求数据库中字段与类中对应属性相同,不同则不赋值;
【resulMap】:将 SQL查询结果映射为 JAVA对象。可定义别名;
XxMapper.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.iotek.mapper.UserMapper">
<!-- resultType -->
<select id="findUserList" parameterType="userQueryVo" resultType="user">
select * from Users where username like '%${userCustom.username}%'
</select>
<select id="findUserCount" parameterType="userQueryVo" resultType="int">
select count(*) from Users where username like '%${userCustom.username}%'
</select>
<!-- resultMap -->
<resultMap id="userListMap" type="user">
<id colum="u_id" property="id"/> //主键
<result colum="u_username property="username"/> //普通列
<result colum="u_age property="age"/>
</resultMap>
<select id="findUserList" parameterType="userQueryVo" resultMap="userListMap">
select id u_id,username u_username ,age u_age from Users where username like '%${userCustom.username}%'
</select>
</mapper>
XxMapper.java
public interface userMapper{
public List<User> findUserList(UserQueryVo userQueryVo) throws Exception;
public int findUserCount(UserQueryVo userQueryVo) throws Exception;
}
XxTest.java
public class AppTest {
SqlSessionFactory sqlSessionFactory=null;
@Before
public void init() throws IOException {
InputStream inputStream=Resources.getResourcesAsStream("SqlMapConfig.xml");
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserList() throws Exception(){
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
UserQueryVo userQueryVo=new UserQueryVo();
UserCustom userCustom=new UserCustom();
userCustom.setUsername("张");
userQueryVo.setUserCustom(userCustom);
List<User> users=userMapper.findUserList(userQueryVo);
sqlSession.close();
for (User user:users) {
System.out.println(user.getId()+","+user.getUsername());
}
}
@Test
public void testFindUserList() throws Exception(){
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
UserQueryVo userQueryVo=new UserQueryVo();
UserCustom userCustom=new UserCustom();
userCustom.setUsername("张");
userQueryVo.setUserCustom(userCustom);
int count=userMapper.findUserCount(userQueryVo);
sqlSession.close();
for (User user:users) {
System.out.println("姓张的人数:"+count);
}
}
}
1. parameterType传递包装类型
输入映射类型和输出映射类型:
parameterType:java基本数据类型、pojo类型;
parameterType传递 pojo的包装类型;
(若希望传递一些组合起来的类型,包括 java基本数据类型和 pojo类型,但使用 mpper.xml定义内容时,parameterType只能是一个参数,此时用 parameterType来传递 pojo的包装类型。)
需求例如:查询时输入条件,条件可能是用户、商品
解决:
1. 包装类型
2. Mapper.xml
3. Mapper.java
- 包装类型: com.iotek.po包下的 UserQueryVo.java:将 User、UserCustom (用户扩展类,继承 User)包装进去;
目录:
UserQueryVo.java
public class UserQueryVo {
private User user; //用户信息
private UserCustom userCustom; //自定义User扩展对象
set()、get()
}
UserCustom .java
public class UserCustom extends User {
//可添加新内容
}
2. Mapper.xml
UserMapper.xml
查询的类型 parameterType是 UserQueryVo,因为【3】全局文件中定义了 com.iotek.po包下的所有类都有别名,所以 parameterType可以直接写 userQueryVo;resultType返回类型是用户;sql语句中在 UserQueryVo类型中通过getUserCustom()方法拿 userCustom;UserCustom类 中有 User类的内容,User类型中有 getUsername(),所以直接写成 ${userCustom.username}。
<mapper namespace="com.iotek.mapper.UserMapper">
<select id="findUserList" parameterType="userQueryVo" resultType="user">
select * from Users where username like '%${userCustom.username}%'
</select>
</mapper>
3. Mapper.java
UserMapper.java
方法名是 UserMapper.xml中 statement的 id即findUserList,参数类型是UserQueryVo ,返回值是 List< User>;
public interface userMapper{
public List<User> findUserList(UserQueryVo userQueryVo) throws Exception;
}
AppTest.java:
userMapper是通过 sqlsession.getMapper(UserMapper.class)得到;userMapper.findUserList(userQueryVo) 查询,需要 userQueryVo,所以 new;userQueryVo再 userQueryVo.setUserCustom(userCustom),需要 userCustom,所以 new;userCustom中 userCustom.setUsername(“张”),即再设置 username;再查询,返回 List< User> 。
public class AppTest {
SqlSessionFactory sqlSessionFactory=null;
@Before
public void init() throws IOException {
InputStream inputStream=Resources.getResourcesAsStream("SqlMapConfig.xml");
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserList() throws Exception(){
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
UserQueryVo userQueryVo=new UserQueryVo();
UserCustom userCustom=new UserCustom();
userCustom.setUsername("张");
userQueryVo.setUserCustom(userCustom);
List<User> users=userMapper.findUserList(userQueryVo);
sqlSession.close();
for (User user:users) {
System.out.println(user.getId()+","+user.getUsername());
}
}
}
2. 输出类型映射 resultType
resultType 返回:
1. 简单类型: SQL 语句一定是返回一行一列
2. pojo类型:selectOne返回一条记录、selectList返回多条记录
1. 返回简单类型:
UserMapper.xml
<mapper namespace="com.iotek.mapper.UserMapper">
<select id="findUserCount" parameterType="userQueryVo" resultType="int">
select count(*) from Users where username like '%${userCustom.username}%'
</select>
</mapper>
UserMapper.java
public interface userMapper{
public int findUserCount(UserQueryVo userQueryVo) throws Exception;
}
AppTest.java:
public class AppTest {
SqlSessionFactory sqlSessionFactory=null;
@Before
public void init() throws IOException {
InputStream inputStream=Resources.getResourcesAsStream("SqlMapConfig.xml");
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserList() throws Exception(){
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
UserQueryVo userQueryVo=new UserQueryVo();
UserCustom userCustom=new UserCustom();
userCustom.setUsername("张");
userQueryVo.setUserCustom(userCustom);
int count=userMapper.findUserCount(userQueryVo);
sqlSession.close();
for (User user:users) {
System.out.println("姓张的人数:"+count);
}
}
}
3. 输出类型映射 resultMap
resultMap是配置输出类型,完成复杂数据类型映射(一对多,多对多映射)
【resultType】:指定输出结果的类型,将 SQL查询结果映射为 JAVA对象;(sql查询的列名与 pojo类的属性一致,如果有不同时,不同的不赋值(eg:②);如果列名与 pojo类的属性名全部不一致,不创建 pojo对象(eg:③));
【resultMap】:将 SQL查询结果映射为 JAVA对象;(id:唯一标识;type:映射的 pojo类型);
(注:1. 如果定义的 resultMap与使用在同一个 mapper.xml中,直接使用;
如果定义的 resultMapper与使用在不在同一个 mapper.xml中,要加命名空间(即要把命名空间加在 resultMap="userListMap"前,即resultMap=“命名空间.userListMap”)
2. 接口的返回类型与 resultMapper中映射的 type类型相一致; (即 Mapper.java中方法的返回类型与下方 < resultMap type=“user” id=“userListMap”>中 type值相同))
① select u_id,u_username,u_age from …运行报错,本身 sql语句出错,因为数据表中没有这些字段;
② select id,username,age u_age from …(即 age别名)运行不报错,但查到的 age值不是表中的值,age为 0;
(所以 resultType查询时,sql查询的列名与 pojo类的属性一致)
③ select id u_id,username u_username,age u_age from … (所有的别名全部都与 pojo类属性不一致)运行不报错,但不创建 pojo对象。
<!-- resultType -->
<select id="findUserList" parameterType="userQueryVo" resultType="user">
select id,username,age from Users where username like '%${userCustom.username}%'
</select>
<!-- resultMap -->
<resultMap id="userListMap" type="user">
<id colum="u_id" property="id"/> //主键
<result colum="u_username property="username"/> //普通列
<result colum="u_age property="age"/>
</resultMap>
<select id="findUserList" parameterType="userQueryVo" resultMap="userListMap">
select id u_id,username u_username ,age u_age from Users where username like '%${userCustom.username}%'
</select>
(首页网址: https://blog.csdn.net/qq_41029923/article/details/83472411 )