整合 Spring 与 Mybatis 框架

所有的配置文件

// IDEA项目中resources文件夹的结构
log4j.properties        // 日志属性文件
db.properties           // 数据库属性文件
applicationContext.xml  // Spring 配置文件
mybatis-config.xml      // MyBatis 配置文件

配置 log4j.properties 属性文件

使用默认配置即可。

### 设置Logger输出级别和输出目的地 ###
log4j.rootLogger=debug, stdout

### 把日志信息输出到控制台 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout

配置 db.properties 属性文件

# 设置数据库连接相关的属性值
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/dataBaseName
jdbc.user=root
jdbc.pswd=pswd

在数据库的配置文件 db.properties 中,一定不要以 username 作为属性名,亲身经历这个属性名得到的值是主机名。根本得不到属性文件中的值,请加前缀或者使用其它名字作为属性名。

配置 mybatis-config.xml 配置文件

因为是将 Mybatis 框架整合入 Spring 框架中,所以数据源在Spring中,Mybatis 的配置文件就更加简单了。只剩下了 <Mappers> 标签和其它一些设置标签,比如,setting 标签,typeAliases 标签等)。

<?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>
        <package name="pojo" />
    </typeAliases>
    <mappers>
        <mapper resource="dao/UserMapper.xml"/>
    </mappers>
</configuration>

配置 applicationContext.xml 配置文件

这是最重要的配置文件。

<context:property-placeholder location="classpath:db.properties" />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
    p:driverClassName="${jdbc.driver}"
    p:url="${jdbc.url}"
    p:username="${jdbc.user}"
    p:password="${jdbc.pswd}" />
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
    p:dataSource-ref="dataSource"
    p:configLocation="mybatis-config.xml" />

首先,将数据库属性文件使用 <context:property-placeholder> 标签导入,然后定义一个数据源 Bean。其中使用数据库属性文件中的值。定义好数据源之后 ,就可以定义一个 SqlSessionFactory 的 Bean,设置属性将数据源和Mybatis的配置文件导入其中,这个 Bean 就配置好了。这个就是Mybatis 中的 SqlSession 工厂。

到此配置已经全部完毕了,但是项目还完全运行不起来,因为,我们需要一个实例的例子来运行一下才行。

一个实例

// IDEA项目中src目录下的java目录结构 
java
    dao # 数据访问层
        impl # 接口实现包
            UserDaoImpl.java # 用户操作实现类(数据访问层)
        UserDao # 用户操作接口
        UserMapper.xml 用户操作的查询语句
    pojo # 实体包
        User.java # 用户实体类
    service # 服务包
        UserService.java # 用户操作实现类(业务逻辑层)

编写实体类

首先,实现的是实体类。因为其它所有的类都要使用它。

// User.java 实体类
public User() {
    private Integer id; //id 在数据库中自增
    private String userCode;
    private String userName;
    private String userPassword;
    // 省略Getter和Setter
}

编写操作接口类

然后是操作接口类

// UserDao.java 操作接口类
public interface UserDao {
    
    
    int selectCount(); // 得到用户数量的接口
}

编写 Mapper 文件

再然后是Mapper.xml文件,它是Mybatis框架中的配置文件,主要配置接口的具体查询语句,详细请看MyBatis 框架配置详解

<!-- UserMapper.xml 操作配置文件 -->
<mapper namespace="dao.UserDao">
    <!-- 实现接口中的函数 -->
    <select id="selectCount" resultType="int" >
        select count(1) from smbms_user
    </select>
</mapper>

UserDaoImpl.java 文件和 UserService.java 文件现在目前不说,等使用到它们时会进行编写。

applicationContext.xml 文件中继续进行配置

又要配置 applicationContext.xml 配置文件了,在Spring与其它框架进行整合时,都是Spring的配置文件最重要,因为其它框架的Bean都是要在Spring中进行配置的。

剩下的就是得到Mapper文件中对接口的实现类了。其中我们有3种方法来得到它。从基础到简单,从手动到自动。这三种方法的核心都是对Spring的配置文件进行操作。

方法一、使用SqlSessionTemplate和UserDaoImpl类得到实现类

我们在上面的配置文件基础之上继续进行配置。

<!-- 紧接上面的文件,配置了一个 sqlSessionFactory -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<bean id="userDao" class="dao.impl.UserDaoImpl"
    p:sqlSessionTemplate-ref="sqlSessionTemplate"/>
// 接口实现类,通过SqlSessionTemplate实例实现
public class UserDaoImpl implements UserDao {
    
    
    private SqlSessionTemplate sqlSessionTemplate;
    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }
    @Override
    public int selectCount() {
        UserDao userDao=sqlSessionTemplate.getMapper(UserDao.class);
        return userDao.selectCount();
    }
}

首先,配置一个sqlSessionTemplate 的Bean, 就是一个SqlSession实例的一个模板类。然后,将这个Bean传入UserDaoImpl类中得到对应的Mapper,进行对应的操作。

其实,可以看出,这种实现方法,局限性很大,不够灵活。

方法二、使用MapperFactoryBean得到实现类

方法一中我们需要将SqlSessionTemplate的实例注入到UserDao的实现类中,再得到对应的Maper才能进行操作。过于死板。现在使用方法二可以解决这个问题。

<!-- 紧接上面的文件,配置了一个 sqlSessionFactory -->
<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean"
    p:mapperInterface="dao.UserDao"
    p:sqlSessionFactory-ref="sqlSessionFactory" />

只需要配置一个Bean,就可以得到UserDao的实现类,就是使用MapperFactoryBean类,传入对应的接口类和上面已经实现的SqlSessionFactory实例,就可以直接得到对应接口的实现类。完全不用编写impl包下的实现类。

但是,还有一个问题,就是每一个接口类都要一个Bean才行。有没有更加简单的方法,能将所有的实现类一起实现呢?那当然是有啊,这就需要方法三了。

方法三、使用MapperScannerConfigurer生成所有实现类

<!-- 紧接上面的文件,配置了一个 sqlSessionFactory -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="dao" />
</bean>
<bean id="userService" class="service.UserService" />
// UserService.java 服务类
public class UserService {
    
    
    @Autowired
    private UserDao userDao;

    public int selectCount() {
        return userDao.selectCount();
    }

我们使用 MapperScannerConfigurer类的Bean去扫描dao包下所有的Mapper文件,再将它们全部实现成Bean。我们就得到了所有接口的实现。但是,我们却不知道生成的实现类Bean的名字,有两种方法解决,一个是像UserService类写得一样,使用自动注入,我们不需要知道它们的名字。另一个是找到它们的名字,通过对Spring框架日志的打印,可以得到对应接口实现类的名字就是将接口名首字母小写之后的名字。比如,UserDao接口对应的实现类的名字就是userDao 与我们日常的命名一致。

Guess you like

Origin blog.csdn.net/cuipp0509/article/details/79869697