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 !"".equals(command.trim())"> and COMMAND=#{command} </if> <if test="description!=null and !"".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 !"".equals(command.trim())"> 13 and COMMAND=#{command} 14 </if> 15 <if test="description!=null and !"".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层就只剩下接口文件与配置文件。