Java -- Spring学习笔记6、Spring集成MyBatis
1、Spring集成MyBatis
在使用MyBatis开发时、创建SqlSessionFactory对象需要自己手动创建、也就是使用SqlSessionFactoryBuilder.build()、而在spring框架中、对象统一交由容器管理、所以、spring集成mybatis主要解决的问题就是将SqlSessionFactory对象交由Spring来管理。只需要将SqlSessionFactory的对象生成器 SqlSessionFactoryBean注册在Spring容器中,再将其注入给Dao的实现类即可完成整合。
实现Spring与MyBatis的整合常用的方式:扫描的Mapper动态代理。
2、具体实现步骤
- 添加maven依赖和插件、如下:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
- 创建实体类、如下:
public class UserInfo
{
private int id;
private String name;
private int age;
//getter setter toString()...
}
- 在dao层创建接口、如下:
public interface UserInfoDao
{
int insertUser(UserInfo userInfo);
int updateUser(UserInfo userInfo);
int deleteUser(int id);
UserInfo selectUser(int id);
List<UserInfo> selectUserAll();
}
- 创建对应的mapper文件、如下:
<mapper namespace="com.rg.dao.UserInfoDao">
<insert id="insertUser" parameterType="UserInfo">
insert into UserInfo(Age,Name) values(#{name},#{age})
</insert>
<update id="updateUser" parameterType="UserInfo">
update UserInfo set Name=#{name},Age=#{age} where id=#{id}
</update>
<delete id="deleteUser" parameterType="int">
delete from UserInfo where id=#{id}
</delete>
<select id="selectUser" resultType="UserInfo" parameterType="int">
select Name,Age from UserInfo where id=#{id}
</select>
<select id="selectUserAll" resultType="UserInfo">
select Name,Age from UserInfo
</select>
</mapper>
- 在service层创建接口、如下:
public interface UserInfoService
{
int addUser(UserInfo userInfo);
int modifyUser(UserInfo userInfo);
int deleteUser(int id);
UserInfo selectUser(int id);
List<UserInfo> selectUserAll();
}
- 实现类如下:
public class UserInfoServiceImpl implements UserInfoService
{
private UserInfoDao userInfoDao;
public void setUserInfoDao(UserInfoDao userInfoDao)
{
this.userInfoDao = userInfoDao;
}
@Override
public int addUser(UserInfo userInfo)
{
return userInfoDao.insertUser(userInfo);
}
@Override
public int modifyUser(UserInfo userInfo)
{
return userInfoDao.updateUser(userInfo);
}
@Override
public int deleteUser(int id)
{
return userInfoDao.deleteUser(id);
}
@Override
public UserInfo selectUser(int id)
{
return userInfoDao.selectUser(id);
}
@Override
public List<UserInfo> selectUserAll()
{
return userInfoDao.selectUserAll();
}
}
在resources目录下创建三个文件夹、里边存放properties文件、mybatis.xml、applicationContext.xml(spring配置文件)
- jdbc文件夹下的属性文件存放数据库信息:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/StudentManage?characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=root
- mybatis文件夹下的mybatis配置文件、如下:
<configuration>
<settings>
<!--设置mybatis输出日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<typeAliases>
<package name="com.rg.entity"/>
</typeAliases>
<!--SQL映射文件的位置-->
<mappers>
<package name="com.rg.dao"/>
</mappers>
</configuration>
需注意、主配置文件中不再需要数据源的配置了。因为数据源要交给Spring容器来管理了
- spring文件夹下的applicationContext.xml配置文件、如下:
<!--
Druid:阿里的开源数据库连接池、这里不需要driver、可以根据url检测出驱动
每个属性值都从属性文件中读取、这里需要注意:name的值最好不要和属性文件中key的值相同、如果相同可能会出现错误
-->
<bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--
Spring若想要读取配置文,其必须在配置文件中进行注册。使用<context>标签、如下:
-->
<context:property-placeholder location="classpath:jdbc/jdbc.properties"/>
<!--
注册SqlSessionFactoryBean
在使用mybatis创建sqlSessionFactory对象时候、也是需要读取mybatis.xml文件和文件中的数据源
而在spring中、这里bean标签里有两个property、里边的值就是数据源和mybatis.xml文件
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="configLocation" value="classpath:mybatis/mybatis.xml"/>
</bean>
<!--
Mapper扫描配置器MapperScannerConfigurer:会自动生成指定的基本包中mapper的代
理对象。该Bean无需设置id属性。basePackage使用分号或逗号设置多个包。
在mybatis框架中、创建代理对象、需要通过sqlSessionFactory获取SqlSession,然后调用getMapper()
该方法的参数为指定Dao接口类的class值。
这里bean标签里也有两个property、里边的内容分别是sqlSessionFactory和Dao接口中所有类
只不过、获取代理对象交由spring来做。
MapperScannerConfigurer会将com.rg.dao包下所以接口都执行一次geiMapper方法,
得到每个接口的dao对象,把创建好的dao对象,放到spring容器中。
dao对象名称:接口名称首字母小写
比如接口名称StudentDao、那么对象名称为studentDao
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.rg.dao"/>
</bean>
<!--
这里的ref="userInfoDao"中的userInfoDao就是上方Mapper扫描配置器扫描完成后、spring创建的代理对象。
由于通过Mapper扫描配置器MapperScannerConfigurer生成的Mapper代理对象没有名称。
所以在向Service注入Mapper代理时,无法通过名称注入。
但可通过接口的简单类名注入,因为生成的是这个 Dao 接口的对象
-->
<bean id="userInfoService" class="com.rg.service.impl.UserInfoServiceImpl">
<property name="userInfoDao" ref="userInfoDao"/>
</bean>
- 测试方法:
@Test
public void test01()
{
String config = "spring/applicationContext.xml";
ApplicationContext atx = new ClassPathXmlApplicationContext(config);
UserInfoService userInfoService = (UserInfoService) atx.getBean("userInfoService");
List<UserInfo> userInfoList = userInfoService.selectUserAll();
System.out.println(userInfoList);
}
概括来讲、使用spring集成mybatis就是在原先使用mybatis框架时候、需要在Java代码里创建的对象、统一交由spring来完成,内部原理还是一样的。比如、创建数据源、从属性文件中读取数据、创建sqlSessionFactory对象、要使用到数据源和mybatis.xml文件等等。