MyBatis是一个优秀的轻量级持久化框架,本文主要介绍MyBatis与Spring集成的配置与用法。

1. Spring MyBatis配置

1.1 添加Maven依赖

在pom.xml文件里添加mybatis-spring和mybatis的依赖:

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>

mybatis-spring当前最新版本为1.2.2,mybatis当前版本是3.2.5.

1.2 添加dao接口

这里的dao必须是接口,而不是具体的实现,如MyBatisDao.java内容为:

public interface MyBatisTest {
public String getUserNameById(int id);
public List<Students> getStudentByNumAndCity(Map<String, Object> queryMap);
}

接口中定义的每一个方法对应于mapper映射文件中定义的jdbc执行模块,如<select/><update/><insert/>等。

1.3 添加mybatis配置文件

该配置文件里主要配置类型别名<typeAliases/>、设置<settings/>,mapper映射文件路径<mappers/>也可以放在这里,但更建议将所有的mapper文件都放在一个目录下,在定义sqlSessionFactory时通过属性mapperLocations指定。如mybatis.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>
<typeAliases>
<typeAlias type="com.sohu.tv.bean.Students" alias="Students"/>
</typeAliases>
<!--<mappers>-->
<!--<mapper resource="com/sohu/tv/mapper/MybatisTest.xml"/>-->
<!--</mappers>-->
</configuration>

类型别名是用别名来代表全限定类名,如在需要用到com.sohu.tv.bean.Students的地方,都可以使用Students来代替。

1.4 添加mapper映射文件:

mapper映射文件可以定义数据库列与POJO类属性的映射,以及与dao接口类中的方法对应的JDBC执行模块,如MyBatisMapper.xml的内容为:

<mapper namespace="com.sohu.tv.dao.MyBatisTest">
<resultMap id="studentMap" type="Students">
<result column="name" property="name"/>
<result column="sex" property="sex"/>
<result column="number" property="number"/>
<result column="enable" property="enable"/>
<result column="city" property="city"/>
</resultMap>
<select id="getUserNameById" parameterType="int" resultType="String">
select name from students where id = #{id}
</select>
<select id="getStudentByNumAndCity" parameterType="map" resultMap="studentMap">
select * from students where number = #{num} and city = #{city}
</select>
</mapper>

<resultMap/>即定义列与属性的字段映射;<select/>中的参数和返回值的类型,既可以为基本类型,如string,int,long,也可以是map,返回类型还可以是<resultMap/>定义的映射map;如果参数类型是map,则sql中的参数名(如#{num})必须是map的key;如果返回类型为map,则sql语句中返回的列名为key;如果是基本类型,使用type,如parameterType,resultType,如果是自定义map,使用parameterMap,resultMap.

1.5 Spring配置文件的配置

首先需要配置sqlSessionFactory:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="feedbackDataSource"/>
<property name="configLocation" value="classpath:mybatis.xml"/>
<property name="mapperLocations" value="classpath:com/sohu/tv/mapper/*.xml"/>
</bean>

属性dataSource引用JDBC数据源;属性configLocation指定mybatis配置文件的位置,配置文件中定义别名<typeAliases/>,设置<settings/>等。mapperLocations指定mapper映射文件的路径。有一点需要注意的是,要确保mapper映射文件被打包进classpath中,默认情况下,maven会忽略源文件中的资源文件,可以通过在pom文件中配置,使得资源文件被一起打包进classpath中;如在pom配置文件中添加:

<build>
<resources>
<resource>
<directory>src/main/java</directory>
<excludes><exclude>**/*.java</exclude></excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>

其次,需要定义与dao接口相关联的mapperFactoryBean:

<bean id="mybatisDaoImpl" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.sohu.tv.dao.MyBatisTest"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

mapperInterface属性的值为相关的dao接口,sqlSessionFactory属性引用了上述定义的sqlSessionFacotry;

1.6 service类中调用dao类实现业务逻辑

在MyBatisServiceImpl.java中使用dao接口中提供的方法:

@Resource(name = "mybatisDaoImpl")
MyBatisDao myBatisDaoImpl;
String userName = mybatisDaoImpl.getUserNameById(2);
System.out.println(userName);
Map<String, Object> queryMap = new HashMap<String, Object>();
queryMap.put("num", 333);
queryMap.put("city", "beijing");
List<Students> studentsList = mybatisDaoImpl.getStudentByNumAndCity(queryMap);
for (Students students: studentsList) {
System.out.println(students.getName());
}

2. 启动自动扫描注解

我们可以在applicationContext.xml配置文件里为每个dao接口定义bean,但mybatis还提供了一种更简便的自动扫描注解的机制,即<mybatis:scan/><MapperScannerConfigurer/>。 配置<mybatis:scan/>,需要在applicationContext.xml配置文件里添加:

<mybatis:scan base-package="com.sohu.tv.dao"/>

<mybatis:scan/>与Spring的<context:component-scan/>非常相似,base-package指定要扫描的包,并将包下的所有接口注册为对应的bean。命名规则:和Spring一样,如果该接口没有被注解,则bean的名称为首字母小写的非限定类名,如接口为com.sohu.tv.dao.MyBatisDao,则bean的名字为myBatisDao;如果dao接口使用了Spring的注解,如@Component或@Named等注解,并提供了bean的名称,则mybatis使用该注解的名称作为bean的名称。如将MyBatisDao接口重定义如下:

@Repository(value = "mybatisDao")
public interface MyBatisDao {
public String getUserNameById(int id);
public List<Students> getStudentByNumAndCity(Map<String, Object> queryMap);
}

测试MyBatisDao被自动注解后的bean的名称为mybatisDao。建议通过注解指定bean的名称,防止类类名的变化导致了bean名称的变化;

配置<MapperScannerConfigurer/>,需要在applicationContext.xml中添加:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.sohu.tv.dao"/>
<property name="sqlSessionFactoryBeanName" value = "sqlSessionFactory"/>
</bean>

这里的basePackage<mybatis:scan/>base-package的含义一致,bean的命名规则也是一样的,所以这两种方式等价。

如果启动了自动扫描注解,则在spring配置文件中不再需要dao接口的bean定义了。

3. 总结-最佳实践

  • mapper映射文件放在单独的目录中,统一管理,在配置sqlSessionFactory时,通过属性mapperLocations指定;
  • mybatis配置文件中只定义typeAliasessettings等配置信息;
  • Spring配置文件中,通过<mybatis:scan/>或者<MapperScannerConfigurer/>启动自动注解,并通过Spring的注解对bean命名。

Spring持久化之MyBatis的更多相关文章

  1. ssm(spring,spring mvc,mybatis)框架

    ssm框架各个技术的职责 spring :spring是一个IOC DI AOP的 容器类框架 spring mvc:spring mvc 是一个mvc框架 mybatis:是一个orm的持久层框架 ...

  2. spring MVC、mybatis配置读写分离

    spring MVC.mybatis配置读写分离 1.环境: 3台数据库机器,一个master,二台slave,分别为slave1,slave2 2.要实现的目标: ①使数据写入到master ②读数 ...

  3. Spring、Spring MVC、MyBatis整合文件配置详解

    原文  http://www.cnblogs.com/wxisme/p/4924561.html 主题 MVC模式MyBatisSpring MVC 使用SSM框架做了几个小项目了,感觉还不错是时候总 ...

  4. spring mvc与mybatis收集到博客

    mybaits-spring 官方教程 http://mybatis.github.io/spring/zh/ SpringMVC 基础教程 框架分析 http://blog.csdn.net/swi ...

  5. spring.net 和 mybatis.net

    demo是整合现有的spring.net 和 mybatis.net 完成的控制台程序,需要注意的地方:关于Config文件夹中的config文件的属性设定:同时保证Providers.config默 ...

  6. 搭建Spring、Spring MVC、Mybatis和Freemarker

    搭建Spring.Spring MVC.Mybatis和Freemarker 1.pom文件 <project xmlns="http://maven.apache.org/POM/4 ...

  7. Spring Mvc和Mybatis的多数据库访问配置过程

    Spring Mvc 加Mybatis的多数据库访问源配置访问过程如下: 在applicationContext.xml进行配置 <?xml version="1.0" en ...

  8. Spring、Spring MVC、MyBatis

    Spring.Spring MVC.MyBatis整合文件配置详解 使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. Sp ...

  9. IDEA下创建Maven项目,并整合使用Spring、Spring MVC、Mybatis框架

    项目创建 本项目使用的是IDEA 2016创建. 首先电脑安装Maven,接着打开IDEA新建一个project,选择Maven,选择图中所选项,下一步. 填写好GroupId和ArtifactId, ...

随机推荐

  1. memcached 命令详解

    memcached::get(); //查找key的值: 例:$mem->get($key): memcached::add() ; //添加,当key存在时,false,当key不存在则执行 ...

  2. [Xcode 实际操作]一、博主领进门-(14)在顶部状态栏显示风火轮以及为应用程序添加应用图标

    目录:[Swift]Xcode实际操作 本文将演示在顶部状态栏显示风火轮. 主要用于在执行某个长时间动作时,提示用户耐心等待动作的执行. 在项目导航区,打开视图控制器的代码文件[ViewControl ...

  3. PHP不重新编译,单独添加模块扩展的方法

    php自身提供了很多扩展,比如curl,gmp, mbstring等.我们在编译安装php时未必安装了所有扩展.那么在安装完php后,如果想单独安装某个php自身的扩展怎么办呢? 我们以curl扩展模 ...

  4. ADO学途 four day 数据库左右连接

    数据库的多表操作 数据库用于存放用户数据,用户数据库的数据又会有不同表来存放不同类型的数据,这这是就会产生多 张表来满足需求.列如,部门表有市场部,技术部,行政部等.,子表就有员工具体信息表用来存放员 ...

  5. JMeter提取和重用作为变量 - 具有更多提取器

    这是我们最受欢迎的博文,我们添加了更多提取器.这篇文章解释了如何使用正则表达式提取器从第一个请求的响应中提取密钥,并将提取的密钥用于后续请求.我们称之为JMeter Extract并重复使用. 现在您 ...

  6. ZOJ How Many Nines 模拟 | 打表

    How Many Nines Time Limit: 1 Second      Memory Limit: 65536 KB If we represent a date in the format ...

  7. Redis基础理论

    一.概述 二.数据类型 STRING LIST SET HASH ZSET 三.数据结构 字典 跳跃表 四.使用场景 计数器 缓存 查找表 消息队列 会话缓存 分布式锁实现 其它 五.Redis 与 ...

  8. 牛客网Java刷题知识点之Iterator和ListIterator的区别

    不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?query=&asc=true&order=&page=21 ...

  9. HDU4405 Aeroplane chess(期望dp)

    题意 抄袭自https://www.cnblogs.com/Paul-Guderian/p/7624039.html 正在玩飞行棋.输入n,m表示飞行棋有n个格子,有m个飞行点,然后输入m对u,v表示 ...

  10. IE下的圆角

    元素{ position: relative;/*必须*/ z-index: 10;/*必须*/ border-radius: 8px; -moz-border-radius: 8px; -webki ...