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