关于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);
}
<?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>
三: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的时候就会失败,我想应该是代理冲突了。