设为首页 收藏本站
查看: 1987|回复: 0

[经验分享] Mybatis记录摘要

[复制链接]

尚未签到

发表于 2016-11-25 01:19:32 | 显示全部楼层 |阅读模式
这里我只想记录我项目中使用Mybatis3.0的时候注解方式调用的配置以及一些碰到的问题。应付一般简单的操作是可以的。复杂的具体问题具体分析。
首先是spring配置Mybatis:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxActive" value="20"/>
<property name="maxWait" value="100"/>
<property name="poolPreparedStatements" value="true"/>
<property name="defaultAutoCommit" value="false"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" autowire="byName" />
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.**" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

从配置中可以看出我使用了mapper映射接口。
再看看mapper接口里面怎么调用一个查询的存储过程:

public interface UserMapper {
@Select("{CALL usp_GetUser(#{account,mode=IN,jdbcType=VARCHAR})}")
@Options(statementType = StatementType.CALLABLE)
@Results(value = {
@Result(property="id", column="UserID"),
@Result(property="account", column="Account"),
@Result(property="username", column="UserName")
})
public User findByAccount(String account);
}

是不是很酷? 就这样的一个接口方法,配置一些注解,一个调用usp_GetUser的存储过程的功能就完成了。这里需要提几个点:
1:Mybatis在这样的方式传递参数的时候不允许多参数传递,如果需要有多参数传递的话,需要将参数封装成Map对象,在注解里面调用存储过程的时候或者写SQL的时候,传递的就是Map里面对应的KEY值。
2:注解里面有个@Results标签,用来封装数据到对象,这里就是匹配列与字段,根据你方法的返回值进行匹配字段的封装成一个对象,如果查询出来的是一个结果集,比如上例中的User对象查出来是一组User的结果集的话,什么都不用修改,只需要修改方法的返回类型为List<User>就OK了。是不是很方便?给组代码做例子:

@Select("{CALL usp_GetDocumentByIDList(#{documentIds,mode=IN,jdbcType=VARCHAR})}")
@Options(statementType = StatementType.CALLABLE)
@Result(javaType = Document.class)
@Results(value = {
@Result(property="documentID", column="DocID"),
@Result(property="region", column="RegionID"),
@Result(property="template", column="TemplateID"),
@Result(property="isIngested", column="IsIngested"),
@Result(property="extID", column="ExtID"),
@Result(property="title", column="DocTitle"),
@Result(property="content", column="DocXML"),
@Result(property="modifiedDate", column="ModifiedDate"),
@Result(property="user", column="UserID"),
@Result(property="regionName", column="RegionName"),
@Result(property="productName", column="ProductName"),
@Result(property="contentTypeName", column="ContentTypeName"),
@Result(property="templateName", column="TemplateName")
})
public List<Document> getDocumentsByIDs(String documentIds);

这样的代码是否让你看着很舒服?而且一眼就能知道它的目的是什么,想干嘛?
我在这里不想争论关于注解和配置文件孰优孰劣,老掉牙的问题。不同的方式用在不同的需求中才是真理。这样的代码不会给我的维护带来什么问题,而且不存在配置文件安全问题,而且可读性高。我选择它。
最后付几个关于Update和insert的调用方式的代码:

@Update("{CALL usp_UpdDocument(#{region,mode=IN,jdbcType=VARCHAR}," +
"#{product,mode=IN,jdbcType=INTEGER}," +
"#{contentType,mode=IN,jdbcType=INTEGER}," +
"#{template,mode=IN,jdbcType=INTEGER}," +
"#{title,mode=IN,jdbcType=VARCHAR}," +
"#{content,mode=IN,jdbcType=VARCHAR}," +
"#{user,mode=IN,jdbcType=INTEGER}," +
"#{createDate,mode=IN,jdbcType=DATE}," +
"#{stampedDate,mode=IN,jdbcType=DATE}," +
"#{modifiedDate,mode=IN,jdbcType=DATE}," +
"#{expireDate,mode=IN,jdbcType=DATE}," +
"#{publishDate,mode=IN,jdbcType=DATE}," +
"#{documentID,mode=IN,jdbcType=INTEGER})}" )
@Options(statementType = StatementType.CALLABLE)
public void update(Document document);



@Insert("{CALL usp_AddDocument(#{region,mode=IN,jdbcType=VARCHAR}," +
"#{product,mode=IN,jdbcType=INTEGER}," +
"#{contentType,mode=IN,jdbcType=INTEGER}," +
"#{template,mode=IN,jdbcType=INTEGER}," +
"#{isIngested,mode=IN,jdbcType=BIT}," +
"#{extID,mode=IN,jdbcType=INTEGER}," +
"#{title,mode=IN,jdbcType=VARCHAR}," +
"#{createDate,mode=IN,jdbcType=DATE}," +
"#{stampedDate,mode=IN,jdbcType=DATE}," +
"#{modifiedDate,mode=IN,jdbcType=DATE}," +
"#{expireDate,mode=IN,jdbcType=DATE}," +
"#{publishDate,mode=IN,jdbcType=DATE}," +
"#{documentID,mode=OUT,jdbcType=INTEGER})}" )
@Options(statementType = StatementType.CALLABLE)
public void create(Document document);


这里说明下关于mapper只需要在spring service层对其进行注入就OK了,spring会给Mapper注入一个动态代理的Mapper实例。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-304934-1-1.html 上篇帖子: 从 iBatis 到 MyBatis(转) 下篇帖子: mybatis的basedao
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表