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实例。








你可能感兴趣的:(mybatis)