This article is generated by AI translation.
ElasticSearch Datasource Specifics
dbVisitor accesses ElasticSearch data sources via the JDBC-Elastic driver, based on the JDBC protocol.
Supported capabilities:
- Execute ElasticSearch DSL commands to manipulate data (supported command list)
- JdbcTemplate, Fluent API, BaseMapper, Annotations, Mapper File
- Object Mapping, ResultSet Mapping, Rules, Arguments, ResultSetExtractor/RowMapper
- Dynamic SQL tags in Mapper Files,
Statement.RETURN_GENERATED_KEYS(auto-retrieval of_id)
Not supported: executeBatch, stored procedures
Concept Analogy
Different ElasticSearch commands produce three types of results:
- Update count — analogous to INSERT/UPDATE/DELETE, retrieved via
executeUpdate - Single/multiple row results — analogous to SELECT result sets; first column is
_ID, second column is_DOC(both strings)
Command Mode (JdbcTemplate)
Use JdbcTemplate to execute ElasticSearch commands directly. Ensure you have properly configured the ElasticSearch data source first — see ElasticSearch Driver Usage Guide.
For more usage patterns, see JdbcTemplate. The following features are not supported due to driver limitations:
- Batch operations
- Stored procedures
JdbcTemplate jdbc = new JdbcTemplate(dataSource);
// or
JdbcTemplate jdbc = new JdbcTemplate(connection);
// Direct command
jdbc.execute("POST /my_index/_doc/1 { \"name\": \"mali\", \"age\": 26 }");
// Parameterized command
jdbc.execute("POST /my_index/_doc/1 { \"name\": ?, \"age\": ? }", new Object[] { "mali", 26 });
// Query all
List<Map<String, Object>> list = jdbc.queryForList(
"POST /my_index/_search { \"query\": { \"match_all\": {} } }");
// Conditional query
Map<String, Object> mali = jdbc.queryForMap(
"POST /my_index/_search { \"query\": { \"term\": { \"name\": \"mali\" } } }");
String json = (String) mali.get("_DOC");
jdbc.execute("POST /my_index/_update/1 { \"doc\": { \"age\": 27 } }");
jdbc.execute("DELETE /my_index/_doc/1");
Fluent API (LambdaTemplate)
The Fluent API provides a type-safe, chained approach for operating ElasticSearch. Usage is identical to RDBMS — see Fluent API for details.
LambdaTemplate lambda = new LambdaTemplate(dataSource);
UserInfo user = new UserInfo();
user.setUid("1001");
user.setName("test_user");
int result = lambda.insert(UserInfo.class)
.applyEntity(user)
.executeSumResult();
UserInfo user = lambda.query(UserInfo.class)
.eq(UserInfo::getUid, "1001")
.queryForObject();
List<UserInfo> users = lambda.query(UserInfo.class)
.like(UserInfo::getName, "test%")
.queryForList();
int result = lambda.update(UserInfo.class)
.eq(UserInfo::getUid, "1001")
.updateTo(UserInfo::getName, "New Name")
.doUpdate();
int result = lambda.delete(UserInfo.class)
.eq(UserInfo::getUid, "1001")
.doDelete();
BaseMapper Interface
BaseMapper provides generic CRUD methods. Usage is identical to RDBMS — see BaseMapper for details.
@SimpleMapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
// Custom methods can be added here
}
Session session = ...;
UserInfoMapper mapper = session.createMapper(UserInfoMapper.class);
// Insert
mapper.insert(user);
// Query
UserInfo loadedUser = mapper.selectById(user.getUid());
// Update
loadedUser.setName("updated_name");
mapper.update(loadedUser);
// Delete
mapper.deleteById(user.getUid());
Annotations
All annotations provided by the core API work on ElasticSearch data sources, except for the @Call annotation.
@Table("user_info")
public class UserInfo {
@Column(value = "uid", primary = true)
private String uid;
@Column("name")
private String name;
... // getters/setters omitted
}
@SimpleMapper()
public interface UserInfoMapper {
@Insert("POST /user_info/_doc { \"uid\": #{info.uid}, \"name\": #{info.name} }")
int saveUser(@Param("info") UserInfo info);
@Query("POST /user_info/_search { \"query\": { \"term\": { \"uid\": #{uid} } } }")
UserInfo loadUser(@Param("uid") String uid);
@Delete("POST /user_info/_delete_by_query { \"query\": { \"term\": { \"uid\": #{uid} } } }")
int deleteUser(@Param("uid") String uid);
}
Configuration config = new Configuration();
Session session = config.newSession(dataSource);
UserInfoMapper mapper = session.createMapper(UserInfoMapper.class);
Paginated Query
Add a Page parameter to Mapper methods to enable paginated queries.
@SimpleMapper()
public interface UserInfoMapper {
@Query("POST /user_info/_search { \"query\": { \"match_all\": {} } }")
List<UserInfo> queryAll(Page page);
}
Page page = new PageObject();
page.setPageSize(10);
List<UserInfo> list = mapper.queryAll(page);
File Mode (Mapper File)
@Table("user_info")
public class UserInfo {
@Column(value = "uid", primary = true)
private String uid;
@Column("name")
private String name;
... // getters/setters omitted
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//dbvisitor.net//DTD Mapper 1.0//EN"
"https://www.dbvisitor.net/schema/dbvisitor-mapper.dtd">
<mapper namespace="net.test.dto.UserInfoMapper">
<insert id="saveUser">
POST /user_info/_doc {
"uid": #{info.uid},
"name": #{info.name}
}
</insert>
<select id="loadUser" resultType="net.test.dto.UserInfo">
POST /user_info/_search {
"query": {
"term": { "uid": #{uid} }
}
}
</select>
<delete id="deleteUser">
POST /user_info/_delete_by_query {
"query": {
"term": { "uid": #{uid} }
}
}
</delete>
</mapper>
@RefMapper("/path/to/mapper.xml")
public interface UserInfoMapper {
int saveUser(@Param("info") UserInfo info);
UserInfo loadUser(@Param("uid") String uid);
int deleteUser(@Param("uid") String uid);
}