MyBatis, MyBatis-Spring 常用访问数据库的方式

一、MyBatis 访问数据库的方式

使用 MyBatis 的主要 Java 接口就是 SqlSession,可通过 SqlSessionFactoryBuilder 创建 SqlSession。

文档:MyBatis 官方文档

二、MyBatis-Spring 访问数据库的方式

文档:MyBatis-Spring 文档

先放出结论,MyBatis-Spring 访问数据库的方式主要有三种:

  1. SqlSessionTemplate
  2. MapperFactoryBean
  3. MapperScannerConfigurer

1、SqlSessionTemplate 简介:

SqlSessionTemplate 是 MyBatis-Spring 的核心,这个类负责管理 MyBatis 的 SqlSession。

SqlSessionTemplate 实现了 SqlSession 接口,这就是说,在代码中无需对 MyBatis 的 SqlSession 进行替换。 SqlSessionTemplate 通常是被用来替代默认的 MyBatis 实现的 DefaultSqlSession 。

2、SqlSessionDaoSupport 简介:
SqlSessionDaoSupport 是 一 个抽象的支持类, 用来为你提供 SqlSession 。 调用 getSqlSession() 方法你会得到一个 SqlSessionTemplate,之后可以用于执行 SQL 方法, 就像下面这样:

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
  public User getUser(String userId) {
    return (User) getSqlSession().selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
  }
}

3、MapperFactoryBean 简介:

为了代替手工使用 SqlSessionDaoSupport 或 SqlSessionTemplate 编写数据访问对象 (DAO)的代码, MyBatis-Spring 提供了一个动态代理的实现: MapperFactoryBean

如:

id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
  <property name="sqlSessionFactory" ref="sqlSessionFactory" />

即 MapperFactoryBean 创建的代理类实现了 UserMapper 接口,并且注入到应用程序中。 因为代理创建在运行时环境中(Runtime,译者注) ,那么指定的映射器必须是一个接口,而 不是一个具体的实现类。

如果 xml 映射器文件在类路径的 位置和映射器类相同时, 它会被 MapperFactoryBean 自动解析,否则需要配置 configLocation 路径来指定 mybatisConfig.xml 文件(该文件中有配置 xml 映射器文件路径)。

4、MapperScannerConfigurer 简介:

此种方式即通过 MapperScannerConfigurer 查找类路径下的映射器并自动将它们创建成 MapperFactoryBean。与 MapperFactoryBean 相比,不用在 spring.xml 文件中定义所有的 dao 类的对应的 bean 声明。

三种实现方式如下:

0、spring 公共模块的配置: dataSource 和 sqlSessionFactory:

<bean id="mysqlTestDataSource"  class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.c3p0.driverClass}"/>
    <property name="url" value="${mysql.test.jdbc.c3p0.jdbcUrl}"/>
    <property name="username" value="${mysql.test.jdbc.c3p0.user}"/>
    <property name="password" value="${mysql.test.jdbc.c3p0.password}"/>
bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="mysqlTestDataSource" />
    <property name="configLocation" value="classpath:context/mybatis/mapperConfig.xml" />
    
bean>

注:sqlSessionFactory 里配置xml映射文件的两种方式:
1、configLocation:配置 mybatisConfig.xml 文件的路径,在该文件内配置xml 映射文件的路径即可;
2、mapperLocations:配置所有 xml 映射文件路径。

方式1、使用 SqlSessionTemplate 方式:

spring.xml 配置:

 <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory" />
bean>

mapperConfig.xml (MyBatis 相关配置项):



<configuration>
    <mappers>
         <mapper resource="mappers/mysql_test/AwardMapper.xml" />
    mappers>
configuration>

AwardMapper.xml 映射文件:



<mapper namespace="AwardDao" >
    <insert id="insert" parameterType="com.wlm.test.award.Award">
        insert into award (award, count, created_time, updated_time)
        values (#{award}, #{count}, #{createdTime}, #{updatedTime})
    insert>
mapper>

注:当使用 SqlSessionTemplate 方式时,namespace 可任意。

AwardDao 接口:

public interface AwardDao {
    public void insert(Award award);
}

AwardDaoImpl 实现类:

@Repository
public class AwardDaoImpl implements AwardDao {

    @Resource(name = "sqlSessionTemplate")
    private SqlSession sqlSession;

    @Override
    public void insert(Award award) {
        sqlSession.insert("AwardDao.insert", award);
    }
}

运行测试代码:

@Test
public void awardTest() {
    Award award = new Award();
    award.setAward(2);
    awardMapper.insert(award);
}

执行结果:
这里写图片描述

方式2、MapperFactoryBean 方式:

spring.xml 配置:

id="awardDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="com.wlm.test.award.AwardDao" />
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />

AwardMapper.xml 映射文件:



<mapper namespace="com.wlm.test.award.AwardDao" >
    <insert id="insert" parameterType="com.wlm.test.award.Award">
        insert into award (award, count, created_time, updated_time)
        values (#{award}, #{count}, #{createdTime}, #{updatedTime})
    insert>
mapper>

注:此处 namespace 和 SqlSessionTemplate 方式不同。与 接口 关联时(即通过MyBatis-Spring的动态代理实现), MyBatis 通过接口的完整名称(包名+类名)查找对应的 mapper 配置,保证唯一性。

测试代码为:

@Test
public void awardTest() {
    Award award = new Award();
    award.setAward(3);
    awardDao.insert(award);
}

运行结果如下:
这里写图片描述

方式3、MapperScannerConfigurer 方式:

spring.xml 文件:


<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="com.wlm.test.award" />
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
bean>

注: 此处 AwardMapper.xml 映射文件和上方 MapperFactoryBean 方式相同。

三、如何配置多套数据库环境

使用 MyBatis-Spring 时,配置多个 dataSource 数据源,且使用 SqlSessionTemplate 的方式实现数据库访问。

在实现类中,注入不同的 SqlSesion 即可。

即:

   <bean id="sqlSessionTemplate1" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory1" />
    bean>

    <bean id="sqlSessionTemplate2" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory2" />
    bean>
@Repository
public class AwardDaoImpl implements AwardDao {

    @Resource(name = "sqlSessionTemplate1")
    private SqlSession sqlSession1;

    @Resource(name = "sqlSessionTemplate2")
    private SqlSession sqlSession2;


    @Override
    public void insert(Award award) {
        sqlSession1.insert("AwardDao.insert", award);
        sqlSession2.insert("AwardDao.insert", award);
    }
}

你可能感兴趣的:(mybatis)