我正在使用mybatis-spring设置MyBatis项目,并且我希望将Java配置用于除实际SQL之外的所有内容(例如,映射器接口中没有@Select注释)。
我已经完成了以下设置,但它使用了@Select:
DataSource Bean:
@Configuration
public class DataSourceConfig {
@Bean
public DataSource devDataSource() {
... set up data source
return dataSource;
}
}
MyBatis Beans:
@Configuration
@MapperScan("myproject.persistence")
public class MyBatisConfig {
@Autowired
DataSource dataSource;
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
return sessionFactory.getObject();
}
}
Mapper界面:
package myproject.persistence;
public interface PersonMapper {
@Select("SELECT * FROM PersonTable WHERE PersonTable.LAST_NAME = #{lastName}")
List<Person> getByLastName(@Param("lastName") String lastName);
}
服务:
@Service
public class PeopleService {
@Autowired
PersonMapper personMapper;
public List<Person> getByLastName(final String lastName) {
return personMapper.getByLastName(lastName);
}
}
我正在寻找一种方法将@Select注释中的SQL语句移动到XML文件(但是为所有bean维护Java配置,并且仍然使用@MapperScan)。我正在寻找的缺失链接是将映射器接口与XML&#34; mapper&#34;配对的方法。它定义了SQL语句。
答案 0 :(得分:6)
你可以在myproject.persistence包下的PersonMapper.xml中定义你的sql(注意:接口应该与xml在同一个包中)。like blow:
<mapper namespace="myproject.persistence.PersonMapper">
<select id="getByLastName" parameterType="string" resultType="myproject.domain.Person">
SELECT * FROM PersonTable WHERE PersonTable.LAST_NAME = #{lastName}
</select>
mybatis将自动查找您在xml文件中定义的方法。
答案 1 :(得分:1)
package cn.fruitd.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.AbstractResource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
@Configuration
@MapperScan("cv.fruitd.dao")
public class DBConfig implements EnvironmentAware {
@Autowired
Environment env;
/**
* 配置数据源
*
* @return
*/
@Bean(initMethod = "init", destroyMethod = "close")
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(env.getProperty("db-url"));
dataSource.setUsername(env.getProperty("db-username"));
dataSource.setPassword(env.getProperty("db-password"));
dataSource.setAsyncInit(Boolean.parseBoolean(env.getProperty("db-asyncInit", "true")));
dataSource.setMinIdle(Integer.parseInt(env.getProperty("db-minIdle", "1")));
dataSource.setMaxActive(Integer.parseInt(env.getProperty("db-maxActive", "20")));
dataSource.setMaxWait(Long.parseLong(env.getProperty("db-maxWait", "60000")));
return dataSource;
}
@Bean
@Autowired
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) throws IOException {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
PathMatchingResourcePatternResolver pathM3R = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(pathM3R.getResources("classpath*:mybatis/*.xml"));
return sqlSessionFactoryBean;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer =
new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("cn.fruitd.dao");
mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");
return mapperScannerConfigurer;
}
@Override
public void setEnvironment(Environment environment) {
this.env = environment;
}
}