Mybatis记录摘要

这里我只想记录我项目中使用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实例。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值