您的位置:首页 > 编程语言 > Java开发

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

2014-10-08 19:21 363 查看
关于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>
推荐一篇文章,讲述该配置文件。/article/4080073.html
其中我主要是使用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的时候就会失败,我想应该是代理冲突了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: