Skip to main content
Hint

This article is generated by AI translation.

MongoDB Datasource Specifics

dbVisitor accesses MongoDB data sources via the JDBC-Mongo driver, based on the JDBC protocol.

Supported capabilities:

Not supported: executeBatch, stored procedures

Concept Analogy

Different MongoDB 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 _JSON (both strings)

Command Mode (JdbcTemplate)

Use JdbcTemplate to execute MongoDB commands directly. Ensure you have properly configured the MongoDB data source first — see MongoDB Driver Usage Guide.

Tip

For more usage patterns, see JdbcTemplate. The following features are not supported due to driver limitations:

  • Batch operations
  • Stored procedures
Create JdbcTemplate
JdbcTemplate jdbc = new JdbcTemplate(dataSource);
// or
JdbcTemplate jdbc = new JdbcTemplate(connection);
Insert data
// Direct command
jdbc.execute("test.user_info.insert({name: 'mali', age: 26})");
// Parameterized command
jdbc.execute("test.user_info.insert(?)", new Object[] { "{name: 'mali', age: 26}" });
Query data
// Query all
List<Map<String, Object>> list = jdbc.queryForList("test.user_info.find()");
// Conditional query
Map<String, Object> mali = jdbc.queryForMap("test.user_info.find({name: 'mali'})");
String json = (String) mali.get("_JSON");
Update data
jdbc.execute("test.user_info.update({name: 'mali'}, {$set: {age: 27}})");
Delete data
jdbc.execute("test.user_info.remove({name: 'mali'})");

Fluent API (LambdaTemplate)

The Fluent API provides a type-safe, chained approach for operating MongoDB. Usage is identical to RDBMS — see Fluent API for details.

Initialize
LambdaTemplate lambda = new LambdaTemplate(dataSource);
Insert
UserInfo user = new UserInfo();
user.setUid("1001");
user.setName("test_user");

int result = lambda.insert(UserInfo.class)
.applyEntity(user)
.executeSumResult();
Query
// Query by condition
UserInfo user = lambda.query(UserInfo.class)
.eq(UserInfo::getUid, "1001")
.queryForObject();

// List query
List<UserInfo> users = lambda.query(UserInfo.class)
.like(UserInfo::getName, "test%")
.queryForList();
Update
int result = lambda.update(UserInfo.class)
.eq(UserInfo::getUid, "1001")
.updateTo(UserInfo::getName, "New Name")
.doUpdate();
Delete
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.

Define Mapper interface
@SimpleMapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
// Custom methods can be added here
}
CRUD with Mapper
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

Tip

All annotations provided by the core API work on MongoDB data sources, except for the @Call annotation.

1. Define object
@Table("user_info")
public class UserInfo {
@Column(value = "uid", primary = true)
private String uid;
@Column("name")
private String name;
... // getters/setters omitted
}
2. Define Mapper interface
@SimpleMapper()
public interface UserInfoMapper {
@Insert("test.user_info.insert(#{info, typeHandler=net.hasor.dbvisitor.types.handler.json.JsonTypeHandler})")
int saveUser(@Param("info") UserInfo info);

@Query("test.user_info.find({uid: #{uid}})")
UserInfo loadUser(@Param("uid") String uid);

@Delete("test.user_info.remove({uid: #{uid}})")
int deleteUser(@Param("uid") String uid);
}
3. Create and use Mapper
Configuration config = new Configuration();
Session session = config.newSession(dataSource);

UserInfoMapper mapper = session.createMapper(UserInfoMapper.class);

ObjectId Mapping

MongoDB's _id field is typically of ObjectId type, while in Java objects we usually use String.

Define object (ObjectId mapping)
@Table("user_info")
public class UserInfo {
@Column(value = "_id", primary = true, keyType = KeyType.Auto, whereValueTemplate = "ObjectId(?)")
private String id;

@Column("name")
private String name;
...
}
Mapper definition (query with ObjectId)
@SimpleMapper()
public interface UserInfoMapper {
@Query("test.user_info.find({_id: ObjectId(#{id})})")
UserInfo loadById(@Param("id") String id);
}

Paginated Query

Add a Page parameter to Mapper methods to enable paginated queries.

Mapper definition
@SimpleMapper()
public interface UserInfoMapper {
@Query("test.user_info.find({name: #{name}})")
List<UserInfo> queryByName(@Param("name") String name, Page page);
}
Call with pagination
Page page = new PageObject();
page.setPageSize(10);

List<UserInfo> list = mapper.queryByName("mali", page);

File Mode (Mapper File)

1. Define object
@Table("user_info")
public class UserInfo {
@Column(value = "uid", primary = true)
private String uid;
@Column("name")
private String name;
... // getters/setters omitted
}
2. Define Mapper file
<?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">
test.user_info.insert(#{info, typeHandler=net.hasor.dbvisitor.types.handler.json.JsonTypeHandler})
</insert>

<select id="loadUser" resultType="net.test.dto.UserInfo">
test.user_info.find({uid: #{uid}})
</select>

<delete id="deleteUser">
test.user_info.remove({uid: #{uid}})
</delete>
</mapper>
3. Define Mapper interface
@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);
}