Skip to content

Commit

Permalink
逻辑删除功能的selectByExample,updateByExample,updateByExampleSelective条件wher…
Browse files Browse the repository at this point in the history
…e中加入逻辑删除字段的未删除条件
  • Loading branch information
duwey committed Nov 13, 2018
1 parent ef48862 commit 6ad4ff4
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package tk.mybatis.mapper.test.logic;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.Assert;
import org.junit.Test;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.entity.Example.Criteria;
import tk.mybatis.mapper.mapper.MybatisHelper;
import tk.mybatis.mapper.mapper.TbUserLogicDeleteMapper;
import tk.mybatis.mapper.mapper.TbUserMapper;
Expand Down Expand Up @@ -302,12 +304,84 @@ public void testSelectByExample() {

Example example = new Example(TbUserLogicDelete.class);
example.createCriteria().andEqualTo("id", 9);
Assert.assertEquals(0, logicDeleteMapper.selectByExample(example).size());

example.or().andEqualTo("username", "test");
Assert.assertEquals(1, logicDeleteMapper.selectByExample(example).size());

example.and().andEqualTo("username", "test");

} finally {
sqlSession.rollback();
sqlSession.close();
}
}

@Test
public void testSelectByExample2() {
SqlSession sqlSession = MybatisHelper.getSqlSession();
try {
TbUserLogicDeleteMapper logicDeleteMapper = sqlSession.getMapper(TbUserLogicDeleteMapper.class);

// username为test的有两条 一条标记为已删除
Example example = new Example(TbUserLogicDelete.class);
example.createCriteria().andEqualTo("username", "test");
Assert.assertEquals(1, logicDeleteMapper.selectByExample(example).size());

// password为dddd的已删除 username为test2的未删除
example.or().andEqualTo("password", "dddd").orEqualTo("username", "test2");

Assert.assertEquals(2, logicDeleteMapper.selectByExample(example).size());
} finally {
sqlSession.rollback();
sqlSession.close();
}
}

@Test
public void testUpdateByExample() {
SqlSession sqlSession = MybatisHelper.getSqlSession();
try {
TbUserLogicDeleteMapper logicDeleteMapper = sqlSession.getMapper(TbUserLogicDeleteMapper.class);

// username为test的有两条 一条标记为已删除
Example example = new Example(TbUserLogicDelete.class);
example.createCriteria().andEqualTo("username", "test");

TbUserLogicDelete tbUserLogicDelete = new TbUserLogicDelete();
tbUserLogicDelete.setUsername("123");
logicDeleteMapper.updateByExample(tbUserLogicDelete, example);

example.clear();
example.createCriteria().andEqualTo("username", "123");
List<TbUserLogicDelete> list = logicDeleteMapper.selectByExample(example);
Assert.assertEquals(1, list.size());

Assert.assertNull(list.get(0).getPassword());
} finally {
sqlSession.rollback();
sqlSession.close();
}
}

@Test
public void testUpdateByExampleSelective() {
SqlSession sqlSession = MybatisHelper.getSqlSession();
try {
TbUserLogicDeleteMapper logicDeleteMapper = sqlSession.getMapper(TbUserLogicDeleteMapper.class);

Example example = new Example(TbUserLogicDelete.class);
example.createCriteria().andEqualTo("username", "test");

TbUserLogicDelete tbUserLogicDelete = new TbUserLogicDelete();
tbUserLogicDelete.setUsername("123");
logicDeleteMapper.updateByExampleSelective(tbUserLogicDelete, example);

example.clear();
example.createCriteria().andEqualTo("username", "123");
List<TbUserLogicDelete> list = logicDeleteMapper.selectByExample(example);
Assert.assertEquals(1, list.size());

Assert.assertEquals("gggg", list.get(0).getPassword());
} finally {
sqlSession.rollback();
sqlSession.close();
Expand Down
5 changes: 5 additions & 0 deletions core/src/main/java/tk/mybatis/mapper/entity/Example.java
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,11 @@ protected GeneratedCriteria(Map<String, EntityColumn> propertyMap, boolean exist
this.propertyMap = propertyMap;
}

public Map<String, EntityColumn> getPropertyMap() {

return propertyMap;
}

private String column(String property) {
if (propertyMap.containsKey(property)) {
return propertyMap.get(property).getColumn();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -910,6 +910,8 @@ public static String exampleCheck(Class<?> entityClass) {
public static String exampleWhereClause() {
return "<if test=\"_parameter != null\">" +
"<where>\n" +
" ${@tk.mybatis.mapper.util.OGNL@andNotLogicDelete(oredCriteria)}" +
" <trim prefix=\"(\" prefixOverrides=\"and |or \" suffix=\")\">\n" +
" <foreach collection=\"oredCriteria\" item=\"criteria\">\n" +
" <if test=\"criteria.valid\">\n" +
" ${@tk.mybatis.mapper.util.OGNL@andOr(criteria)}" +
Expand All @@ -936,6 +938,7 @@ public static String exampleWhereClause() {
" </trim>\n" +
" </if>\n" +
" </foreach>\n" +
" </trim>\n" +
"</where>" +
"</if>";
}
Expand All @@ -947,6 +950,8 @@ public static String exampleWhereClause() {
*/
public static String updateByExampleWhereClause() {
return "<where>\n" +
" ${@tk.mybatis.mapper.util.OGNL@andNotLogicDelete(example.oredCriteria)}" +
" <trim prefix=\"(\" prefixOverrides=\"and |or \" suffix=\")\">\n" +
" <foreach collection=\"example.oredCriteria\" item=\"criteria\">\n" +
" <if test=\"criteria.valid\">\n" +
" ${@tk.mybatis.mapper.util.OGNL@andOr(criteria)}" +
Expand All @@ -973,6 +978,7 @@ public static String updateByExampleWhereClause() {
" </trim>\n" +
" </if>\n" +
" </foreach>\n" +
" </trim>\n" +
"</where>";
}

Expand Down
31 changes: 31 additions & 0 deletions core/src/main/java/tk/mybatis/mapper/util/OGNL.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,12 @@
package tk.mybatis.mapper.util;

import tk.mybatis.mapper.MapperException;
import tk.mybatis.mapper.annotation.LogicDelete;
import tk.mybatis.mapper.entity.EntityColumn;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.entity.IDynamicTableName;
import tk.mybatis.mapper.mapperhelper.EntityHelper;
import tk.mybatis.mapper.mapperhelper.SqlHelper;

import java.lang.reflect.Method;
import java.util.*;
Expand Down Expand Up @@ -224,4 +226,33 @@ public static String andOr(Object parameter) {
return "and";
}
}

/**
* 拼接逻辑删除字段的未删除查询条件
* @param criteriaList
* @return
*/
public static String andNotLogicDelete(List<Example.Criteria> criteriaList) {

if (criteriaList != null && criteriaList.size() != 0) {
// 随便拿一个得到propertyMap,判断是否有逻辑删除注解的字段
Example.Criteria tempCriteria = criteriaList.get(0);

Map<String, EntityColumn> propertyMap = tempCriteria.getPropertyMap();

for (Map.Entry<String, EntityColumn> entry: propertyMap.entrySet()) {
EntityColumn column = entry.getValue();

if (column.getEntityField().isAnnotationPresent(LogicDelete.class)) {

// 未逻辑删除的条件
return column.getColumn() + " = " + SqlHelper.getLogicDeletedValue(column, false) + " and ";
}
}

}

return "";
}

}

0 comments on commit 6ad4ff4

Please sign in to comment.