接口式编程
我们来考虑一行代码:
List<Message> messageList = sqlSession.selectList("Message.queryMessageList", message);
这行代码非常值得我们分析的地方有四处:
1.返回值
2.namespace–Message
3.与sql关联的id–queryMessageList
4.传入的参数–message
namesqpce:在代码中和xml中都是手写的,这就有可能出现写错的可能,会有不一致的风险,而且也不能保证xml的namespace不冲突,毕竟真实的项目不可能一个人做,如果没有一个规范的话会引发一系列的问题
与sql关联的id:同样两边都是手写,也会出现不一致的风险
传入的参数:代码上看,是Object类型,但是xml中是具体的类型
返回值:代码上看,是泛型,但是xml中是具体的类型
List<E> selectList(String statement, Object parameter);
那如何解决问题呢?
采用接口式编程
编写一个与配置sql的xml(mapper.xml)对应的接口,xml的namespace与接口的全路径类名一致,接口中定义一个方法,方法名与跟sql关联的id一致,方法的参数与parameterType一致,方法的返回值与resultType或resultMap的Type一致
接口:
package com.yhc.dao;
import com.yhc.bean.Message;
public interface IMessage {
public List<Message> queryMessageList(Message message);
}
xml:
<mapper namespace="com.yhc.dao.IMessage ">
<resultMap type="com.yhc.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.yhc.bean.Message" resultMap="MessageResult">
SELECT id, command, description, content FROM message where command like '%' #{command} '%'
</select>
</mapper>
现在这个接口就代言了这个xml,这个方法代言了这条sql语句
使用方式:
IMessage imessage = sqlSession.getMapper(IMessage.class);
messageList = imessage.queryMessageList(message);
如何规避之前所说的风险呢?
namespace相互冲突的问题不会出现了,接口的全限定名不会相同,不可能出现两个相同的接口,参数也只能传具体类型的参数,传其他的报错,返回值和方法名也一样,不能乱写