基于:【狂神说Java】Spring5最新完整教程IDEA版通俗易懂
目录
1 Mybatis回顾
可以参考:MyBatis(一)第一个MyBatis程序(idea+maven)
使用原生mybatis的一般性流程:
- 使用maven导入mybatis、mysql依赖包;
- 配置mybatis-config.xml文件,包括数据库信息、注册mapper等;
- 编写一个MybatisUtils类,用来从.xml加载数据源,返回SqlSession对象;
- 编写业务Mapper接口;
- 编写Mapper配置文件,编写相应的SQL业务逻辑;
- 测试使用:获得sqlSession对象,获得mapper,调用mapper方法返回结果;
2 Spring使用Mybatis
由于Spring的IoC功能,所有的对象都交给Spring去管理,所以原生mybatis的对象也需要交给Spring去管理,不再使用new
关键字去创建对象,而采用bean;
2.1 spring-dao.xml配置
2.1.1 dataSource
<!--数据源,代替MybatisUtils.java的数据库链接类-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/datasets?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
以上代码将数据源注册为对象,类似于原生的从xml加载资源:
InputStream inputStream = Resources.getResourceAsStream(resource)
2.1.2 sqlSessionFactory
<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--mybatis配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
将sqlSessionFactory
注册为对象,类似于原生的创建工厂:
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
2.1.3 sqlSession
<!--sqlSession-->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
获得sqlSession
,类似于原生的sqlSessionFactory.openSession()
,此处的SqlSessionTemplate
实现了SqlSession
接口。
2.2 测试使用
和原生mybatis一样的使用方法:
public void springAllUsersGet(){
//读入配置
ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
SqlSession sqlSession = context.getBean("sqlSessionTemplate",SqlSession.class);
//建立映射
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
for (User user : mapper.getAllUsers()) {
logger.debug(user);
}
}
问题来了,既然Spring的设计理念是IoC,那么在以上使用的时候mapper
和sqlSession
之间的关系,也是属于依赖注入,mapper
实例对象也可以交给Spring去管理,用户只关心从context
拿就行。
2.2.1 Mapper实现类
public class UserMapperImpl implements UserMapper{
private SqlSessionTemplate sqlSessionTemplate;
//set进来
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
}
@Override
public List<User> getAllUsers() {
UserMapper mapper=sqlSessionTemplate.getMapper(UserMapper.class);
return mapper.getAllUsers();
}
}
2.2.2 Mapper注册bean
<bean id="userMapper" class="dao.UserMapperImpl">
<property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
</bean>
2.2.3 测试使用
@Test
public void springAllUsersGet() {
//读入配置
ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
//获得
UserMapper mapper = context.getBean("userMapper",UserMapper.class);
//获得
for (User user : mapper.getAllUsers()) {
logger.debug(user.toString());
}
}
可以注意到,直接从context
上下文就获得了bean
对象,直接使用,耦合性大大降低;
但是注意:设计接口和编写Mapper
对应的sql语句是必须的,这是mybatis的核心,并且需要使用<property name="configLocation" value="classpath:mybatis-config.xml"/>
导入进去,spring-mybatis
仅仅是提供了一种优雅的对象管理机制而已。
2.3 使用SqlSessionDaoSupport
2.3.1 接口实现
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
@Override
public List<User> getAllUsers() {
return getSqlSession().getMapper(UserMapper.class).getAllUsers();
}
}
继承了SqlSessionDaoSupport
,可以直接获得SqlSession
,不用在spring中配置SqlSession
的bean;
2.3.2 配置注册Bean
<bean id="userMapper" class="dao.UserMapperImpl2">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
注意:使用sqlSessionFactory
注入是UserMapperImpl
实现类,跨过了SqlSession
;
3 总结
使用Spring
去整合Mybatis
主要就是利用了Spring IoC
的思想,把一些配置类直接在Spring
配置文件中进行注册成Bean
,让程序更多的关注业务逻辑实现,而不是一堆获取数据库的操作。