
正文
(四)resultMap、sql片段与动态SQL
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
一、resultMap1.1 为什么要用resultMap
- resultType:指定输出结果的类型(pojo、简单类型、hashmap),将SQL查询结果映射为Java对象。使用resultType注意:sql查询的列名要和resultType指定pojo的属性相同,指定相同,属性方可映射成功。如果sql查询的列名要和resultType指定pojo的属性全部不相同,list中是无法创建pojo对象的。有几个属性对应相同,则能给对应相同的属性赋值。
resultMap:将SQL查询结果映射为Java对象。如果SQL查询列名和最终要映射的pojo的属性名不一致,使用resultMap将列名和pojo的属性名做一个映射关系(列名和属性名映射配置)。 - 举例来讲,我们要查询学生记录,学生的pojo对象中的学生名为name,而数据库中的学生名字段为UserName,那么使用resultType则无法将查询到的学生记录映射到学生pojo对象中,因为属性名和字段名必须一致。
- 解决方法如下:
<resultMap type="com.shyroke.entity.User" id="userMap">
<id column="id" property="id" />
<result column="userName" property="userName" />
<result column="passWord" property="passWord" />
</resultMap>
column的值对应着property的值,即数据库字段(column)对应着pojo对象的属性(property)。
二、SQL片段2.1 案例一
使用resultType注意:sql查询的列名要和resultType指定pojo的属性相同,指定相同,属性方可映射成功。如果sql查询的列名要和resultType指定pojo的属性全部不相同,list中是无法创建pojo对象的。有几个属性对应相同,则能给对应相同的属性赋值。
resultMap:将SQL查询结果映射为Java对象。如果SQL查询列名和最终要映射的pojo的属性名不一致,使用resultMap将列名和pojo的属性名做一个映射关系(列名和属性名映射配置)。
resultMap:将SQL查询结果映射为Java对象。如果SQL查询列名和最终要映射的pojo的属性名不一致,使用resultMap将列名和pojo的属性名做一个映射关系(列名和属性名映射配置)。
<resultMap type="com.shyroke.entity.User" id="userMap">
<id column="id" property="id" />
<result column="userName" property="userName" />
<result column="passWord" property="passWord" />
</resultMap>
column的值对应着property的值,即数据库字段(column)对应着pojo对象的属性(property)。
2.1 案例一
UserMapper.java
package com.shyroke.mapper;import java.util.List;import com.shyroke.entity.User;public interface UserMapper {
public List<User> findUserByName(String userName);
}
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.shyroke.mapper.UserMapper"> <resultMap type="com.shyroke.entity.User" id="userMap">
<id column="id" property="id" />
<result column="userName" property="userName" />
<result column="passWord" property="passWord" />
</resultMap> <sql id="user_where">
<if test="_parameter !=null and _parameter.length()>0">
and userName like '%${_parameter}%'
</if>
</sql> <select id="findUserByName" parameterType="string" resultMap="userMap">
select * from user
<where>
<include refid="user_where"></include>
</where>
</select></mapper>
- where标签相当于where关键字,可以自动除去第一个and。
- 引用sql片段,如果sql片段和引用处不在同一个mapper 必须在前边加namespace.
App.java:
package com.shyrolk.firstMybatis;import java.awt.image.ImageProducer;
import java.io.InputStream;
import java.util.List;import javax.swing.plaf.synth.SynthSeparatorUI;import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import com.shyroke.entity.User;
import com.shyroke.entity.User2;
import com.shyroke.mapper.UserMapper;/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{ InputStream inputStream=App.class.getClassLoader().getResourceAsStream("resource/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); List<User> userList=userMapper.findUserByName("min");
System.out.println(userList);
sqlSession.close();
}
}
结果:

2.2 foreach- 在statement中通过foreach遍历parameterType中的集合类型
- 需求:根据多个用户id查询用户信息
- 案例:UserMapper.java
package com.shyroke.mapper;import java.util.List;import com.shyroke.entity.User;public interface UserMapper { public List<User> findUserListById(List<Integer> idList);
}
package com.shyroke.mapper;import java.util.List;import com.shyroke.entity.User;public interface UserMapper { public List<User> findUserListById(List<Integer> idList);
}
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.shyroke.mapper.UserMapper"> <resultMap type="com.shyroke.entity.User" id="userMap">
<id column="id" property="id" />
<result column="userName" property="userName" />
<result column="passWord" property="passWord" />
</resultMap> <select id="findUserListById" resultMap="userMap" >
select * from user <where>
<foreach collection="list" open="id in(" close=")" item="id"
separator=",">
#{id}
</foreach> </where>
</select></mapper>
- collection: pojo中的表示集合的属性
- open: 开始循环拼接的串
- close: 结束循环拼接的串
- item: 每次循环从集合中取到的对象
- separator: 没两次循环中间拼接的串
- index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置
App.java:
package com.shyrolk.firstMybatis;import java.awt.image.ImageProducer;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;import javax.swing.plaf.synth.SynthSeparatorUI;import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import com.shyroke.entity.User;
import com.shyroke.entity.User2;
import com.shyroke.mapper.UserMapper;/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{ InputStream inputStream=App.class.getClassLoader().getResourceAsStream("resource/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession(); UserMapper userMapper=sqlSession.getMapper(UserMapper.class); List<Integer> idList=new ArrayList<Integer>();
idList.add(2);
idList.add(4);
List<User> userList=userMapper.findUserListById(idList);
System.out.println(userList);
sqlSession.close();
}
}
结果:








