第一个问题就是配置文件繁琐。
如果使用 MyBatis 配置文件的方式开发,配置文件会非常的繁琐:
<configuration>
<typeAliases>
<typeAlias type="edu.lsu.mybatis.User" alias="user"/>
</typeAliases>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserDaoMapper.xml"/>
</mappers>
</configuration>
如上:
mapper
,有几个写几个。有同学说可以使用 package
标签解决这个问题。
是的,但是我们待会使用 Spring 的方式解决这个问题。
第二个问题就是在调用 API 的时候存在代码冗余:
@Test
public void test1() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
SqlSession session = ssf.openSession();
UserDao userDao = session.getMapper(UserDao.class);
User user = new User();
user.setName("ws");
user.setPassword("123456");
userDao.saveUser(user);
session.commit();
}
这里创建 SqlSessionFactory
的代码是固定的,变化的部分只有 getMapper
时需要传入的参数。
Spring 主要是对这 4 行代码进行了封装:
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
SqlSession session = ssf.openSession();
UserDao userDao = session.getMapper(UserDao.class);
前两行
首先是封装了创建 SqlSessionFactory
的方式,然后封装了创建 Dao 的实现类。
原来是需要 mybatis-config.xml
配置文件的,现在去掉了,但是我们还是需要给它提供配置文件里的内容信息,比如 数据源 、别名、Mapper 的注册信息。
SqlSessionFactoryBean :
SqlSessionFactory
创建的代码;后两行
Spring 提供了一个 MapperScannerConfig
类,他需要几个属性:
SqlSessionFactoryBean
,用于获取 session
;在 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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 连接池-->
<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useSSL=false&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- SqlSessionFactoryBean-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="edu.lsu.entity"/>
<property name="mapperLocations">
<list>
<value>classpath:edu/lsu/mapper/*Mapper.xml</value>
</list>
</property>
</bean>
<!-- 创建Dao对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" id="scanner">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/>
<property name="basePackage" value="edu.lsu.dao"/>
</bean>
</beans>
其余文件内容均不变,在测试的时候即可测试出结果:
@Test
public void test2() {
ApplicationContext ac = new ClassPathXmlApplicationContext("/application.xml");
UserDao userDao = ac.getBean("userDao", UserDao.class);
User user = new User();
user.setName("小贱人");
user.setPassword("99999");
userDao.saveUser(user);
}