一、简介
Spring和Mybatis是两个非常出名的框架,Spring主要用于Java服务器端的开发,而MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
二、整合步骤
现假设我们已经建好了一个Web项目,并且导入了相关的包,并且已经创建了一个数据库。下面开始整合Mybatis的部分。
1、修改Spring配置文件ApplicationContext.xml
第一步首先要Mybatis链接数据库,需要用到jdbc的包中的Driver类,我本地用的是mysql数据库,3306是mysql的默认端口。下面是Mybatis链接数据库的配置方式:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/db?characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
那么完成了数据库的链接,下一步需要什么呢?Mybatis中访问数据库是通过sqlSession对象来访问的,而sqlSession对象是由sqlSessionFactory生成的。在Spring+Mybatis中,就需要把这两个对象封装到bean中。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--在sqlSessionFactory的bean中要指定数据源-->
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:com/phone/api/mapper/*Mapper.xml" />
</bean>
<!-- 配置SQLSession模板 -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--需要往sqlSessionFactory注入依赖-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
接下来是化腐朽为神奇的一步,使用MapperScannerConfigurer来创建数据映射器,这样程序会自动检测你的项目,自动注册Mapper对应的MapperFactoryBean对象。(其实每个映射都是一个MapperFactoryBean,当你有多个Mapper的时候,使用MapperScannerConfigurer会更加方便!)其中basePackage指的就是你的Mapper所在的包的位置。
<!-- mybatis mapper 扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.phone.api.mapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
到此配置文件已经配置结束了,接下来我们去看看我们的Mapper。
2、Mapper接口与XML文件
Mybatis相较于JDBC更便捷的地方就在于,它大部分的过程都在XML文件中完成了。我们一般会写一个Mapper的接口,里面是你需要用到的函数;另外在XML文件中写上与接口中同名的标签,在标签里写sql语句,当你调用Mapper接口中的函数的时候,实际上执行的是相应的sql语句。
下面来看两段接口与XML的代码:
GSearchTopMapper.Java
package com.phone.api.mapper;
//……各种包我就不放上来占空间了
public interface GSearchTopMapper {
public List<Data> getSearch(@Param("keyword")String keyword,int page,int pageSize);
}
GSearchTopMapper.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.phone.api.mapper.GSearchTopMapper">
<select id="getSearch" resultType="com.phone.api.entity.Data">
SELECT
skuname1 AS phoneName,
url AS url,
imgurl AS imageUrl,
IFNULL(FORMAT(min(phoneprice+0),2),'0') price,
(goodsay*100) score
FROM `tb`
WHERE 1 =1
<if test="#{keyword}!=''"> and skuname like CONCAT('%', #{keyword}, '%') </if>
</mapper>
可以看到接口在com.phone.api.mapper下,也就是MapperScannerConfigurer的basePackage下。里面有个getSearch方法,里面用到@Param注解,把调用该方法时传入的参数“keyword”传到keyword中。
再来看看XML文件,有一个mapper标签,其namespace属性写的是它的mapper接口的名称,同时也是该XML文件的名称(mapper的接口和XML文件必须同名)。里面有个select标签,其id与Mapper中的getSearch方法同名,而它返回的类型resultType是一个Data对象。其中有一个if标签,因为Mybatis中没有if语句,所以要用if标签。#{keyword}是XML中使用传进来的参数的方式。这些和框架整合没太大关系就不赘述了。
重要的有三点:
a.Mapper的接口和XML文件必须同名
b.接口的方法与标签的id要同名
c.mapper标签的namespace要指明所在的位置
当你用接口中的方法传入参数去查询数据库的时候,就能返回相应的数据啦!在这里返回的结果是List< Data>类型的数据。
从这里我们也可以知道,简介中所说的“MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(普通的 Java对象)映射成数据库中的记录”是怎样的情况了,其返回的结果就是对象Data的List。