springmvc camel mybatis集成实例及分析 (二)

2014-11-24 11:54:52 · 作者: · 浏览: 13
ealName}
)
]]>


INSERT INTO kf_user (
id ,
password ,
email ,
real_name
) VALUES (
#{id} ,
#{password} ,
#{email} ,
#{realName}
)
]]>


UPDATE kf_user SET
password = #{password} ,
email = #{email} ,
real_name = #{realName} ,
WHERE
id = #{id}
]]>


DELETE FROM kf_user_role
WHERE
user_id = #{userId}
]]>


我们在这里也设置了 namespace="com.ugarden.repository.UserMapper",但是我的项目里是没有对应的接口的,这里不设置会不会出问题在写本文的时候还没有试验。写上总是好些,免得让人感到迷茫。
那么我们如何通过camel的API来操作数据库呢?下面是UserServcie.java的内容:


[java]
@Service
public class UserService {
@Autowired
private ProducerTemplate producerTemplate;
@Autowired
private CamelContext camelContext;

public void insertUser() throws Exception {

//init test user entity
User user = new User();
user.setEmail("fanly" + System.currentTimeMillis() + "@126.com");
user.setPassword("123456");
user.setId(String.valueOf(System.currentTimeMillis()));
user.setRealName("张双");

Exchange in = this.camelContext.getEndpoint("direct:start").createExchange(ExchangePattern.InOut);
in.getIn().setBody(user);

Exchange out = this.producerTemplate.send("mybatis:insert statementType=Insert", in);

if (null != out.getException()) {
throw out.getException();
}

}
}

@Service
public class UserService {
@Autowired
private ProducerTemplate producerTemplate;
@Autowired
private CamelContext camelContext;

public void insertUser() throws Exception {

//init test user entity
User user = new User();
user.setEmail("fanly" + System.currentTimeMillis() + "@126.com");
user.setPassword("123456");
user.setId(String.valueOf(System.currentTimeMillis()));
user.setRealName("张双");

Exchange in = this.camelContext.getEndpoint("direct:start").createExchange(ExchangePattern.InOut);
in.getIn().setBody(user);

Exchange out = this.producerTemplate.send("mybatis:insert statementType=Insert", in);

if (null != out.getException()) {
throw out.getException();
}

}
}


略懂camel的童鞋们立马就明白了,这里首先通过camelContext获取到一个Endpoint,然后获取到输入过程的Exchange对象,由于数据的来源是我们程序提供的,所以endpoint的uri就设置为direct:start。然后将我们要添加的user对象添加到message对象的body中,再将我们的message对象路由到数据库中,我们是通过producerTemplate对象向camelContext对象发出消息的,路由信息附加在了第一个参数中,即"mybatis:insert statementType=Insert"如果你不懂这个参数的意思,去camel官方看看camel-mybatis的说明就明白了。这句的意思大概就是告诉camelContext对象,我要通过mybatis这个component对象调用一个名叫insert的方法,该方法的statement类型为Insert类型,将Message对象body里的数据插入到数据库。
你可能会问,你这个service里面的producerTemplate,camelContext是哪里来的,为什么你通过一个"mybatis:insert statementType=Insert"参数,camelContext就知道要去找那个component来进行路由呢?
莫慌,请看spring根配置文件的如下配置内容:
[html]

http://camel.apache.org/schema/spring">
com.ugarden
lt;/camelContext>


http://camel.apache.org/schema/spring">
com.ugarden
camelContext就是这样来的,spring一启动的时候他就存在了,如果你有多个camelContext实例的时候,你就要用id来区分注入了。
那producerTemplate是哪里来的呢?刚开始我也纠结这个问题,最后看了一下camelContext的createProducerTemplate的方法注释,发现它是和camelContext一起初始化的,这样就能解释为什么spring能帮我们注入了。
那camel如何知道"mybatis:insert statementType=Insert"中mybatis指的是哪个呢?您还记得这段