代码拉取完成,页面将自动刷新
JEIbatis项目,用于为其他应用服务提供基础持久层统一处理能力,使开发人员摆脱繁杂的实体和Mapper编写工作,提高服务的开发速度。
Maven安装 (http://maven.apache.org/download.cgi)
Maven学习,请参考maven-基础
<!-- Mybatis SessionFactory-->
<bean id="sqlSessionFactory" class="com.je.ibatis.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configurationProperties" >
<bean class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<!-- mybatis配置文件 -->
<property name="locations" value="classpath*:mybatis.properties"/>
</bean>
</property>
<!-- 元数据解析器 实现 MetaDataParse 接口 -->
<property name="metaDataParse">
<bean class="com.je.ibatis.extension.parse.DefaultMetaDataParse"/>
</property>
<!-- 元数据缓存管理 实现 MetaDataCacheManager 接口-->
<property name="cacheManager">
<bean class="com.je.cache.service.ibatis.SaaSMetaDataCacheManager"/>
</property>
<property name="plugins">
<array>
<!-- 分页插件配置 -->
<bean id="paginationInterceptor" class="com.je.ibatis.extension.plugins.PaginationInterceptor"/>
</array>
</property>
</bean>
<!-- MapperScanner 扫描Mapper 创建代理 -->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.je.**.mapper" />
<property name="annotationClass" value="org.apache.ibatis.annotations.Mapper" />
</bean>
说明:
boolean condition
表示该条件是否加入sql中boolean
类型的入参,默认为true
Param
均为ConditionsWrapper
的实例R
为泛型,在ConditionsWrapper中是String
R column
均表示数据库字段Map
和List
的均以json
形式表现!allEq(Map<R, V> params)
allEq(Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, Map<R, V> params, boolean null2IsNull)
全部eq(或个别isNull)
个别参数说明:
params
: key
为数据库字段名,value
为字段值
null2IsNull
: 为true
则在map
的value
为null
时调用 isNull 方法,为false
时则忽略value
为null
的
例1: allEq({id:1,name:"老王",age:null})
--->id = 1 and name = '老王' and age is null
例2: allEq({id:1,name:"老王",age:null}, false)
--->id = 1 and name = '老王'
allEq(BiPredicate<R, V> filter, Map<R, V> params)
allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
个别参数说明:
filter
: 过滤函数,是否允许字段传入比对条件中
params
与 null2IsNull
: 同上
allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null})
--->name = '老王' and age is null
allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:null}, false)
--->name = '老王'
eq(R column, Object val)
eq(boolean condition, R column, Object val)
eq("name", "老王")
--->name = '老王'
ne(R column, Object val)
ne(boolean condition, R column, Object val)
ne("name", "老王")
--->name <> '老王'
gt(R column, Object val)
gt(boolean condition, R column, Object val)
gt("age", 18)
--->age > 18
ge(R column, Object val)
ge(boolean condition, R column, Object val)
ge("age", 18)
--->age >= 18
lt(R column, Object val)
lt(boolean condition, R column, Object val)
lt("age", 18)
--->age < 18
le(R column, Object val)
le(boolean condition, R column, Object val)
le("age", 18)
--->age <= 18
between(R column, Object val1, Object val2)
between(boolean condition, R column, Object val1, Object val2)
between("age", 18, 30)
--->age between 18 and 30
notBetween(R column, Object val1, Object val2)
notBetween(boolean condition, R column, Object val1, Object val2)
notBetween("age", 18, 30)
--->age not between 18 and 30
like(R column, Object val)
like(boolean condition, R column, Object val)
like("name", "王")
--->name like '%王%'
notLike(R column, Object val)
notLike(boolean condition, R column, Object val)
notLike("name", "王")
--->name not like '%王%'
likeLeft(R column, Object val)
likeLeft(boolean condition, R column, Object val)
likeLeft("name", "王")
--->name like '%王'
likeRight(R column, Object val)
likeRight(boolean condition, R column, Object val)
likeRight("name", "王")
--->name like '王%'
isNull(R column)
isNull(boolean condition, R column)
isNull("name")
--->name is null
isNotNull(R column)
isNotNull(boolean condition, R column)
isNotNull("name")
--->name is not null
in(R column, Collection<?> value)
in(boolean condition, R column, Collection<?> value)
in("age",[1,2,3])
--->age in (1,2,3)
in("age",[])
--->age in (null)
in(R column, Object... values)
in(boolean condition, R column, Object... values)
in("age", 1, 2, 3)
--->age in (1,2,3)
notIn(R column, Collection<?> value)
notIn(boolean condition, R column, Collection<?> value)
notIn("age",[1,2,3])
--->age not in (1,2,3)
notIn(R column, Object... values)
notIn(boolean condition, R column, Object... values)
notIn("age", 1, 2, 3)
--->age not in (1,2,3)
inSql(R column, String inValue)
inSql(boolean condition, R column, String inValue)
inSql("age", "1,2,3,4,5,6")
--->age in (1,2,3,4,5,6)
inSql("id", "select id from table where id < 3")
--->id in (select id from table where id < 3)
notInSql(R column, String inValue)
notInSql(boolean condition, R column, String inValue)
notInSql("age", "1,2,3,4,5,6")
--->age not in (1,2,3,4,5,6)
notInSql("id", "select id from table where id < 3")
--->age not in (select id from table where id < 3)
groupBy(R... columns)
groupBy(boolean condition, R... columns)
groupBy("id", "name")
--->group by id,name
orderByAsc(R... columns)
orderByAsc(boolean condition, R... columns)
orderByAsc("id", "name")
--->order by id ASC,name ASC
orderByDesc(R... columns)
orderByDesc(boolean condition, R... columns)
orderByDesc("id", "name")
--->order by id DESC,name DESC
orderBy(boolean condition, boolean isAsc, R... columns)
orderBy(true, true, "id", "name")
--->order by id ASC,name ASC
or()
or(boolean condition)
拼接 OR
注意事项:
主动调用or
表示紧接着下一个方法不是用and
连接!(不调用or
则默认为使用and
连接)
例: eq("id",1).or().eq("name","老王")
--->id = 1 or name = '老王'
or(Consumer<Param> consumer)
or(boolean condition, Consumer<Param> consumer)
or(i -> i.eq("name", "李白").ne("status", "活着"))
--->or (name = '李白' and status <> '活着')
and(Consumer<Param> consumer)
and(boolean condition, Consumer<Param> consumer)
and(i -> i.eq("name", "李白").ne("status", "活着"))
--->and (name = '李白' and status <> '活着')
nested(Consumer<Param> consumer)
nested(boolean condition, Consumer<Param> consumer)
nested(i -> i.eq("name", "李白").ne("status", "活着"))
--->(name = '李白' and status <> '活着')
exists(String existsSql)
exists(boolean condition, String existsSql)
exists("select id from table where age = 1")
--->exists (select id from table where age = 1)
notExists(String notExistsSql)
notExists(boolean condition, String notExistsSql)
notExists("select id from table where age = 1")
--->not exists (select id from table where age = 1)
apply(String applySql, Object... params)
apply(boolean condition, String applySql, Object... params)
params
对应前面applySql
内部的{index}
部分.使用预处理方式,不会有sql注入风险的!apply("id = 1")
--->id = 1
apply("id in ({0})", Lists.newArrayList(1,2,3))
--->and id in(1,2,3)
apply("name like {0}", "jay%")
--->name like 'jay%'
apply("name like {0}", "%jay%")
--->name like '%jay%'
apply("date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
--->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
apply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2008-08-08")
--->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
说明:
mapper
均为MetaBaseMapper
子接口的Mapper实例tableCode
均为平台资源表名称pkValue
均为主键wrapper
均为ConditionsWrapper
实例@Mapper
public interface MetaMapper extends MetaBaseMapper {
}
@Autowired
private MetaMapper baseDataMapper;
int insertMap(Map<String, Object> beanMap)
Map<String, Object> beanMap = new HashMap<>();
beanMap.put(Constants.KEY_TABLE_CODE, tableCode);
// 如果插入前未指定主键值,则会使用自动生成主键策略
// beanMap.put("ID", "1");
beanMap.put("CODE", "编号");
beanMap.put("NAME", "名称");
// 插入数据
mapper.insertMap(beanMap);
// 主键为自动生成时,插入后会将主键值放入Map
Object pkValue = beanMap.get("ID");
int updateMap(@Param(Constants.MAP_ALIAS) Map<String, Object> beanMap, @Param(Constants.WRAPPER_ALIAS) ConditionsWrapper wrapper)
Map<String, Object> beanMap = new HashMap<>();
beanMap.put(Constants.KEY_TABLE_CODE, tableCode);
beanMap.put("CODE", "编号01");
beanMap.put("NAME", "名称01");
// 如果wrapper为空时,使用主键作为where条件
beanMap.put(Constants.KEY_PK_VALUE, pkValue);
//update语句的where条件
ConditionsWrapper wrapper = ConditionsWrapper.builder().apply("CODE = '编号' and NAME = '名称'");
mapper.updateMap(beanMap, wrapper);
List<Map<String, Object>> select(@Param(Constants.PAGE_ALIAS) Page page, @Param(Constants.WRAPPER_ALIAS) ConditionsWrapper wrapper);
//页编码 current = -1 时不分页
int current = 1;
//每页数量
int size = 30;
Page page = new Page(current, size);
//select语句的where条件
ConditionsWrapper wrapper = ConditionsWrapper.builder()
//指定tableCode
.table(tableCode)
//添加where条件
.apply("CODE = '编号' and NAME = '名称'")
.apply(" ORDER BY CODE ");
//wrapper作为where条件语句时不能以AND开头, 可调用 wrapper.getSql()进行调试。
List<Map<String, Object>> list = mapper.select(page, wrapper);
List<Map<String, Object>> load(@Param(Constants.PAGE_ALIAS) Page page, @Param(Constants.WRAPPER_ALIAS) ConditionsWrapper wrapper);
//页编码 current = -1 时不分页
int current = 1;
//每页数量
int size = 30;
Page page = new Page(current, size);
//select语句的where条件
ConditionsWrapper wrapper = ConditionsWrapper.builder()
//指定funcCode
.function(funcCode)
//添加where条件
.apply("CODE = '编号' and NAME = '名称'")
.apply(" ORDER BY CODE ");
//wrapper作为where条件语句时不能以AND开头, 可调用 wrapper.getSql()进行调试。
List<Map<String, Object>> list = mapper.load(page, wrapper);
Map<String, Object> selectOneByPk(@Param(Constants.KEY_TABLE_CODE) String tableCode, @Param(Constants.KEY_PK_VALUE) String pkValue);
//使用表名与主键查询,查询资源表所有列
Map<String, Object> map = mapper.selectOneByPk(tableCode, pkValue);
int delete(@Param(Constants.WRAPPER_ALIAS) ConditionsWrapper wrapper);
//delete语句的where条件
ConditionsWrapper wrapper = ConditionsWrapper.builder()
//指定tableCode
.table(tableCode)
//添加where条件
.apply("CODE = '编号' and NAME = '名称'")
.apply(" ORDER BY CODE ");
//wrapper作为where条件语句时不能以AND开头, 可调用 wrapper.getSql()进行调试。
int num = mapper.delete(wrapper);
List<Map<String, Object>> selectSql(@Param(Constants.PAGE_ALIAS) Page page, @Param(Constants.WRAPPER_ALIAS) ConditionsWrapper wrapper);
//页编码 current = -1 时不分页
int current = 1;
//每页数量
int size = 30;
Page page = new Page(current, size);
//wrapper为完整select语句
ConditionsWrapper wrapper = ConditionsWrapper.builder()
.apply("select * from USER where ")
//添加where条件
.eq("CODE", "编号")
.apply(" and NAME = {0}", "名称")
.apply(" ORDER BY CODE ");
List<Map<String, Object>> list = mapper.selectSql(page, wrapper);
int insertSql(@Param(Constants.WRAPPER_ALIAS) ConditionsWrapper wrapper);
//wrapper为完整语句
ConditionsWrapper wrapper = ConditionsWrapper.builder()
.apply("INSERT INTO USER (CODE, NAME) VALUES ({0}, {1})", "编号", "名称");
int num = mapper.insertSql(wrapper);
int updateSql(@Param(Constants.WRAPPER_ALIAS) ConditionsWrapper wrapper);
//wrapper为完整语句
ConditionsWrapper wrapper = ConditionsWrapper.builder()
.apply("UPDATE USER SET AGE = {0} WHERE CODE = {1} ", 18, "Wang");
int num = mapper.updateSql(wrapper);
int deleteSql(@Param(Constants.WRAPPER_ALIAS) ConditionsWrapper wrapper);
//wrapper为完整语句
ConditionsWrapper wrapper = ConditionsWrapper.builder()
.apply("DELETE FROM USER WHERE CODE = {0} ", "Wilson");
int num = mapper.deleteSql(wrapper);
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。