目录
- 案例分析及基础准备工作请参考历史文章-XML版的
注解整合Mybatis分析
- 业务类使用注解形式声明bean,属性采用注解注入
- 建立独立的配置管理类,分类管理外部资源,根据功能进行分类,并提供对应的方法获取bean
- 使用注解形式启动bean扫描,加载所有注解配置的资源(bean)
- 使用AnnotationConfigApplicationContext对象加载所有的启动配置类,内部使用导入方式进行关联
注解整合Mybatis步骤
- 1.修改mybatis外部配置文件格式为注解格式(删掉Mybatis映射配置文件,在dao层基于注解开发)
package com.superdemo.dao; import com.superdemo.domain.Account; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import java.util.List; public interface AccountDao { @Insert("INSERT INTO account(name, money) VALUES (#{name},#{money})") void save(Account account); @Delete("DELETE FROM account WHERE id = ${id}") void delete(Integer id); @Update("UPDATE account SET name = #{name},money = #{money} WHERE id = #{id}") void update(Account account); @Select("SELECT * FROM account") List<Account> findAll(); @Select("SELECT * FROM account WHERE id = #{id}") Account findByid(Integer id); }
- 2.业务类使用@Component 声明bean,使用@Autowired 注入对象
package com.superdemo.service.impl; import com.superdemo.dao.AccountDao; import com.superdemo.domain.Account; import com.superdemo.service.AccountService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service("accountService") public class AccountServiceImpl implements AccountService { @Autowired private AccountDao accountDao; /*public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; }*/ public void save(Account account){ accountDao.save(account); } public void delete(Integer id){ accountDao.delete(id); } public void update(Account account){ accountDao.update(account); } public List<Account> findAll(){ return accountDao.findAll(); } public Account findByid(Integer id){ return accountDao.findByid(id); } }
- 3.建立配置文件JDBCConfig与MybatisConfig类,并将其导入到核心配置类SpringConfig
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/dp1?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8&useSSL=false jdbc.username=root jdbc.password=109923
package com.superdemo.config; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import javax.sql.DataSource; public class JDBCConfig { @Value("${jdbc.driver}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String userName; @Value("${jdbc.password}") private String password; @Bean("dataSource") public DataSource getDataSource(){ System.out.println(driver); DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(driver); ds.setUrl(url); ds.setUsername(userName); ds.setPassword(password); return ds; } }
package com.superdemo.config; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.mapper.MapperScannerConfigurer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import javax.sql.DataSource; public class MybatisConfig { /* 对应XML格式下: spring整合mybatis后控制的创建连接用的对象 <bean class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="typeAliasesPackage" value="com.superdemo.domain"/> </bean> 加载mybatis映射配置的扫描,将其作为spring的bean进行管理 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.superdemo.dao"/> </bean>*/ @Bean public SqlSessionFactoryBean getSqlSessionFactoryBean(@Autowired DataSource dataSource){ SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean(); ssfb.setTypeAliasesPackage("com.superdemo.domain"); ssfb.setDataSource(dataSource); return ssfb; } @Bean public MapperScannerConfigurer getMapperScannerConfigurer(){ MapperScannerConfigurer msc = new MapperScannerConfigurer(); msc.setBasePackage("com.superdemo.dao"); return msc; } }
package com.superdemo.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.PropertySource; @Configuration @ComponentScan("com.superdemo") @PropertySource("classpath:jdbc.properties") @Import({JDBCConfig.class, MybatisConfig.class}) public class SpringConfig { }
- 4.开启注解扫描
- 5.使用AnnotationConfigApplicationContext对象加载配置项,测试成功
import com.superdemo.config.SpringConfig; import com.superdemo.domain.Account; import com.superdemo.service.AccountService; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class App { public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class); AccountService accountService = (AccountService) ctx.getBean("accountService"); Account ac = accountService.findByid(3); System.out.println(ac); } }
再整合Junit
- 如何在Junit中使用spring中的资源?
- 1.Spring接管Junit的运行权,使用Spring专用的Junit类加载器
- 2.为Junit测试用例设定对应的spring容器
- 注意:
- 从Spring5.0以后,要求Junit的版本必须是4.12及以上
- Junit仅用于单元测试,不能将Junit的测试类配置成spring的bean,否则该配置将会被打包进入工程中
- 步骤:
- 1.导入Spring整合Junit坐标
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.3.22</version> </dependency>
- 2.在test目录下对应创建service的测试类进行测试,测试成功
package com.superdemo.service; import com.superdemo.config.SpringConfig; import com.superdemo.domain.Account; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.List; //设定spring专用的类加载器 @RunWith(SpringJUnit4ClassRunner.class) //设定加载的spring上下文对应的配置 @ContextConfiguration(classes = SpringConfig.class) public class UserServiceTest { @Autowired private AccountService accountService; @Test public void testFindAll(){ List<Account> list = accountService.findAll(); Assert.assertEquals(3,list.size()); } }