三、MyBatis系列:Mapper 映射 之 使用POJO实体来接收数据和传入参数
1、首先定义一个接收数据的实体 User 类型,还有一个输入参数的 UserQuery 类型。
1 public class User { 2 public int id; 3 public String username; 4 public Date birthday; 5 public String sex; 6 public String address; 7 } 8 public class UserQuery { 9 private String orderByClause; 10 private List<Criteria> oredCriteria; 11 public void addUserNameLike(String username) { 12 oredCriteria.add(new Criteria(" username like ", username)); 13 } 14 public void addSexGreaterThan(int value) { 15 oredCriteria.add(new Criteria(" sex > ", value)); 16 } 17 public class Criteria { 18 private String conditia; 19 private Object value; 20 public Criteria(String conditia, Object value) { 21 this.conditia = conditia; 22 this.value = value; 23 } 24 } 25 }
2、现在需要配置一个更加复杂一些的 mapper 映射文件
- 定义了resultMap,用于将实体属性与SQL字段进行映射。这里返回的最终 pojo 为 User 类型。
- id 表示为主键属性和字段的映射,若有多个主键需定义多个 id;
- result 表示其它属性和字段的映射;
- 定义了 sql 片断,如:user_columns、user_where,这样就可以在任意SQL脚本中引用了,方便维护;
- user_colums 中定义了 ${alias} 占位符,在引用该片断时定义占位符的值;
- user_where 用于定义查询条件的sql片断,foreach 用于循环一个集合,用于重复产生节内的 sql 语句。
- oredCriteria 值为 UserQuery 的成员名称,
- criteria 为语句中的私有变量名。
- separator="and" 表示拼接语句时使用 and 间隔开来。
- 定义 select 时使用了 UserQuery 做为传入参数,返回类型使用了 resultMap 类型 userMap;
- 使用 include 来引入一个 sql 片断,并且可以为其它设定属性值;
- 使用 if test 进行判断,满足条件才使用 if 节内的 sql 语句;
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.3//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4 <mapper namespace="test"> 5 <resultMap type="cn.xleos.mybatis.po.User" id="userMap"> 6 <id column="id" property="id" /> 7 <result column="username" property="username" /> 8 <result column="birthday" property="birthday" /> 9 <result column="sex" property="sex" /> 10 <result column="address" property="address" /> 11 </resultMap> 12 <sql id="user_columns"> 13 ${alias}id, ${alias}username, ${alias}birthday, 14 ${alias}sex, ${alias}address, ${alias}attrs 15 </sql> 16 <sql id="user_where"> 17 <where> 18 <foreach collection="oredCriteria" item="criteria" separator="and"> 19 ( ${criteria.condition} #{criteria.value} ) 20 </foreach> 21 </where> 22 </sql> 23 <select id="getUserByQuery" parameterType="cn.xleos.mybatis.po.UserQuery" 24 resultMap="userMap"> 25 SELECT 26 <include refid="user_columns"> 27 <property name="alias" value="" /> 28 </include> 29 FROM user 30 <if test="_parameter != null"> 31 <include refid="user_where" /> 32 </if> 33 <if test="oredCriteria != null"> 34 order by ${orderByClause} 35 </if> 36 </select> 37 </mapper>
3、通过单元测试来看看结果如何
首先要创建 UserQuery 的查询POJO对象,再添加条件和排序字段;
因为mapper映射文件中已经指定了返回类型为User,那么多条记录返回就是 List<User>类型;
1 public class MybatisMapperTest { 2 @Test 3 public void queryUserTest(){ 4 SqlSession sqlSession = sqlSessionFactory.openSession(); 5 try { 6 UserQuery userQuery = new UserQuery(); 7 userQuery.setOrderByClause("birthday"); 8 userQuery.addUserNameLike("张%"); 9 10 List<User> users = sqlSession.selectList("test.getUserByQuery", userQuery); 11 System.out.println(users); 12 } finally { 13 sqlSession.close(); 14 } 15 } 16 }
通过跟踪日志可以看到所产生的SQL脚本如下,产生的和预期一致:
DEBUG [main] - ==> Preparing: SELECT id, username, birthday, sex, address FROM user WHERE ( username like ? ) order by birthday
DEBUG [main] - ==> Parameters: 张%(String)