Spring5复习:整合MyBatis的操作(注解配置版)

1.声明

当前内容主要为本人复习和使用Spring和MyBatis中使用纯注解方式实现sql操作

主要的pom依赖与这个xml版一致:Spring5复习:整合MyBatis的操作(xml配置文件版)

2.主要的配置类

AppConfig.java

@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = {
    
    "com.hy.java.spring.database.mybatis.anno"})
//@PropertySource(value = { "classpath:/com/hy/java/spring/database/mybatis/anno/db.properties" }) // 发现读取无效
public class AppConfig {
    
    
	
	//@Value("${jdbc.driverClassName}")
	private String driverClassName="com.mysql.cj.jdbc.Driver";
	
	//@Value("${jdbc.url}")
	private String url="jdbc:mysql://localhost:3306/test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
	
	//@Value("${jdbc.username}")
	private String username="root";
	
	//@Value("${jdbc.password}")
	private String password="root";

	@Bean("dataSource")
	public DataSource dataSource() {
    
    
		BasicDataSource basicDataSource = new BasicDataSource();
		basicDataSource.setUrl(url);
		basicDataSource.setDriverClassName(driverClassName);
		basicDataSource.setUsername(username);
		basicDataSource.setPassword(password);
		return basicDataSource;
	}

	// 配置sessionFactory
	@Bean(name = "sessionFactory")
	public SqlSessionFactoryBean getSqlSessionFactoryBean(@Autowired DataSource dataSource) {
    
    
		SqlSessionFactoryBean sessionFactoryBean=new SqlSessionFactoryBean();
		sessionFactoryBean.setDataSource(dataSource);
		sessionFactoryBean.setConfigLocation(new ClassPathResource("/com/hy/java/spring/database/mybatis/anno/mybatis-config.xml"));
		//sessionFactoryBean.setMapperLocations(mapperLocations);//可以手动指定当前的映射文件,但是注意一旦使用了@Select注解方式那么就不能使用xml配置方式实现映射
		return sessionFactoryBean;
	}
	
	@Bean
	public MapperScannerConfigurer getMapperScannerConfigurer() {
    
    
		MapperScannerConfigurer scannerConfigurer=new MapperScannerConfigurer();
		scannerConfigurer.setBasePackage("com.hy.java.spring.database.mybatis.anno.dao");
		return scannerConfigurer;
	}

	// 配置事务
	@Bean(name = "txManager")
	public DataSourceTransactionManager getTransactionManager(@Autowired DataSource dataSource) {
    
    
		DataSourceTransactionManager transactionManager=new DataSourceTransactionManager(dataSource);
		return transactionManager;
	}
}

上面测试的时候出现了一个问题:无法读取db.properties这个配置文件(不知道怎么回事),所以这里写明了

基本上配置和xml中差不多,但是只有了MapperScannerConfigurer扫描Dao层(因为需要用到@Select等注解)

3.demo

UserDao.java

@Repository
public interface UserDao {
    
    
	@Select("select * from user where id=#{id}")
	// 下面对应各种sql操作,但是由于注解方式不太灵活可以使用下面这个@XXXProvider对实际的业务逻辑进行处理,总的来说没有xml配置方式方便
	// 但是在写简单的sql方面比较好,注意注解方式的映射和xml方式的映射两种不可同时存在
	//@Update
	//@Delete
	//@Insert
	//@UpdateProvider
	public User findById(@Param("id") Integer id);
}

User.java


public class User {
    
    
	private int id;
	private String name;
	//....
}

UserService.java

@Service
public class UserService {
    
    
	@Autowired
	private UserDao userDao;

	@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
	public User getUserById(Integer id) {
    
    
		return userDao.findById(id);
	}
}

测试类MyBatisAnnotationTest .java

public class MyBatisAnnotationTest {
    
    
	public static void main(String[] args) {
    
    
		ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
		UserService userService = context.getBean(UserService.class);
		System.out.println(userService.getUserById(1));
	}
}

测试成功!当前的结果和前面的博文一致

4.总结

  1. 使用纯注解方式的执行sql:@Select等有一个缺点,就是需要编写太多java代码了,并且提高了复杂度,对于简单的sql还是比较友好的
  2. 注意不能同时使用xml方式和注解方式配置映射,会报错的!

猜你喜欢

转载自blog.csdn.net/weixin_45492007/article/details/113825822
今日推荐