)
]]>
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]
lt;/camelContext>
那producerTemplate是哪里来的呢?刚开始我也纠结这个问题,最后看了一下camelContext的createProducerTemplate的方法注释,发现它是和camelContext一起初始化的,这样就能解释为什么spring能帮我们注入了。
那camel如何知道"mybatis:insert statementType=Insert"中mybatis指的是哪个呢?您还记得这段