Mybatis-Spring 方法一
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession
并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException
。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。
关于Spring来接管MyBatis
Mybatis原有的数据源将会被接管
只需要 建立一个 Mybatis-dao.xml 随后将xml引入到 完整的xml中即可
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:c="http://www.springframework.org/schema/aop"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<aop:aspectj-autoproxy/>
<context:annotation-config/>
<!-- 指定要扫描的包 -->
<context:component-scan base-package="com.xue"/>
<!-- DataSource : 使用Spring Mybatis来替换 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="1111"/>
</bean>
<!-- sql Session -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 绑定Mybatis配置文件 -->
<property name="configLocation" value="mybatis-config.xml"/>
</bean>
<!-- sqlSession -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
</beans>
这样就可以完成连接的建立这个过程并且完成了之前的获取sqlsession这个工具类的步骤,利用的是SqlSessionTemplate来实现
接下来来个测试!
假如说存在Teahcer 表在数据库中
我们要获取表的数据
在MyBatis中
- 创建pojo
- 做一个mapper的接口与实现它的xml文件
- 利用工具类来获取sqlsession,随后获取 xml所实现的方法,然后再使用方法,来获取数据
(具体代码不再赘述)
在MyBatis-Spring中不同,因为工具类获取sqlsession已经被Spring给接管了,我们可以尝试做一个AOP(我理解的叫AOP)来进行操作
即我们不用xml来实现单一的实现接口而改用一个类来实现接口,随后再用这个类来实现xml文件,我们只需要把我们到的sqlsession注入到这个类中,就可以了。像下面这样:
<bean id="teacherMapper" class="com.xue.mapper.TeacherMapperImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
然后它的impl可以是
public class TeacherMapperImpl implements TeacherMapper{
//设置一下将要注入的session
private SqlSessionTemplate sqlSession;
public SqlSessionTemplate getSqlSession() {
return sqlSession;
}
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public List<Teacher> queryTeacher() {
//获取要操作的Mapper
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
//这个时候 这个mapper已经是实现了TeacherMapper.xml 这个文件里的方法
return mapper.queryTeacher();
}
}
测试类可以是:
public class MyTest {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
TeacherMapper userMapper = (TeacherMapper) context.getBean("teacherMapper");
List<Teacher> queryUser = userMapper.queryTeacher();
queryUser.forEach(System.out::println);
}
}
Mybatis-Spring 方法二
终极简化版本
SqlSessionDaoSupport
SqlSessionDaoSupport
是一个抽象的支持类,用来为你提供 SqlSession
。调用 getSqlSession()
方法你会得到一个 SqlSessionTemplate
,之后可以用于执行 SQL 方法,就像下面这样:
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
public User getUser(String userId) {
return getSqlSession().selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
}
}
在这个类里面,通常更倾向于使用 MapperFactoryBean
,因为它不需要额外的代码。但是,如果你需要在 DAO 中做其它非 MyBatis 的工作或需要一个非抽象的实现类,那么这个类就很有用了。
SqlSessionDaoSupport
需要通过属性设置一个 sqlSessionFactory
或 SqlSessionTemplate
。如果两个属性都被设置了,那么 SqlSessionFactory
将被忽略。
假设类 UserMapperImpl
是 SqlSessionDaoSupport
的子类,可以编写如下的 Spring 配置来执行设置:
<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
这是一个化简的方法
这样的话我们可以省去sqlsession注入SqlSessionTemplate这个过程