spring-3-spring整合mybatis
版本和依赖
MyBatis-Spring 需要以下版本:
maven依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<!--至少有下面一种-->
<!--spring管理的 jdbc ,以及事务相关的-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.17.RELEASE</version>
</dependency>
<!--Druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.8</version>
</dependency>
第一种方式
配置数据源参数db.properties
druid.driverClass=com.mysql.cj.jdbc.Driver
druid.jdbcUrl=jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8
druid.user=root
druid.password=123456
druid.maxActive=8
druid.minIdle=0
spring核心配置文件(IOC)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:bean="http://mybatis.org/schema/mybatis-spring"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://mybatis.org/schema/mybatis-spring
http://mybatis.org/schema/mybatis-spring.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--
读取 jdbc.properties 中的内容
property-placeholder: 占位符
location: 属性文件的位置
-->
<context:property-placeholder location="classpath:db.properties"/>
<!--
扫描包下的类注册到IOC容器中去
-->
<context:component-scan base-package="com.wang"/>
<!-- 1、 获得数据库连接池对象,并交由 spring 同一管理,在mybatis配置文件中就不需要再配置了 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!-- 连接数据库的驱动,连接字符串,用户名和登录密码-->
<property name="driverClassName" value="${druid.driverClass}"/>
<property name="url" value="${druid.jdbcUrl}"/>
<property name="username" value="${druid.user}"/>
<property name="password" value="${druid.password}"/>
<!-- 数据池中最大连接数和最小连接数-->
<property name="maxActive" value="${druid.maxActive}"/>
<property name="minIdle" value="${druid.minIdle}"/>
</bean>
<!--2、获取 SqlSessionFactory 对象,并交由 spring 管理,取代了下面的代码-->
<!--
InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入连接池
给 sqlsessionFactory 的属性 dataSource 赋值
ref="引用该 spring容器 中的另一个 bean的id"
-->
<property name="dataSource" ref="dataSource"/>
<!-- 注入 映射文件 mapper
给 sqlsessionFactory 的属性 mapperLocation 赋值
value="映射文件 XXXmapper.xml 的相对路径"
-->
<property name="mapperLocations" value="classpath:com/wang/dao/xml/*.xml"/>
<property name="typeAliasesPackage" value="com.wang.entity"/>
<!--上面是完全spring取代mybatis-config配置文件,下面这行还可以加载mybatis-->
<!--property name="configLocation" value="classpath:mybatis-config.xml"/>-->
</bean>
<!-- 3、 获取 SqlSession 对象,并交由 spring 管理 用SqlSessionTemplate得到的SqlSession可以不用我们自己操心事务的管理,以及关闭操作-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!-- 给 SqlSessionTemplate 的构造函数赋值-->
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
</beans>
多了一个service的层(用来直接获取Mapper接口实例化好的对象,直接调用对应的方法)
//使用这个类之前需要先传入一个从spring配置文件中得到的sqlSessionTemplate对象
//我们这里一般在springIOC容器中帮助注入
@Service
public class EmployeeService {
@Autowired
private SqlSession sqlSession;
public List<Department> getAllEmployee(){
DepartmentMapper mapper = sqlSession.getMapper(DepartmentMapper.class);
return mapper.selectByExample(null);
}
}
测试调用:
@org.junit.Test
public void test1(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("Application.xml");
EmployeeMapperImpl employeeMapperImpl = context.getBean("EmployeeMapperImpl", EmployeeMapperImpl.class);
List<Employee> employees = employeeMapperImpl.queryEmployees();
Iterator<Employee> iterator = employees.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
第二种方式
主要在service层发生了修改
@Component
public class EmployeeMapperImpl extends SqlSessionDaoSupport implements EmployeeMapper {
//我们这里直接继承sqlSessionDaoSupport,使用里面的getSqlSession方法直接获取sqlSession
//而不是用DI的方式取注入sqlSession
private SqlSession sqlSession = getSqlSession();
// public void setSqlSession(SqlSessionTemplate sqlSession) {
// this.sqlSession = sqlSession;
// }
public List<Employee> queryEmployees() {
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
return mapper.queryEmployees();
}
不需要DI之后
我们就不需要再IOC容器中管理这些Service层了
- 便于管理
- 便于事务操作
在Application.xml核心配置文件中:
- 我们不需要再把sqlsessiontemplate也放入到IOC容器中了
- 但是在我们的service层类中仍需要放到IOC容器中,不过只需要再注入sqlSessionFactory类就可以了
<?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">
<!-- driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8
username = root
password = 123456-->
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">-->
<!-- <constructor-arg index="0" ref="sqlSessionFactory"/>-->
<!-- </bean>-->
<!-- <bean id="EmployeeMapper" class="com.wang.service.EmployeeMapperImpl">-->
<!-- <property name="sqlSession" ref="sqlSession"/>-->
<!-- </bean>-->
<bean id="userEmployeeMapper" class="com.wang.service.EmployeeMapperImpl2">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
</beans>