我们知道在使用mybatis的所有操作都基于Sqlsession对象,而Sqlsession是由SqlSessionFactory产生的,而SqlSessionFactory又是由SqlSessionFactoryBuilder创建的。但是Mybatis-Spring是基于SqlSessionFactoryBean的,在使用Mybatis-Spring的时候,SqlSession也是由SqlSessionFactory来产生的,但是Mybatis-Spring给我们封装了一个SqlSessionFactoryBean,在这个bean里面还是通过SqlSessionFactoryBuilder来建立对应的SqlSessionFactory,进而获取到对应的SqlSession。通过SqlSessionFactoryBean我们可以通过对其指定一些属性来提供Mybatis的一些配置信息。所以接下来我们需要在Spring的applicationContext配置文件中定义一个SqlSessionFactoryBean。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:config/mapper/*.xml"/>
</bean>
接下来就是在Spring的applicationContext文件中定义我们想要的Mapper对象对应的MapperFactoryBean了。通过MapperFactoryBean可以获取到我们想要的Mapper对象。MapperFactoryBean实现了Spring的FactoryBean接口,所以MapperFactoryBean是通过FactoryBean接口中定义的getObject方法来获取对应的Mapper对象的。在定义一个MapperFactoryBean的时候有两个属性需要我们注入,一个是Mybatis-Spring用来生成实现了SqlSession接口的SqlSessionTemplate对象的sqlSessionFactory;另一个就是我们所要返回的对应的Mapper接口了。
定义好相应Mapper接口对应的MapperFactoryBean之后,我们就可以把我们对应的Mapper接口注入到由Spring管理的bean对象中了,比如Service bean对象。这样当我们需要使用到相应的Mapper接口时,MapperFactoryBean会从它的getObject方法中获取对应的Mapper接口,而getObject内部还是通过我们注入的属性调用SqlSession接口的getMapper(Mapper接口)方法来返回对应的Mapper接口的。这样就通过把SqlSessionFactory和相应的Mapper接口交给Spring管理实现了Mybatis跟Spring的整合。
<bean id="personMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="cn.com.mybatis.dao.mapper.PersonMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
代码:
spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd"
default-lazy-init="false">
<!-- 数据 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/lpWeb"/>
<property name="username" value="root"/>
<property name="password" value="root123"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:config/mapper/*.xml"/>
</bean>
<bean id="personMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="cn.com.mybatis.dao.mapper.PersonMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
</beans>
映射接口
package cn.com.mybatis.dao.mapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import cn.com.mybatis.mapper.Person;
public interface PersonMapper {
public List<Person> getPerson();
public void update(Map map);
public void insert(Map map);
@Select("select * from person where user_name like '%${username}%' and (age = ${age} or age is null)")
public List<Person> queryPersonList(Map map);
}
映射文件PersonMapper.xml
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.com.mybatis.dao.mapper.PersonMapper">
<resultMap type="cn.com.mybatis.mapper.Person" id="personmap">
<id column="USER_NAME" property="username" javaType="string" jdbcType="VARCHAR"/>
<result column="SEX" property="sex" javaType="string" jdbcType="VARCHAR"/>
<result column="AGE" property="age" javaType="int" jdbcType="INTEGER"/>
</resultMap>
<select id="getPerson" resultMap="personmap">
select * from person
</select>
<insert id="insert" parameterType="java.util.Map">
insert into person (USER_NAME, SEX, AGE) values (
#{username}, #{sex}, #{age}
)
</insert>
<update id="update">
update person set AGE = #{age}
where USER_NAME = #{username}
</update>
<delete id="delete">
delete from person;
</delete>
</mapper>
Person类
package cn.com.mybatis.mapper;
public class Person {
private String username;
private String sex;
private int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [username=" + username + ", sex=" + sex + ", age=" + age + "]";
}
}
测试类TestPersonMapper
package mybatis;
import java.util.HashMap;
import java.util.Map;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.com.mybatis.dao.mapper.PersonMapper;
public class TestPersonMapper {
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext("classpath*:spring-mybatis2.xml");
PersonMapper personMapper = (PersonMapper) cpx.getBean("personMapper");
System.out.println(personMapper.getPerson());
// Map map = new HashMap();
// map.put("username", "as");
// map.put("sex", "boy");
// map.put("age", 26);
// personMapper.insert(map);
Map map = new HashMap();
map.put("username", "as");
map.put("age", 26);
System.out.println(personMapper.queryPersonList(map));
}catch(Exception e){
e.printStackTrace();
}
}
}