Spring MVC+MyBatis开发从入门到项目实战,Spring+Spring MVC+MyBatis整合开发实战 pdf
最近公司经过对camel的研究,在之前的项目中使用camel做了很多工作。连数据库的操作都是由camel来完成的。至于使用camel操作数据库的优势,目前从我自己的经验来看,使用camel可以简化CRUD操作服务层的代码。在使用camel之前,我会有相应的服务来处理每个对象的CRUD操作。尽管这些服务中有许多只是简单地继承了一个CrudServcie,然后用泛型来限制服务所处理的实体对象。这种服务的接口和实现类很多,但是重复率极高。如果使用了camel,那么我们就可以用camel写一个通用服务,这样不管你操作的是什么实体类,传入类型和要调用的方法名称就可以了。因为涉及公司机密,我就不贴成熟的源代码了,但是我可以提供自己的清单。我觉得只要从这个清单出发,做一些改进,就能达到上述效果。
bean id= my data source destroy-method= close
属性名=driverClassName 值=com.mysql.jdbc.Driver /
property name= URL value= JDBC:MySQL://localhost:3306/test?characterEncoding=utf-8 /
属性名=用户名值=根/
属性名=密码值=fanly /
属性名称=defaultAutoCommit 值=false /
/bean
bean id=transactionManager
属性名= data source ref= my data source /
/bean
bean id=sqlSessionFactory
属性名= data source ref= my data source /
属性名=configLocation 值=classpath:SqlMapConfig.xml /
/bean
bean id=必需
属性名称= transaction manager ref= transaction manager /
属性名称=propagationBehaviorName 值=PROPAGATION_REQUIRED /
/bean
bean id=mybatis
属性名= sqlSessionFactory ref= sqlSessionFactory /
/bean
!-数据源配置结束-
注意最后一项的配置。通过mybatisComponent类,camel知道如何通过用户设置的路线与MyBatis进行交互。这个MyBatiscomponent实现了camel的组件接口。至于组件接口是做什么用的,可以参考我的博文或者查看官方手册。实际上,你可以简单地把组件理解为camelContext和其他系统之间的通信标准。不同的系统实现了组件接口,所以可以通过这个接口与camel标准API进行通信。
这里需要注意的是,MyBatisComponent有一个configurationUri属性,它的默认值是SqlMapConfig.xml,也就是说,默认情况下,MyBatisComponent会在类路径下加载sqlmapconfig.xml来初始化用户编写的一些配置和映射器文件。当然,您可以修改这个默认行为,如何修改呢?通过属性注入您的配置文件位置。这里需要指出的是,之前我们单独使用mybatis时,有一种方法是定义一个mapper接口,然后在对应的mapper.xml中设置mapper要价的命名空间作为mapper接口的完整路径,这样在运行时,mybatis就会使用mapper.xml生成的代理类作为mapper接口的实现类,为程序提供数据访问层服务。那么当我们使用MyBatisComponent与数据库交互时,是否需要定义mapper接口呢?事实证明,我们不再需要定义mapper接口,我们只需要实现mapper.xml,那么MyBatisComponent如何加载到我们已经实现的mapper.xml中呢?我们只需要在SqlMapConfig.xml中指定我们的mapper.xml文件。此示例代码的SqlMapConfig.xml文件的内容如下:
?xml版本=1.0 编码=UTF-8 ?
!DOCTYPE配置PUBLIC -//mybatis . org//DTD Config 3.0//EN http://mybatis . org/DTD/mybatis-3-Config . DTD
配置
设置
设置name= cache enabled value= true /
/设置
地图绘制者
映射器资源= com/u garden/mapper/user mapper . XML /
/地图绘制者
/配置
?xml版本=1.0 编码=UTF-8 ?
! DOCTYPE Mapper PUBLIC -//mybatis . org//DTD Mapper 3.0//EN http://mybatis . org/DTD/mybatis-3-Mapper . DTD
映射器命名空间= com。u花园。知识库。用户映射程序
结果映射id= user result type= com。u花园。实体。用户
结果属性=id 列=id /
结果属性=电子邮件列=电子邮件/
结果属性=真实姓名列=real_name /
结果属性=密码列=密码/
/结果映射
sql id=列
![CDATA[
身份证,密码、电子邮件、显示姓名、真实姓名
/sql
insert id= batchInsertUsers 参数type= list useGeneratedKeys= false
![CDATA[
插入到kf _用户(
id,
密码,
电子邮件,
真实姓名
)值
foreach collection= list item= item separator=,
![CDATA[
#{item.id},
#{item.password},
#{item.email},
#{item.realName}
/foreach
/插入
插入id=insert 参数type= com。u花园。实体。用户 useGeneratedKeys= false 密钥属性= id
![CDATA[
插入到kf _用户(
id,
密码,
电子邮件,
真实姓名
)值(
#{id},
# {密码},
# {电子邮件},
#{realName}
/插入
更新id=update 参数Type=com.ugarden.entity.User
![CDATA[
更新kf _用户集
密码=# {密码},
email=#{email},
real_name=#{realName},
在哪里
id=#{id}
/更新
删除id= deleteUsersRolesById 参数Type=string
![CDATA[
从kf _用户_角色中删除
在哪里
user_id=#{userId}
/删除
/映射器
我们在这里也设置了命名空间= com。u花园。知识库。用户映射器,但是我的项目里是没有对应的接口的,这里不设置会不会出问题在写本文的时候还没有试验。写上总是好些,免得让人感到迷茫。
User User=new User();
用户。设置电子邮件( fanly 系统。当前时间millis() @ 126。com’);
用户。设置密码( 123456 );
用户。setid(字符串。(系统的值。当前时间毫秒()));
user.setRealName(张双);
换进来=这个。骆驼语境。获取端点(“direct:start”).createExchange(ExchangePattern .InOut);
in.getIn().setBody(用户);
换出来=这个。生产者模板。发送(我的batis:插入?statementType=Insert ,in);
if (null!=out.getException()) {
扔出去。get异常();
}
略懂骆驼的童鞋们立马就明白了,这里首先通过骆驼语境获取到一个端点,然后获取到输入过程的交换对象,由于数据的来源是我们程序提供的,所以端点的上呼吸道感染就设置为直接:开始。然后将我们要添加的用户对象添加到消息对象的身体中,再将我们的消息对象路由到数据库中,我们是通过生产者模板对象向骆驼语境对象发出消息的,路由信息附加在了第一个参数中,即mybatis:插入?语句类型=插入如果你不懂这个参数的意思,去骆驼官方看看骆驼-麦巴蒂斯的说明就明白了。这句的意思大概就是告诉骆驼语境对象,我要通过框架这个成分对象调用一个名叫插入的方法,该方法的声明类型为插入类型,将消息对象身体里的数据插入到数据库。
你可能会问,你这个服务里面的生产模板,骆驼上下文是哪里来的,为什么你通过一个mybatis:插入?语句类型=插入参数,骆驼上下文就知道要去找那个成分来进行路由呢?
!-骆驼语境inti -
camel上下文id= camel trace= true xmlns= http://camel。阿帕奇。组织/架构/春天
package com.ugarden /package
/骆驼上下文
骆驼语境就是这样来的,春天一启动的时候他就存在了,如果你有多个骆驼语境实例的时候,你就要用编号来区分注入了。
那生产者模板是哪里来的呢?刚开始我也纠结这个问题,最后看了一下骆驼语境的createProducerTemplate的方法注释,发现它是和骆驼语境一起初始化的,这样就能解释为什么春天能帮我们注入了。
那骆驼如何知道mybatis:插入?语句类型=插入中框架指的是哪个呢?您还记得这段配置吗?
bean id=mybatis
属性名= sqlSessionFactory ref= sqlSessionFactory /
/bean
你看看他的ID,我想如果有多个数据源的时候,我再做如下配置:
bean id=mybatis1
属性名= sqlSessionFactory ref= sqlSessionFactory /
/bean
那么我能通过“我的batis1:insert”吗?语句类型=插入。怎么这样路由?不试试不知道吗?我写完了就试试看。camel官方的uri支持范围里绝对没有mybatis1这种东西。
现在回到文章开头的问题,如何通过camel做一个统一的服务层?很简单。我们只需要要调用的方法的名称,以及要路由到数据库的主体中的对象。难道它不能通过作为参数传入来适应所有的变化吗?从现在开始,我们只需要通过数据表生成下面的mapper.xml,感谢特殊的sql。只要是数据库的操作,我们都可以通过camel实现的一个超服务类来完成。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。