Spring与Mybatis整合,涉及到哪个对象的管理
步骤1: pom.xml添加相关依赖
<dependencies>
<!--spring-context依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<!--Mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<!--mybatis与spring的整合包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!--数据源jar-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.5</version>
</dependency>
<!--logback-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<!--Spring整合mybatis必须添加此依赖才能访问数据库-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
步骤2: 在applicationContext.xml配置数据源
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
jdbc.user=root
jdbc.pass=root
druid.initialSize=4
druid.maxActive=100
druid.minIdle=2
applicationContext.xml
<?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: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://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--在当前xml文件中加载外部properties配置文件-->
<context:property-placeholder location="classpath:db.properties" />
<!--数据源配置-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.pass}" />
<property name="initialSize" value="${druid.initialSize}" />
<property name="maxActive" value="${druid.maxActive}" />
<property name="minIdle" value="${druid.minIdle}" />
</bean>
<!--会话工厂Bean-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<!--为指定包中的Mapper接口生成代理的子类对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--指定sqlSessionFactoryBean的名称-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean" />
<!--指定数据访问层的包名,将所有该包下的接口生成代理子类对象存入spring容器中-->
<property name="basePackage" value="com.woniu.mapper" />
</bean>
</beans>
步骤3: 编写UserServiceTest测试类:
public class UserServiceTest {
@Test
public void testGetUserList(){
//从容器中获取UserService
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService= (UserService)ac.getBean("userService");
List<User> userList = userService.getUserList();
for (User user : userList) {
System.out.println(user);
}
}
}
问题1: 如果我们在spring整合mybatis后,还想编写sqlMapper.xml映射文件怎么办?
只需要按MyBatis默认的配置,以com.woniu.mapper 创建同样命名的路径名生成sqlMapper.xml映射文件 ,即可访问
也可以使用配置
<!--会话工厂Bean-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--数据源属性的注入-->
<property name="dataSource" ref="dataSource" />
<!--设置类型别名包-->
<property name="typeAliasesPackage" value="com.woniu.entity" />
<!--设置XML - sqlMapper映射文件的路径 如果路径名与Mapper包名一致,则可以省略-->
<property name="mapperLocations" value="classpath:com/woniu/mapper/*.xml" />
</bean>
问题2: 如果我们还需要使用mybatis-config.xml配置文件怎么办?
<!--会话工厂Bean-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--数据源属性的注入-->
<property name="dataSource" ref="dataSource" />
<!--指定mybatis的核心配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>
整合思路分析: 测试类 --> 业务层对象 --> dao层对象 --> 会话工厂对象 --> 数据源对象
2.Spring新注解
2-1 @Configuration
@Configuration -由这个注解的标注的类,作用就是相当于一个XML的配置文件
|-也称为Java配置类
当创建容器ApplicationContext 时会从该类上加载注解
ClassPathXMLApplicationContext("xml文件")
FileSystemXMLApplicationContext - [基于外部文件系统中的xml文件]
AnnotationApplicationContext("配置类<@Configuration>")[基于注解的配置来创建Spring工厂对象]
获取容器时需要使用AnnotationApplicationContext实现类,来根据配置类创建容器对象
//相当于一个spring xml配置文件
@Configuration
public class SpringConfiguration {
}
2-2 @ComponentScan
作用:用于指定 spring 在初始化容器时要扫描的包。作用和在 spring 的 xml 配置文件中的:
<context:component-scan base-package="com .xxxx"/>是一样的
//相当于一个spring xml配置文件
@Configuration
@ComponentScan("com.woniu")
public class SpringConfiguration {
}
2-3 @PropertySource
作用:用于加载.properties 文件中的配置
相当于xm配置
<!--在当前xml文件中加载外部properties配置文件-->
<context:property-placeholder location="classpath:db.properties" />
2-4 @Import注解
作用:用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration 注解。当然,写上也没问题
属性:value[]:用于指定其他配置类的字节码
在刚才的SpringConfig类中 引入 JdbcConfig配置类:
@Configuration
@ComponentScan(basePackages = "com.woniu")
@Import(value = {JdbcConfig.class})
public class SpringConfig {
}
3.Spring整合Mybatis-注解配置-[重点]
SpringConfiguration.java配置类
//相当于一个spring xml配置文件
@Configuration
@ComponentScan("com.woniu")
@Import(JdbcConfig.class) //引入外部的配置类文件,可以在MapperScannerConfigurer之前加载
public class SpringConfiguration {
@Bean("sqlSessionFactoryBean")
public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource) throws IOException {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
//设置dataSource
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setTypeAliasesPackage("com.woniu.entity");
//设置sqlMapper XML映射文件的路径
ResourcePatternResolver loader=new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(
loader.getResources("classpath:com/woniu/mapper/*.xml"));
//指定mybatis的核心配置文件
// sqlSessionFactoryBean.setConfigLocation(
// loader.getResource("classpath:mybatis-config.xml"));
return sqlSessionFactoryBean;
}
//用于生成Mapper接口代理子类对象,并存入spring容器中
@Bean
public MapperScannerConfigurer getMapperScannerConfigurer(){
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
configurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");
configurer.setBasePackage("com.woniu.mapper");
return configurer;
}
}
JdbcConfig.java 子配置类文件
import javax.sql.DataSource;
@PropertySource("classpath:db.properties") //读取外部的properties文件信息
public class JdbcConfig {
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.driver}")
private String driverClassName;
@Value("${jdbc.user}")
private String username;
@Value("${jdbc.pass}")
private String password;
//@Bean注解 调用此方法,将返回值对象以方法名为id存入spring容器中
@Bean("dataSource")
public DataSource createDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setInitialSize(4);
dataSource.setMaxActive(100);
dataSource.setMinIdle(2);
return dataSource;
}
}