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
sqlMap_province.xml:
上面两个文件,一个是接口,一个是sqlMap文件,其中要求sqlMap_province.xml的namespace是对应接口的包路径+接口名。resultType处的province可以是com.suning.schema.mabatisInterface.Province。或者通过配置文件简化类别名,下面介绍。
![](http://img.blog.csdn.net/20141008194102369?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2Vpd2VpYWkxMjM0NTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
sample-mybatis.xml:
如上:重点介绍,首先数据源配置文件-jdbc.properties,配置数据源,SqlSessionFactoryBean属性configuration是指mybatis的配置,mapperLocations属性是指sql文件地址,MapperScannerConfigurer的basePackage属性不可少,指的是接口所在包路径,这样sql---interface映射关系便建立了。
上述,MapperScannerConfigurer是通过扫描com.suning.schema.mabatisInterface包下所有接口创建对应Bean,也可以通过MapperFactoryBean一个接口一个接口的设置,不实用。
mybatisConfig.xml:
其中我主要是使用Province类的别名。从而不需要写Province类的全路径,简化配置。
这里请注意:mybatisConfig.xml和sqlMap_province.xml标签不一样,一个是Config,一个是Mapper。
<!-- 扫描@AutoWire/@Required/@Autowired -->
<context:annotation-config />
才会对该注解的类进行扫描。
![](http://img.blog.csdn.net/20141008200246126?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2Vpd2VpYWkxMjM0NTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
总结:mybatis,就是sql和接口的映射,在spring进行装配,建立联系,这里使用了批量装配的方法---MapperScannerConfigurer,在此基础上套上spring的事务。
问题分享:
AOP代理冲突:
![](http://img.blog.csdn.net/20141009091934298?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2Vpd2VpYWkxMjM0NTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
在使用MapperScannerConfigurer,将接口转化为Bean,从而可以自动注入的时候,请注意basePackage的包路径com.suning.schema.mabatisInterface上不可以有其他的代理,比如我上图这个AOP切面,也会有代理,这样子,MapperScannerConfigurer在
通过代理把接口转化为Bean的时候就会失败,我想应该是代理冲突了。
下面推荐一篇极好的文章共享给大家,关于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的时候就会失败,我想应该是代理冲突了。
相关文章推荐
- Mybatis(基于SqlSessionTemplate的实现) + Spring 练习实战
- Mybatis(基于SqlSessionTemplate的实现) + Spring 练习实战
- SSM实战——秒杀系统之DAO层实体定义、接口设计、mybatis映射文件编写、整合Spring与Mybatis
- mybatis整合spring 之 基于接口映射的多对一关系
- mybatis整合spring 之 基于接口映射的多对一关系
- mybatis实战教程(mybatis in action)之二:以接口的方式编程
- 基于SpringMVC、MyBatis、FreeMarker架构实战CMS大型门户网站
- 基于.NET平台的分层架构实战(五)——接口的设计与实现
- Juniper防火墙基于策略NAT实现与接口不同网段公网IP对内网地址的映射
- 基于.NET平台的分层架构实战(五)接口的设计与实现
- 基于eclipse的mybatis映射代码自动生成的插件
- 基于eclipse的mybatis映射代码自动生成的插件http://blog.csdn.net/fu9958/article/details/7521681
- .net企业级架构实战之5——基于接口的访问层实现
- Hibernate实战_笔记34(映射枚举、实现EnhanceUserType接口)
- Mybatis实战(五)Mapper配置文件高级映射
- mybatis实战教程(mybatis in action)之二:以接口的方式编程(转)
- Java Q&A: 抽象类和接口 - 实战练习
- [转].net企业级架构实战之5——基于接口的访问层实现
- .net企业级架构实战之5——基于接口的访问层实现
- 基于.NET平台的分层架构实战(五)——接口的设计与实现