ash*_*ram 8 java sql spring jdbc properties-file
我正在使用 spring boot 和 spring jdbc 模板。我想在属性或 yml 文件中外部化 SQL 查询。我不想将 SQL 查询存储在 java 存储库类中。
处理这种情况的最佳方法是什么?
这就是我的存储库类现在的样子。
@Repository
public class UserRepositoryImpl extends BaseRepository implements UserRepository {
@Override
public List<User> findAll(){
String sqlQuery = "SELECT * FROM users";
return jdbcTemplate.query(sqlQuery, userMapper);
}
@Override
public User findById(Long userId){
String sqlQuery = "SELECT * FROM users WHERE id = :userId";
Map<String, String> namedParameters = new HashMap<String, String>();
namedParameters.put("userId", String.valueOf(userId));
return jdbcTemplate.queryForObject(sqlQuery, namedParameters, userMapper);
}
Run Code Online (Sandbox Code Playgroud)
小智 0
我知道这并不能直接解决您对属性文件或 yml 的询问,但我通常将您的问题解释为询问在项目中管理 sql 语句的最佳方法。在处理过包含大量 SQL 代码的项目后,我发现 MyBatis 可以承受,没有太多抱怨。简而言之,它已经处理了将 sql 外部化到外部 xml 文件的情况,并且当您积累更多 sql 时,可以将文件中 sql 的可管理性保持在良好的水平。
要进行设置,您基本上需要配置 bean 并创建两个 mybatis xml 文件以及存储库的 java 接口。以您的示例为例,这是用户存储库的 mybatis:
public class User {
private Long id;
private String name;
...
}
public interface UserRepository {
List<User> findAll();
User findById( @Param( "id" ) Long userId );
}
Run Code Online (Sandbox Code Playgroud)
@Param 会将 'id' 值映射到 SQL 中的 #{id} 表达式
META-INF/repo/sql/userMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bushcoder.so.app.user.UserRepository">
<resultMap id="user" type="com.bushcoder.so.app.user.User">
<id property="id" column="userId"/>
<result property="name" column="name"/>
</resultMap>
<select id="findAll" resultMap="user">
SELECT id, name FROM user
</select>
<select id="findById" parameterType="long" resultMap="user">
SELECT id, name FROM user WHERE id = #{id}
</select>
</mapper>
Run Code Online (Sandbox Code Playgroud)
注意:#{id} 将提供通过调用 userRepository.findById 传入的值
META-INF/repo/sql/sqlmap-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//www.mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
<mappers>
<mapper resource="META-INF/repo/sql/userMapper.xml"/>
</mappers>
</configuration>
Run Code Online (Sandbox Code Playgroud)
“META-INF/repo/sql/sqlmap-config.xml”路径将在 Java 配置中用于设置 mybatis 所需的 beans。因此,对于配置,您需要 4 个 bean:sqlSessionFactory、sqlSessionTemplate、dataSource 和 userRepository。这些需要位于配置类中的某个位置,供 Spring 处理。
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource());
sqlSessionFactory.setConfigLocation( new ClassPathResource( "META-INF/repo/sql/sqlmap-config.xml" ) );
return sqlSessionFactory.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate() throws Exception {
return new SqlSessionTemplate(sqlSessionFactory());
}
@Bean
public DataSource dataSource() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
EmbeddedDatabase db = builder
.setType( EmbeddedDatabaseType.H2)
.addScript("META-INF/repo/db/ddl/create-database-script.sql")
.addScript("META-INF/repo/db/dml/database-seeder-script.sql")
.build();
return db;
}
@Bean
public UserRepository userRepository() throws Exception {
return sqlSessionTemplate().getMapper( UserRepository.class );
}
Run Code Online (Sandbox Code Playgroud)
在我的原型项目中,我访问了 H2 数据库,并使用 EmbeddedDatabaseBuilder 来处理架构和种子数据。
META-INF/repo/db/ddl/create-database-script.sql:
CREATE TABLE if NOT EXISTS user (
id INTEGER PRIMARY KEY,
name VARCHAR(30)
);
Run Code Online (Sandbox Code Playgroud)
META-INF/repo/db/dml/database-seeder-script.sql:
INSERT INTO user (id, name) VALUES (1, 'BOB');
INSERT INTO user (id, name) VALUES (2, 'LARRY');
INSERT INTO user (id, name) VALUES (3, 'FRANK');
INSERT INTO user (id, name) VALUES (4, 'CHARLIE');
INSERT INTO user (id, name) VALUES (5, 'GARRY');
Run Code Online (Sandbox Code Playgroud)
您很可能会将存储库连接到服务中。可能看起来像这样:
public interface UserService {
List<User> findAll();
User findById(Long userId);
}
@Service
public class UserServiceImpl implements UserService {
@Inject
private UserRepository userRepository;
@Override
public List<User> findAll() {
return userRepository.findAll();
}
@Override
public User findById( Long userId ) {
return userRepository.findById( userId );
}
}
Run Code Online (Sandbox Code Playgroud)
调用代码可能是这样的:
@SpringBootApplication
@Import ( AppConfig.class )
public class MybatisConfigExampleApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run( MybatisConfigExampleApplication.class, args );
final UserService users = ( UserService ) context.getBean( "userServiceImpl" );
final List<User> allUsers = users.findAll();
System.out.println( "allUsers = " + allUsers );
final User userById_5 = users.findById( 5L );
System.out.println( "userById_5 = " + userById_5 );
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当您开始积累更多 sql 时,您将创建一个新的存储库接口及其匹配的映射器文件,通过 sqlmap-config xml 文件通过为其添加新元素来链接映射器 xml 文件,然后将<mapper>新存储库添加为Spring配置中的一个bean。此外,我没有展示它,如果 userMapper.xml 开始变得太大且麻烦,您可以将其分解为更小的文件,并仍然保留 UserRepository 接口。
| 归档时间: |
|
| 查看次数: |
16448 次 |
| 最近记录: |