三、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)

 

posted @ 2015-06-27 18:19  夏亮  阅读(2856)  评论(0编辑  收藏  举报