mybatis之接口式编程

首先贴上配置文件和代码

<mapper namespace="Message">

  <resultMap type="com.xvl.bean.Message" id="MessageResult">
    <id column="ID" jdbcType="INTEGER" property="id"/>
    <result column="COMMAND" jdbcType="VARCHAR" property="command"/>
    <result column="DESCRIPTION" jdbcType="VARCHAR" property="description"/>
    <result column="CONTENT" jdbcType="VARCHAR" property="content"/>
  </resultMap>

  <select id="queryMessageList"    parameterType="com.xvl.bean.Message" resultMap="MessageResult">
    select ID,COMMAND,DESCRIPTION,CONTENT from message where 1=1
    <if test="command!=null and !&quot;&quot;.equals(command.trim())">
        and COMMAND=#{command}
    </if>
    <if test="description!=null and !&quot;&quot;.equals(description.trim())">
        and DESCRIPTION like '%' #{description} '%'
    </if>
  </select>
</mapper>
 1 public List<Message> queryMessageList(String command,String description) {
 2         DBAccess dbAccess = new DBAccess();
 3         List<Message> messageList = new ArrayList<Message>();
 4         SqlSession sqlSession = null;
 5         try {
 6             Message message = new Message();
 7             message.setCommand(command);
 8             message.setDescription(description);
 9             sqlSession = dbAccess.getSqlSession();
10             // 通过sqlSession执行SQL语句
11             messageList = sqlSession.selectList("Message.queryMessageList", message);    
12         } catch (Exception e) {
13             // TODO Auto-generated catch block
14             e.printStackTrace();
15         } finally {
16             if(sqlSession != null) {
17                 sqlSession.close();
18             }
19         }
20         return messageList;
21     }
以上代码是没有用接口式编程操作方式
messageList = sqlSession.selectList("Message.queryMessageList", message);
这段代码有四处问题
第一处是namespace(Message),必须与xml文件namespace一致
第二处是id(queryMessageList),必须与xml文件namespace一致
第三处是参数message类型必须和parameterType="com.xvl.bean.Message"属性一致
第四处是返回值类型 这四处都是手写容易出现问题写错等等 总之是有风险,mybatis提供了一种能够规避这种风险的手段我们称之为接口式编程

mybatis是如何解决上述问题的呢?
1.新建一个与Message相对应的接口
 1 package com.xvl.dao;
 2 
 3 import java.util.List;
 4 
 5 import com.xvl.bean.Message;
 6 
 7 /*
 8  * 与Message配置文件相对应的接口
 9  */
10 public interface IMessage {
11     public List<Message> queryMessageList(Message message);
12 }

2.Message.xml的namespace就是包名.接口名(com.xvl.dao.IMessage)  对应的id就是接口的方法名,参数类型就是接口的参数类型 返回值和接口方法返回值一致 

 

 1 <mapper namespace="com.xvl.dao.IMessage">
 2 
 3   <resultMap type="com.xvl.bean.Message" id="MessageResult">
 4     <id column="ID" jdbcType="INTEGER" property="id"/>
 5     <result column="COMMAND" jdbcType="VARCHAR" property="command"/>
 6     <result column="DESCRIPTION" jdbcType="VARCHAR" property="description"/>
 7     <result column="CONTENT" jdbcType="VARCHAR" property="content"/>
 8   </resultMap>
 9 
10   <select id="queryMessageList"    parameterType="com.xvl.bean.Message" resultMap="MessageResult">
11     select ID,COMMAND,DESCRIPTION,CONTENT from message where 1=1
12     <if test="command!=null and !&quot;&quot;.equals(command.trim())">
13         and COMMAND=#{command}
14     </if>
15     <if test="description!=null and !&quot;&quot;.equals(description.trim())">
16         and DESCRIPTION like '%' #{description} '%'
17     </if>
18   </select>
</mapper>

 

接下来访问xml文件的方式就变成以下这样

 

 

 1 public List<Message> queryMessageList(String command,String description) {
 2         DBAccess dbAccess = new DBAccess();
 3         List<Message> messageList = new ArrayList<Message>();
 4         SqlSession sqlSession = null;
 5         try {
 6             Message message = new Message();
 7             message.setCommand(command);
 8             message.setDescription(description);
 9             sqlSession = dbAccess.getSqlSession();
10             // 通过sqlSession执行SQL语句
11             IMessage iMessage = sqlSession.getMapper(IMessage.class);//此处的iMessage已经是实现了IMessage接口的代理对象
12             messageList = iMessage.queryMessageList(message);
13         } catch (Exception e) {
14             // TODO Auto-generated catch block
15             e.printStackTrace();
16         } finally {
17             if(sqlSession != null) {
18                 sqlSession.close();
19             }
20         }
21         return messageList;
22     }    
虽然增加了一个接口类,但访问XML文件的方式变得更加规范。

 

如果mybatis遇见spring,mybatis里面总配置的数据源将会托管给spring管理,意味着db层消失,sqlSession将会托管给spring,组织对象的代码将会提交给service层组织好再传过来,紧接着通过sqlsession调用的接口式编程的代码通通由spring自动实现,整个dao层将会消失,而与配置文件相对应的接口将会小三上位变成正式 成为真正的dao层,到时候整个dao层就只剩下接口文件与配置文件。

 

posted @ 2017-11-01 21:13  花l信风  阅读(577)  评论(0编辑  收藏  举报