优化 SqlMap 性能,增加 update 和 insert 生成参数接口,方便在 Mapper 中直接引用。

This commit is contained in:
thinkgem
2025-04-01 11:57:35 +08:00
parent 9bc8d5dd55
commit c0637ebf0d
2 changed files with 164 additions and 89 deletions

View File

@@ -24,5 +24,25 @@
</where>
ORDER BY ${sqlMap.order.toSql()}
</select>
<!-- 重写 Dao 中的 insert 查询方法 v5.11.1
<insert id="insert">
INSERT INTO ${sqlMap.insert.toTableSql()}
(${sqlMap.insert.toColumnSql()})
VALUES (${sqlMap.insert.toValuesSql()})
</insert> -->
<!-- 重写 Dao 中的 update 查询方法 v5.11.1
<update id="update">
UPDATE ${sqlMap.update.toTableSql()}
SET ${sqlMap.update.toColumnSql()}
WHERE ${sqlMap.update.toWhereSql()}
</update> -->
<!-- 重写 Dao 中的 phyDelete 查询方法 v5.11.1
<delete id="phyDelete">
DELETE FROM ${sqlMap.update.toTableSql()}
WHERE ${sqlMap.update.toWhereSql()}
</delete> -->
</mapper>

View File

@@ -33,7 +33,7 @@ import java.util.List;
public class DaoMapperTest extends BaseSpringContextTests {
@Autowired
private ConfigDao configDao;
private PostDao postDao;
@Autowired
private UserDao userDao;
@Autowired
@@ -41,8 +41,6 @@ public class DaoMapperTest extends BaseSpringContextTests {
@Autowired
private CompanyDao companyDao;
@Autowired
private DictDataDao dictDataDao;
@Autowired
private FileUploadDao fileUploadDao;
@Autowired
private EmpUserDao empUserDao;
@@ -52,32 +50,41 @@ public class DaoMapperTest extends BaseSpringContextTests {
try{
System.out.println("============ 插入测试 ============");
Config config = new Config();
config.setId("1");
config.setConfigKey("test");
config.setConfigName("test");
config.setConfigValue("1");
config.setIsSys("1");
long configInsertNum = configDao.insert(config);
Assert.assertEquals("configDao.insert", configInsertNum , 1);
Config configInsertRes = configDao.get(config);
Assert.assertEquals("configDao.insert result", configInsertRes.getId() , "1");
Post post1 = new Post();
post1.setId("1");
post1.setPostName("test");
post1.setPostType("1");
post1.setPostSort(1);
long postInsertNum = postDao.insert(post1);
Assert.assertEquals("postDao.insert", postInsertNum , 1);
Post postInsertRes = postDao.get(post1);
Assert.assertEquals("postDao.insert result", postInsertRes.getId() , "1");
System.out.println("============ 批量插入测试 ============");
Config config2 = (Config)config.clone();
config2.setId("2");
config2.setConfigKey("test2");
Config config3 = (Config)config.clone();
config3.setId("3");
config3.setConfigKey("test3");
long configinsertBatchNum = configDao.insertBatch(ListUtils.newArrayList(config2, config3));
Assert.assertEquals("configDao.insertBatch", configinsertBatchNum , 2);
Config configInsertBatchRes2 = configDao.get(config2);
Assert.assertEquals("configDao.insertBatch result", configInsertBatchRes2.getId() , "2");
Config configInsertBatchRes3 = configDao.get(config3);
Assert.assertEquals("configDao.insertBatch result", configInsertBatchRes3.getId() , "3");
Post post2 = (Post)post1.clone();
post2.setId("2");
post2.setPostName("test2");
Post post3 = (Post)post1.clone();
post3.setId("3");
post3.setPostName("test3");
long postInsertBatchNum = postDao.insertBatch(ListUtils.newArrayList(post2, post3));
Assert.assertEquals("postDao.insertBatch", postInsertBatchNum , 2);
Post postInsertBatchRes2 = postDao.get(post2);
Assert.assertEquals("postDao.insertBatch result", postInsertBatchRes2.getId() , "2");
Post postInsertBatchRes3 = postDao.get(post3);
Assert.assertEquals("postDao.insertBatch result", postInsertBatchRes3.getId() , "3");
System.out.println("============ 按主键更新测试 ============");
Post post4 = new Post("2");
post4.setPostName("test4");
long postUpdateNum = postDao.update(post4);
Assert.assertEquals("postDao.update", postUpdateNum , 1);
System.out.println("============ 按主键删除测试 ============");
long postDeleteNum = postDao.phyDelete(post4);
Assert.assertEquals("postDao.delete", postDeleteNum , 1);
System.out.println("============ 按树表更新测试 ============");
Area area = new Area();
area.setAreaCode("1");
area.setAreaName("你好");
@@ -105,7 +112,7 @@ public class DaoMapperTest extends BaseSpringContextTests {
Area areaUpdateRes = areaDao.get(area);
Assert.assertEquals("areaDao.update result", areaUpdateRes.getAreaName() , "你好2");
System.out.println("============ 按主键批量更新测试 ============");
System.out.println("============ 按树表批量更新测试 ============");
long areaUpdateBatchNum = areaDao.updateBatch(ListUtils.newArrayList(area2, area3));
Assert.assertEquals("areaDao.update", areaUpdateBatchNum , 2);
@@ -120,9 +127,9 @@ public class DaoMapperTest extends BaseSpringContextTests {
System.out.println("============ 更新数据状态测试 ============");
long areaStatusNum = areaDao.updateStatus(area);
Assert.assertEquals("areaDao.updateStatus", areaUpdateByEntityNum , 1);
Assert.assertEquals("areaDao.updateStatus", areaStatusNum , 1);
long areaStatusByEntityNum = areaDao.updateStatusByEntity(area, where);
Assert.assertEquals("areaDao.updateStatusByEntity", areaUpdateByEntityNum , 1);
Assert.assertEquals("areaDao.updateStatusByEntity", areaStatusByEntityNum , 1);
System.out.println("============ 逻辑删除测试 ============");
long areaDeleteNum = areaDao.delete(area);
@@ -209,13 +216,16 @@ public class DaoMapperTest extends BaseSpringContextTests {
Assert.assertEquals("fileUploadDao.findList attrName this", fileUploadList.size(), 0);
System.out.println("============ 树结构基本查询测试 ============");
DictData dictData = new DictData();
dictData.setParentCodes("0,");
List<DictData> dictDataList = dictDataDao.findByParentCodesLike(dictData);
Assert.assertTrue("dictDataDao.findByParentCodesLike", dictDataList.size() > 0);
List<DictData> dictDataList2 = dictDataDao.findList(dictData);
System.out.println(dictDataList2);
Assert.assertTrue("dictDataDao.findList", dictDataList2.size() > 0);
Area area6 = new Area();
area6.setParentCodes("0,370000,%");
List<Area> area6List = areaDao.findByParentCodesLike(area6);
System.out.println(area6List);
Assert.assertTrue("areaDao.findByParentCodesLike", !area6List.isEmpty());
Area area7 = new Area();
area7.setParentCodes_rightLike("0,370000,");
List<Area> area7List2 = areaDao.findList(area7);
System.out.println(area7List2);
Assert.assertTrue("areaDao.findByParentCodesRightLike", area6List.size() == area7List2.size());
System.out.println("============ 分页情况下foreach测试 ============");
EmpUser empUser = new EmpUser();
@@ -223,7 +233,11 @@ public class DaoMapperTest extends BaseSpringContextTests {
empUser.setPage(new Page<>(1, 3));
List<EmpUser> empUserList = empUserDao.findUserListByOfficeCodes(empUser);
System.out.println(empUserList);
Assert.assertTrue("empUserDao.findUserListByOfficeCodes", empUserList.size() > 0);
Assert.assertTrue("empUserDao.findUserListByOfficeCodes", !empUserList.isEmpty());
System.out.println("\n===========================================\n");
main(null);
}catch(Exception e){
e.printStackTrace();
@@ -233,94 +247,135 @@ public class DaoMapperTest extends BaseSpringContextTests {
public static void main(String[] args) {
String a = null, b = null;
System.out.println("============ 基本测试 ============");
a = new Config("1").sqlMap()
System.out.println("============ 插入测试 ============");
Post insertPost = new Post("1");
insertPost.setPostName("这是岗位名称");
insertPost.currentUser(new User("system"));
a = insertPost.sqlMap().getInsert().toTableSql();
a += insertPost.sqlMap().getInsert().toColumnSql();
a += insertPost.sqlMap().getInsert().toValuesSql();
b = "`js_sys_post``status`, `create_by`, `create_date`, `update_by`, `update_date`, `post_code`, `post_name`" +
"#{status}, #{createBy}, #{createDate}, #{updateBy}, #{updateDate}, #{postCode}, #{postName}";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(a, b);
System.out.println("============ 更新测试 ============");
Post updatePost = new Post("1");
updatePost.setPostName("这是岗位名称");
updatePost.currentUser(new User("system"));
a = updatePost.sqlMap().getUpdate().toTableSql();
a += updatePost.sqlMap().getUpdate().toColumnSql();
a += updatePost.sqlMap().getUpdate().toWhereSql();
b = "`js_sys_post``update_by` = #{updateBy}, `update_date` = #{updateDate}, `post_name` = #{postName}" +
"`post_code` = #{postCode}";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(a, b);
System.out.println("============ 查询测试 ============");
a = new Post("1").sqlMap()
.getWhere().and("name", QueryType.EQ, "abc").toSql();
b = "a.`id` = #{sqlMap.where#id#EQ1} AND a.name = #{sqlMap.where.name#EQ1.val}";
b = "a.`status` != #{STATUS_DELETE} AND a.`post_code` = #{sqlMap.where#post_code#EQ1}" +
" AND a.name = #{sqlMap.where.name#EQ1.val}";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(a, b);
a = new Config("1").sqlMap().getWhere()
a = new Post("1").sqlMap().getWhere()
.and("name", QueryType.IN, new String[]{"1", "2", "3"}).toSql();
b = "a.`id` = #{sqlMap.where#id#EQ1} AND a.name IN ( #{sqlMap.where.name#IN1.val[0]},"
+ " #{sqlMap.where.name#IN1.val[1]}, #{sqlMap.where.name#IN1.val[2]} )";
b = "a.`status` != #{STATUS_DELETE} AND a.`post_code` = #{sqlMap.where#post_code#EQ1}" +
" AND a.name IN ( #{sqlMap.where.name#IN1.val[0]}, #{sqlMap.where.name#IN1.val[1]}," +
" #{sqlMap.where.name#IN1.val[2]} )";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(a, b);
a = new Config("1").sqlMap().getWhere()
a = new Post("1").sqlMap().getWhere()
.or("name", QueryType.IN, new String[]{"1", "2", "3"}).toSql();
b = "a.`id` = #{sqlMap.where#id#EQ1} OR a.name IN ( #{sqlMap.where.name#IN1.val[0]},"
+ " #{sqlMap.where.name#IN1.val[1]}, #{sqlMap.where.name#IN1.val[2]} )";
b = "a.`status` != #{STATUS_DELETE} AND a.`post_code` = #{sqlMap.where#post_code#EQ1}" +
" OR a.name IN ( #{sqlMap.where.name#IN1.val[0]}, #{sqlMap.where.name#IN1.val[1]}," +
" #{sqlMap.where.name#IN1.val[2]} )";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(a, b);
System.out.println("============ 重复赋值测试 ============");
a = new Config("1").sqlMap().getWhere()
.and("name", QueryType.LIKE, "abc").and("name", QueryType.LIKE, "def").toSql();
b = "a.`id` = #{sqlMap.where#id#EQ1} AND a.name LIKE #{sqlMap.where.name#LIKE1.val}";
a = new Post("1").sqlMap().getWhere()
.and("name", QueryType.LIKE, "abc")
.and("name", QueryType.LIKE, "def").toSql();
b = "a.`status` != #{STATUS_DELETE} AND a.`post_code` = #{sqlMap.where#post_code#EQ1}" +
" AND a.name LIKE #{sqlMap.where.name#LIKE1.val}";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(a, b);
System.out.println("============ IN、NOT IN 测试 ============");
a = new Config("1").sqlMap().getWhere()
a = new Post("1").sqlMap().getWhere()
.and("name", QueryType.IN, new String[]{"abc","def"})
.and("name2", QueryType.NOT_IN, ListUtils.newArrayList("abc","def")).toSql();
b = "a.`id` = #{sqlMap.where#id#EQ1} AND a.name IN ( #{sqlMap.where.name#IN1.val[0]}, #{sqlMap.where.name#IN1.val[1]} )"
+ " AND a.name2 NOT IN ( #{sqlMap.where.name2#NOT_IN1.val[0]}, #{sqlMap.where.name2#NOT_IN1.val[1]} )";
b = "a.`status` != #{STATUS_DELETE} AND a.`post_code` = #{sqlMap.where#post_code#EQ1}" +
" AND a.name IN ( #{sqlMap.where.name#IN1.val[0]}, #{sqlMap.where.name#IN1.val[1]} )" +
" AND a.name2 NOT IN ( #{sqlMap.where.name2#NOT_IN1.val[0]}, #{sqlMap.where.name2#NOT_IN1.val[1]} )";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(a, b);
a = new Config("1").sqlMap().getWhere()
.and("name", QueryType.IN, null).and("name2", QueryType.IN, new String[]{})
a = new Post("1").sqlMap().getWhere()
.and("name", QueryType.IN, null)
.and("name2", QueryType.IN, new String[]{})
.and("name3", QueryType.NOT_IN, ListUtils.newArrayList()).toSql();
b = "a.`id` = #{sqlMap.where#id#EQ1}";
b = "a.`status` != #{STATUS_DELETE} AND a.`post_code` = #{sqlMap.where#post_code#EQ1}";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(a, b);
System.out.println("============ 带括号测试 ============");
a = new Config("1").sqlMap().getWhere()
.andBracket("name", QueryType.EQ, "abc", 1).or("name", QueryType.EQ, "def", 2)
a = new Post("1").sqlMap().getWhere()
.andBracket("name", QueryType.EQ, "abc", 1)
.or("name", QueryType.EQ, "def", 2)
.or("name", QueryType.EQ, "ghi", 3).endBracket().toSql();
b = "a.`id` = #{sqlMap.where#id#EQ1} AND ( a.name = #{sqlMap.where.name#EQ1.val}"
+ " OR a.name = #{sqlMap.where.name#EQ2.val} OR a.name = #{sqlMap.where.name#EQ3.val} )";
b = "a.`status` != #{STATUS_DELETE} AND a.`post_code` = #{sqlMap.where#post_code#EQ1}" +
" AND ( a.name = #{sqlMap.where.name#EQ1.val} OR a.name = #{sqlMap.where.name#EQ2.val}" +
" OR a.name = #{sqlMap.where.name#EQ3.val} )";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(a, b);
a = new Config().sqlMap().getWhere()
.andBracket("name", QueryType.EQ, "val1", 1).and("name", QueryType.NE, "val2", 11).endBracket(1)
.orBracket("name", QueryType.NE, "val3", 2).and("name", QueryType.NE, "val4", 22).endBracket(2)
.orBracket("name", QueryType.NE, "val5", 3).and("name", QueryType.EQ, "val6", 33).endBracket(3)
a = new Post().sqlMap().getWhere()
.andBracket("name", QueryType.EQ, "val1", 1)
.and("name", QueryType.NE, "val2", 11).endBracket(1)
.orBracket("name", QueryType.NE, "val3", 2)
.and("name", QueryType.NE, "val4", 22).endBracket(2)
.orBracket("name", QueryType.NE, "val5", 3)
.and("name", QueryType.EQ, "val6", 33).endBracket(3)
.toSql();
b = "( a.name = #{sqlMap.where.name#EQ1.val} AND a.name != #{sqlMap.where.name#NE11.val} )"
+ " OR ( a.name != #{sqlMap.where.name#NE2.val} AND a.name != #{sqlMap.where.name#NE22.val} )"
+ " OR ( a.name != #{sqlMap.where.name#NE3.val} AND a.name = #{sqlMap.where.name#EQ33.val} )";
b = "a.`status` != #{STATUS_DELETE}" +
" AND ( a.name = #{sqlMap.where.name#EQ1.val} AND a.name != #{sqlMap.where.name#NE11.val} )" +
" OR ( a.name != #{sqlMap.where.name#NE2.val} AND a.name != #{sqlMap.where.name#NE22.val} )" +
" OR ( a.name != #{sqlMap.where.name#NE3.val} AND a.name = #{sqlMap.where.name#EQ33.val} )";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(a, b);
System.out.println("============ 带括号部分空值测试 ============");
a = new Config("1").sqlMap().getWhere()
.andBracket("name", QueryType.EQ, "", 1).or("name", QueryType.EQ, "def", 2)
.or("name", QueryType.EQ, "", 3).endBracket().toSql();
b = "a.`id` = #{sqlMap.where#id#EQ1} AND ( a.name = #{sqlMap.where.name#EQ2.val} )";
a = new Post("1").sqlMap().getWhere()
.andBracket("name", QueryType.EQ, "", 1)
.or("name", QueryType.EQ, "def", 2)
.or("name", QueryType.EQ, "", 3).endBracket().toSql();
b = "a.`status` != #{STATUS_DELETE} AND a.`post_code` = #{sqlMap.where#post_code#EQ1}" +
" AND ( a.name = #{sqlMap.where.name#EQ2.val} )";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(a, b);
a = new Config("1").sqlMap().getWhere()
.andBracket("name", QueryType.EQ, "abc", 1).or("name", QueryType.EQ, "def", 2)
.or("name", QueryType.EQ, "", 3).endBracket().toSql();
b = "a.`id` = #{sqlMap.where#id#EQ1} AND ( a.name = #{sqlMap.where.name#EQ1.val}"
+ " OR a.name = #{sqlMap.where.name#EQ2.val} )";
a = new Post("1").sqlMap().getWhere()
.andBracket("name", QueryType.EQ, "abc", 1)
.or("name", QueryType.EQ, "def", 2)
.or("name", QueryType.EQ, "", 3).endBracket().toSql();
b = "a.`status` != #{STATUS_DELETE} AND a.`post_code` = #{sqlMap.where#post_code#EQ1}" +
" AND ( a.name = #{sqlMap.where.name#EQ1.val} OR a.name = #{sqlMap.where.name#EQ2.val} )";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(a, b);
a = new Config("1").sqlMap().getWhere()
.andBracket("name", QueryType.EQ, "", 1).or("name", QueryType.EQ, "def", 2)
.or("name", QueryType.EQ, "ghi", 3).endBracket().toSql();
b = "a.`id` = #{sqlMap.where#id#EQ1} AND ( a.name = #{sqlMap.where.name#EQ2.val}"
+ " OR a.name = #{sqlMap.where.name#EQ3.val} )";
a = new Post("1").sqlMap().getWhere()
.andBracket("name", QueryType.EQ, "", 1)
.or("name", QueryType.EQ, "def", 2)
.or("name", QueryType.EQ, "ghi", 3).endBracket().toSql();
b = "a.`status` != #{STATUS_DELETE} AND a.`post_code` = #{sqlMap.where#post_code#EQ1}" +
" AND ( a.name = #{sqlMap.where.name#EQ2.val} OR a.name = #{sqlMap.where.name#EQ3.val} )";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(a, b);
System.out.println("============ 带括号全部空值测试 ============");
a = new Config("1").sqlMap().getWhere()
.andBracket("name", QueryType.EQ, "", 1).or("name", QueryType.EQ, "", 2)
.or("name", QueryType.EQ, "", 3).endBracket().toSql();
b = "a.`id` = #{sqlMap.where#id#EQ1} ";
a = new Post("1").sqlMap().getWhere()
.andBracket("name", QueryType.EQ, "", 1)
.or("name", QueryType.EQ, "", 2)
.or("name", QueryType.EQ, "", 3).endBracket().toSql();
b = "a.`status` != #{STATUS_DELETE} AND a.`post_code` = #{sqlMap.where#post_code#EQ1} ";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(a, b);
a = new Config().sqlMap().getWhere()
.andBracket("name", QueryType.EQ, "", 1).or("name", QueryType.EQ, "", 2)
.or("name", QueryType.EQ, "", 3).endBracket().toSql();
b = "";
a = new Post().sqlMap().getWhere()
.andBracket("name", QueryType.EQ, "", 1)
.or("name", QueryType.EQ, "", 2)
.or("name", QueryType.EQ, "", 3).endBracket().toSql();
b = "a.`status` != #{STATUS_DELETE} ";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(a, b);
System.out.println("============ 实体嵌套测试 ============");
@@ -365,7 +420,7 @@ public class DaoMapperTest extends BaseSpringContextTests {
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(a, b);
System.out.println("============ 条件嵌套查询,可替代 andBracket、orBracket、endBracket v5.2.1+ ============");
a = new Config("1").sqlMap().getWhere()
a = new Post("1").sqlMap().getWhere()
.and("name", QueryType.EQ, "abc", 1)
.and((w) -> w
.or("name", QueryType.EQ, "def", 2)
@@ -379,7 +434,7 @@ public class DaoMapperTest extends BaseSpringContextTests {
.and("name", QueryType.EQ, "def", 7)
.and("name", QueryType.EQ, "ghi", 8)))
.toSql();
b = "a.`id` = #{sqlMap.where#id#EQ1} AND a.name = #{sqlMap.where.name#EQ1.val}" +
b = "a.`status` != #{STATUS_DELETE} AND a.`post_code` = #{sqlMap.where#post_code#EQ1} AND a.name = #{sqlMap.where.name#EQ1.val}" +
" AND (a.name = #{sqlMap.where.n#[0].name#EQ2.val} OR a.name = #{sqlMap.where.n#[0].name#EQ3.val})" +
" AND ((a.name = #{sqlMap.where.n#[1].n#[0].name#EQ4.val} AND a.name = #{sqlMap.where.n#[1].n#[0].name#EQ_FORCE6.val})" +
" OR (a.name = #{sqlMap.where.n#[1].n#[1].name#EQ7.val} AND a.name = #{sqlMap.where.n#[1].n#[1].name#EQ8.val}))";