Mybatis(基于接口映射) + Spring 练习实战

关于Mybatis的Demo如下,直接重点,一边贴代码,一遍讲解本人关于mybatis在Spring的环境下如何使用以及遇到的一个很有用的问题。Mybatis是ibatis的升级版,核心是SqlSessionFactory对象的实例。

下面推荐一篇极好的文章共享给大家,关于Spring下mybatis的使用。

http://www.blogjava.net/ldwblog/archive/2013/07/10/401418.html 

一:先创建相关的pojo,java实体类,对应数据库表。

Province.java:
package com.suning.schema.mabatisInterface;

import java.io.Serializable;

//持久化所需的实体类  sqlMap.xml中需要的类 且在mybatisConfig中有体现
public class Province implements Serializable{
    private String provinceCode; 
    
    private String provinceName;
    
    public String getProvinceCode() {
        return provinceCode;
    }
    public void setProvinceCode(String provinceCode) {
        this.provinceCode = provinceCode;
    }
    public String getProvinceName() {
        return provinceName;
    }
    public void setProvinceName(String provinceName) {
        this.provinceName = provinceName;
    }
    
}

二:mybatis的sql和接口映射部分。

ProvinceMapper.java:
package com.suning.schema.mabatisInterface;

//mybatis  接口和xml对应映射
public interface ProvinceMapper {
    //根据省代码查询省的详情
    Province selectProvince(String provinceCode);
}

sqlMap_province.xml:
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
<mapper namespace="com.suning.schema.mabatisInterface.ProvinceMapper">  
<!-- 开启缓存 -->  
  <cache />  
  <select id="selectProvince" parameterType="java.lang.String"  resultType="Province">  
    SELECT 
    	PROVINCE_CODE   AS   "provinceCode",
    	PROVINCE_NAME   AS   "provinceName"
    FROM
    	PUMS_PROVINCE  P
    WHERE  
     	P.PROVINCE_CODE = #{provinceCode} 
  </select>  
</mapper> 

上面两个文件,一个是接口,一个是sqlMap文件,其中要求 sqlMap_province.xml的namespace是对应接口的包路径+接口名。resultType处的province可以是com.suning.schema.mabatisInterface.Province。或者通过配置文件简化类别名,下面介绍。

三:Spring中进行mybatis接口和sql映射的装配。

mybatis的核心jar包:


sample-mybatis.xml:
<!-- 引入jdbc配置文件 -->  
    <context:property-placeholder location="classpath:conf/jdbc.properties" /> 
    
	<!--  配置数据源 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
 		<property name="driverClassName" value="${jdbc.driverClass}" />  
        <property name="url" value="${jdbc.url}" />  
        <property name="username" value="${jdbc.user}" />  
        <property name="password" value="${jdbc.password}" />  
	</bean>
	
	<!-- 创建SqlSessionFactory -->  
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />  
        <property name="configLocation" value="classpath:conf/spring/mybatisConfig.xml"/>
        <property name="mapperLocations" value="classpath:conf/sqlMapMybatis/sqlMap_*.xml"/>
    </bean> 
	
	<!-- 转换器  MapperScannerConfigurer会把com.suning.schema.mabatisInterface下的包进行扫描 获取接口,通过代理创建Bean实例给Sp				ring进行管理-->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.suning.schema.mabatisInterface" /> 
    </bean>  
    
    <bean id="mybatisTestService" class="com.suning.schema.mabatisInterface.MybatisTestService">
	</bean>

如上:重点介绍,首先数据源配置文件-jdbc.properties,配置数据源,SqlSessionFactoryBean属性configuration是指mybatis的配置,mapperLocations属性是指sql文件地址,MapperScannerConfigurer的basePackage属性不可少,指的是接口所在包路径,这样sql---interface映射关系便建立了。


上述,MapperScannerConfigurer是通过扫描com.suning.schema.mabatisInterface包下所有接口创建对应Bean,也可以通过MapperFactoryBean一个接口一个接口的设置,不实用。

mybatisConfig.xml:
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD  Config 3.0//EN"               
"http://mybatis.org/dtd/mybatis-3-config.dtd"> 
<configuration>
	<settings>  
    	<setting name="cacheEnabled" value="true" />  
	</settings>  
	<typeAliases>  
    	<typeAlias alias="City" type="com.suning.schema.mabatisInterface.City" />  
    	<typeAlias alias="Province" type="com.suning.schema.mabatisInterface.Province" />  
	</typeAliases> 
</configuration>
推荐一篇文章,讲述该配置文件。 http://limingnihao.iteye.com/blog/1060764
其中我主要是使用Province类的别名。从而不需要写Province类的全路径,简化配置。

这里请注意:mybatisConfig.xml和sqlMap_province.xml标签不一样,一个是Config,一个是Mapper。


四:创建调用ProvinceMapper的service业务类。

package com.suning.schema.mabatisInterface;

import org.springframework.beans.factory.annotation.Autowired;

//mabitis测试的业务类
public class MybatisTestService {

    @Autowired
    private ProvinceMapper provinceMapper;

    @Autowired
    private CityMapper cityMapper;
    
    public Province getProvinceDetail(String provinceCode){
        Province province = provinceMapper.selectProvince(provinceCode);
        return province;
    }
    
    public City selectCity(City city){
        City cityDetail = cityMapper.selectCity(city);
        return cityDetail;
    }
    
}
通过autowised注入,注意需要加入
<!-- 扫描@AutoWire/@Required/@Autowired -->
<context:annotation-config />
才会对该注解的类进行扫描。

五:控制层。

package com.suning.schema.mabatisInterface;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.suning.sample.web.JsonBean;

@Controller
@RequestMapping(value = "/p")
public class MybatisTestController {

    @Autowired
    private MybatisTestService mybatisTestService;

    @ResponseBody
    @RequestMapping(value = "/mybatis.action")
    public JsonBean getProvinceDetail(HttpServletRequest request) {
        String provinceCode = request.getParameter("provinceCode");
        JsonBean jsonBean = new JsonBean();
        Province province = mybatisTestService.getProvinceDetail(provinceCode);
        jsonBean.setData(province);
        jsonBean.setResult(true);
        return jsonBean;
    }
}

六:结果。




总结:mybatis,就是sql和接口的映射,在spring进行装配,建立联系,这里使用了批量装配的方法--- MapperScannerConfigurer,在此基础上套上spring的事务。

问题分享:
AOP代理冲突:


在使用MapperScannerConfigurer,将接口转化为Bean,从而可以自动注入的时候,请注意basePackage的包路径com.suning.schema.mabatisInterface上不可以有其他的代理,比如我上图这个AOP切面,也会有代理,这样子,MapperScannerConfigurer在
通过代理把接口转化为Bean的时候就会失败,我想应该是代理冲突了。
















  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值