HasorDB 執(zhí)行Mapper

2022-01-10 11:32 更新

DalSession 方式?

Mapper 文件在定義完成之后,需要加載它然后就可以通過 ?DalSession ?接口調(diào)用它了。例如下面映射:

?/mapper/mapper_1/TestUserMapper.xml?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//hasor.net//DTD Mapper 1.0//EN"
"https://www.hasor.net/schema/hasordb-mapper.dtd">
<mapper>
<select id="queryListByAge">
select * from `test_user` where age = #{age}
</select>
</mapper>

加載這個(gè)映射并執(zhí)行它。

DalRegistry dalRegistry = new DalRegistry();
dalRegistry.loadMapper("/mapper/mapper_1/TestUserMapper.xml");

DataSource dataSource = DsUtils.dsMySql();
DalSession dalSession = new DalSession(dataSource, dalRegistry);

Map<String, Object> ages = new HashMap<>();
ages.put("age", 26);
List<Object> result = dalSession.queryStatement("queryListByAge", ages);

對(duì)于 ?insert?、?update?、?delete ?三組標(biāo)簽需要使用如下方式來執(zhí)行,這樣才能正確返回受影響行數(shù)

int result = dalSession.executeStatement("insertUser", ages);

對(duì)于 ?mapper ?標(biāo)簽已經(jīng)配置了 ?namespace ?的 Mapper SQL還需要指明 ?namespace?。例如:

?/mapper/mapper_1/TestUserMapper.xml?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//hasor.net//DTD Mapper 1.0//EN"
"https://www.hasor.net/schema/hasordb-mapper.dtd">
<mapper namespace="net.example.mapper">
<select id="queryListByAge">
select * from `test_user` where age = #{age}
</select>
</mapper>
int result = dalSession.executeStatement("net.example.mapper.queryListByAge", ages);

Mapper 接口化方式?

一般應(yīng)用開發(fā)的時(shí)候都會(huì)有一個(gè) ?DAO ?層,而 DAO 通常是以一個(gè)接口形態(tài)展現(xiàn)出來。在 MyBatisPlus 中會(huì)被成為 ?Mapper ?接口。 HasorDB 支持定義一個(gè)接口,然后將這個(gè)接口的方法映射到 Mapper 文件的具體執(zhí)行命令上。例如:

Mapper 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//hasor.net//DTD Mapper 1.0//EN"
"https://www.hasor.net/schema/hasordb-mapper.dtd">
<mapper namespace="net.hasor.db.example.mapper.File3Mapper">
<select id="queryListByAge">
select * from `test_user` where age = #{age}
</select>
</mapper>

Mapper 接口定義

?net.hasor.db.example.mapper.File3Mapper?

public interface File3Mapper {
public List<Map<String, Object>> queryListByAge(@Param("age") int age);
}

最后加載并獲取這個(gè)接口,就可以當(dāng)成普通方法調(diào)用了。

DalRegistry dalRegistry = new DalRegistry();
dalRegistry.loadMapper("...");

DataSource dataSource = DsUtils.dsMySql();
DalSession dalSession = new DalSession(dataSource, dalRegistry);

File3Mapper mapper = dalSession.createMapper(File3Mapper.class);

List<Map<String, Object>> result = mapper.queryListByAge(26);

當(dāng)你有大量 Mapper 文件需要和接口進(jìn)行綁定的時(shí) ?dalRegistry ?的注冊(cè)將會(huì)變得比較麻煩。 因此可以改造上面例子使用下面方式即可省略? dalRegistry.loadMapper("...")?。

@RefMapper("/mapper/mapper_1/TestUserMapper3.xml")
public interface File3Mapper {
public List<Map<String, Object>> queryListByAge(@Param("age") int age);
}

如果 ?Mapper ?配置了 ?resultMap ?或 ?resultType ?那么返回值可以使用對(duì)應(yīng)的類型。例如:

?/mapper/mapper_1/UserMapper.xml?

<select id="listByAge" resultType="net.hasor.db.example.mapper.TestUser">
select * from `test_user` where age = #{age};
</select>

直接返回一個(gè)對(duì)象列表

@RefMapper("/mapper/mapper_1/UserMapper.xml")
public interface UserMapper {
public List<TestUser> listByAge(@Param("age") int age);
}

通用 Mapper 接口?

通用 Mapper 接口類型為 ?BaseMapper<T>?,它是對(duì) ?LambdaTemplate ?的進(jìn)一步封裝。 與大多數(shù)數(shù)據(jù)庫(kù)訪問框架一樣 ?BaseMapper ?存在的意義在于避免編寫大量相同或類似的接口。

創(chuàng)建 BaseMapper 需要借助 ?DalSession ?類型,并且要確定一個(gè) DTO 對(duì)象。

DataSource dataSource = DsUtils.dsMySql();

DalSession dalSession = new DalSession(dataSource);
BaseMapper<TestUser> baseMapper = dalSession.createBaseMapper(TestUser.class);
提示
DTO 對(duì)象可以使用 對(duì)象映射 來修飾它,也可以參考 映射文件 配置一個(gè)實(shí)體。

?BaseMapper ?接口提供 ?insert?、?delete?、?update?、?query ?四個(gè)方法,進(jìn)行的操作。

每個(gè)方法返回的操作接口具體使用請(qǐng)參考 CRUD章節(jié)



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)