在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:JDBFly开源软件地址:https://gitee.com/jianggujin/JDBFly开源软件介绍:第一部分 简介
1.1 特性
1.2 支持数据库标准功能部分支持所有标准数据库,全功能已经测试通过数据库有: 1.3 实现原理1.3.1 |
属性名 | 必填 | 说明 |
---|---|---|
value | 是 | 枚举类型JStyle ,指定转换规则,可选值如下: normal :原值camelhump :驼峰转下划线uppercase :转换为大写lowercase :转换为小写camelhumpAndUppercase :驼峰转下划线大写形式camelhumpAndLowercase :驼峰转下划线小写形式 |
示例:
@JNameStyle(JStyle.camelhump)private String userId; // => user_id
@JTable
注解描述:用于指定Java
实体对应的数据库表名称,该注解优先级最高,使用该注解之后名称转换规则
与动态表名
将失效,以value
的值为准。
属性:
属性名 | 必填 | 说明 |
---|---|---|
value | 是 | 对应数据库表名称 |
schema | 否 | 可选schema |
示例:
@JTable("TUC_USER") // TUC_USERpublic class User { // ...}
@JColumn
注解描述:用于指定Java
实体属性对应的数据库列名称,该注解优先级最高,使用该注解之后名称转换规则
与将失效,以value
的值为准。
属性:
属性名 | 必填 | 说明 |
---|---|---|
value | 是 | 对应数据库列名称 |
示例:
@JColumn("user_id")private String userId; // => user_id
@JExcludeInsert
注解描述:用于在插入操作的时候排除对应属性,即执行通用Mapper
插入方法的时候,添加@JExcludeInsert
注解的属性将会被忽略。
示例:
@JExcludeInsertprivate String userId;
@JExcludeSelect
注解描述:用于在查询操作的时候排除对应属性,即执行通用Mapper
查询方法的时候,添加@JExcludeSelect
注解的属性将会被忽略。
示例:
@JExcludeSelectprivate String userId;
@JExcludeUpdate
注解描述:用于在修改操作的时候排除对应属性,即执行通用Mapper
修改方法的时候,添加@JExcludeUpdate
注解的属性将会被忽略。
示例:
@JExcludeUpdateprivate String userId;
@JTransient
注解描述:用于忽略Java
实体属性,通常情况下用于在Java
实体中冗余属性,但实际该属性没有对应的列,不需要处理,该注解与直接在属性上添加transient
关键字效果是一样的。如果将该注解放在Mapper
的方法上面,默认解析器将忽略该方法。
示例:
@JTransientprivate String userId;
@JJdbcType
注解描述:用于指定Java
实体属性对应的Jdbc
类型,当某些情况Java
实体属性无法被正确识别转换的时候需要添加该注解。
属性:
属性名 | 必填 | 说明 |
---|---|---|
value | 是 | 枚举类型JdbcType ,可选值如下: ARRAY 、BIT 、TINYINT 、SMALLINT 、INTEGER BIGINT 、FLOAT 、REAL 、DOUBLE 、NUMERIC DECIMAL 、CHAR 、VARCHAR 、LONGVARCHAR 、DATE TIME 、TIMESTAMP 、BINARY 、VARBINARY 、LONGVARBINARY NULL 、OTHER 、BLOB 、CLOB 、BOOLEAN CURSOR 、UNDEFINED 、NVARCHAR 、NCHAR 、NCLOB STRUCT 、JAVA_OBJECT 、DISTINCT 、REF 、DATALINK ROWID 、LONGNVARCHAR 、SQLXML 、DATETIMEOFFSET |
示例:
@JJdbcType(JdbcType.VARCHAR)private String userId;// => #{userId, jdbcType=VARCHAR}
@JTypeHandler
注解描述:用于指定Java
实体属性对应的TypeHandler
,一般用于特殊类型的转换,比如枚举
的处理。
属性:
属性名 | 必填 | 说明 |
---|---|---|
value | 是 | 类型处理器的实现类 |
示例:
@JTypeHandler(EnumOrdinalTypeHandler.class)private TrueFalse isDeleted;// => #{userId, typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler}
@JUseJavaType
注解描述:用于告知通用Mapper
,在处理该Java
实体属性的时候是否添加javaType
配置
示例:
@JUseJavaTypeprivate String userId; // => #{userId, javaType=java.lang.String}
@JUseNotEmpty
注解描述:用于当字符串类型的Java
实体属性作为条件时是否增加!=''
的判断。
示例:
@JUseNotEmptyprivate String userId; // <if test="userId != null and userId != ''">...</if>
@JOrder
注解描述:用于标注Java
实体属性为排序属性,在通用Mapper
进行默认的查询操作时会将其作为排序条件拼接在最终的SQL
语句中。
属性:
属性名 | 必填 | 说明 |
---|---|---|
value | 否 | 枚举类型JOrderStrategy ,指定排序的策略,默认值为 ASC ,可选值如下:ASC :升序DESC :降序 |
priority | 否 | 排序的优先级,默认值为1 ,值越小,将会优先处理排在排序 SQL 的前面。 |
示例:
@JOrderprivate String userId; // => user_id asc
@JOverwriteGlobal
注解描述:用于覆盖全局的配置,比如在JDBFly
中可以指定排除某些Java
实体属性在查询的时候不查询,但是在部分Java
实体中存在特例,可以通过在对应实体上添加该注解以覆盖全局的配置。
属性:
属性名 | 必填 | 说明 |
---|---|---|
value | 是 | 指定需要覆盖的配置对应的注解类 |
示例:
@JOverwriteGlobal(JExcludeUpdate.class)private String userId;
Mapper
JDBFly
对常用的CRUD
操作做了通用Mapper
的封装,开发者只需要将自己的Mapper
继承JDBFly
内置的通用Mapper
即可拥有相应的操作方法。比如有一个用户信息实体UserInfo
,需要对该实体进行增删改查的操作,开发者只需要定义一个Mapper
继承JDBFly
通用Mapper
即可。
public interface UserInfoMapper extends JBaseMapper<UserInfo> {}
JBaseMapper
提供了常用操作的很多方法,有些时候并不需要这么多的操作,针对这种场景,开发者只需要按需选择继承相应的Mapper
,同时JDBFly
允许开发者自己编写Mapper
方法与内置通用Mapper
方法在一个Mapper
中混合使用,默认情况下,开发者自己的方法优先级高于默认方法。
Mapper
按照具体的操作分类,内置通用Mapper
分类如下:
插入类
Mapper | 说明 |
---|---|
JInsertMapper | 保存一个实体,null 的属性也会保存,不会使用数据库默认值 |
JInsertSelectiveMapper | 保存一个实体,null 的属性不会保存,会使用数据库默认值 |
删除类
Mapper | 说明 |
---|---|
JDeleteByConditionMapper | 根据Condition 条件删除数据 |
JDeleteByIdMapper | 根据主键字段进行删除,方法参数必须包含完整的主键属性 |
JDeleteMapper | 根据实体属性作为条件进行删除,查询条件使用等号 |
修改类
Mapper | 说明 |
---|---|
JUpdateByConditionMapper | 根据Condition 条件修改 |
JUpdateByIdMapper | 根据主键更新实体全部字段,null 值会被更新 |
JUpdateSelectiveByConditionMapper | 根据Condition 条件修改,仅会修改!=null 的数据 |
JUpdateSelectiveByIdMapper | 根据主键更新属性不为null 的值 |
查询类
Mapper | 说明 |
---|---|
JSelectByConditionMapper | 根据Condition 条件进行查询 |
JSelectOneMapper | 根据实体中的属性进行查询,只能有一个返回值, 有多个结果是抛出异常,查询条件使用等号 |
JSelectOneByConditionMapper | 根据Condition 条件进行查询,只能有一个返回值,有多个结果是抛出异常 |
JSelectMapper | 根据实体中的属性值进行查询,查询条件使用等号 |
JSelectCountMapper | 根据实体中的属性查询总数,查询条件使用等号 |
JSelectCountAllMapper | 查询总数 |
JSelectCountByConditionMapper | 根据Condition 条件进行查询总数 |
JSelectByIdMapper | 根据主键字段进行查询, 方法参数必须包含完整的主键属性,查询条件使用等号 |
JSelectAllMapper | 查询全部结果 |
JExistsMapper | 根据实体中的属性判断数据是否存在,查询条件使用等号 |
JExistsByIdMapper | 根据主键字段判断数据是否存在, 方法参数必须包含完整的主键属性,查询条件使用等号 |
JExistsByConditionMapper | 根据Condition 条件判断数据是否存在 |
上面介绍的Mapper
为最小的操作单位,JDBFly
按照对应的操作分类提供了汇总的基础Mapper
:JBaseInsertMapper
、JBaseDeleteMapper
、JBaseUpdateMapper
、JBaseSelectMapper
,分别对应了插入
、删除
、修改
、查询
的操作。在大部分情况下,开发者仅需要继承基础的JBaseMapper
,该Mapper
包含了所有通用的内置方法。
Mapper
扩展内置Mapper
无法保证通用性,开发者按需选择。
Mapper | 说明 |
---|---|
JInsertListMapper | 批量保存实体,null 的属性也会保存,不会使用数据库默认值 |
JDeleteByIdsMapper | 根据主键集合删除 |
JSelectByIdsMapper | 根据主键集合查询 |
JSelectOneOptionalByConditionMapper | 根据Condition 条件进行查询,只能有一个返回值,有多个结果是抛出异常,需要依赖 mybatis3.5+ |
JSelectOneOptionalMapper | 根据实体中的属性进行查询,只能有一个返回值, 有多个结果是抛出异常,查询条件使用等号, 需要依赖 mybatis3.5+ |
JSelectOptionalByIdMapper | 根据主键字段进行查询, 方法参数必须包含完整的主键属性,查询条件使用等号, 需要依赖 mybatis3.5+ |
JSelectPageAllMapper | 查询全部结果,支持分页 |
JSelectPageByConditionMapper | 根据Condition 条件进行查询,支持分页 |
JSelectPageMapper | 根据实体中的属性值进行查询,查询条件使用等号,支持分页 |
JBasePageMapper | 基础Mapper ,包含分页 |
使用内置的通用Mapper
,可以简化开发,但是有些时候也会有点麻烦,比如通过固定属性作为条件、查询部分属性等,为了进一步简化对数据库的操作,JDBFly
支持像JPA
那样通过方法名称定义相关的操作。如果需要开启方法名称解析,只需要让对应的Mapper
继承JMethodMapper
即可,当然JBaseMapper
已经默认开启了方法名称解析。
public interface UserInfoMapper extends JMethodMapper<UserInfo> { findUserIdAndUserNameByid(Integer id);}
使用方法名称解析功能,Mapper方法需要按照指定的命名规范才能被正常识别与解析,目前方法名称解析仅支持查询和删除,对应的方法名命名规则如下:
查询:[(select|find|read|get|query)[Distinct][Exclude][selectProperties]By][whereProperties][OrderBy(orderProperties)]
删除:(delete|remove)By[whereProperties]
各部分说明:
DISTINCT
And
分隔where
条件需要使用的属性,分段条件之间通过Or
或And
拼接,Or
优先级大于And
,分段条件格式为:peoperty[Keyword]
,属性首字母大写,需要注意的是对应方法形参数量必须与拆分后的条件参数数量一致Order by
部分需要使用的属性,属性首字母大写,多个排序条件之间使用Asc
或Desc
分隔,如果该部分表达式不存在则是使用默认的排序配置作为条件可用关键词:
关键词 | 示例 | SQL代码段 |
---|---|---|
IsNotNull 、NotNull | findByIdIsNotNull 、findByIdNotNull | id is not null |
IsNull 、Null | findByIdIsNull 、findByIdNull | id is null |
IsNot 、Not 、NotEquals 、Ne | findByIdIsNot 、findByIdNot 、findByIdNotEquals findByIdNe | id <> ?1 |
Is 、Equals 、Eq | findByIdIs 、findByIdEquals findByIdEq | id = ?1 |
IsGreaterThan 、GreaterThan 、Gt | findByIdIsGreaterThan 、findByIdGreaterThan 、findByIdGt | id > ?1 |
IsGreaterThanEqual 、GreaterThanEqual 、Ge | findByIdIsGreaterThanEqual 、findByIdGreaterThanEqual 、findByIdGe | id >= ?1 |
IsLessThan 、LessThan 、Lt | findByIdIsLessThan 、findByIdLessThan 、findByIdLt | id < ?1 |
IsLessThanEqual 、LessThanEqual 、Le | findByIdIsLessThanEqual 、findByIdLessThanEqual 、findByIdLe | id <= ?1 |
IsBefore 、Before | findByIdIsBefore 、findByIdBefore | id < ?1 |
IsBeforeEqual 、BeforeEqual | findByIdIsBeforeEqual 、findByIdBeforeEqual | id <= ?1 |
IsAfter 、After | findByIdIsAfter 、findByIdAfter | id > ?1 |
IsAfterEqual 、AfterEqual | findByIdIsAfterEqual 、findByIdAfterEqual | id >= ?1 |
IsNotIn 、NotIn | findByIdIsNotIn 、findByIdNotIn | id not in (?1) |
IsIn 、In | findByIdIsIn 、findByIdIn | id in (?1) |
IsBetween 、Between | findByIdIsBetween 、findByIdBetween | id between ?1 and ?2 |
IsNotBetween 、NotBetween | findByIdIsNotBetween 、findByIdNotBetween | id not between ?1 and ?2 |
IsLike 、Like | findByIdIsLike 、findByIdLike | id like ?1 |
IsNotLike 、NotLike | findByIdIsNotLike 、findByIdNotLike | id not like ?1 |
在使用方法名称解析的时候,在某些情况下可能会导致方法名称冗长,可以在方法上面搭配注解来缩短方法名称。存在注解优先级大于方法名称解析结果且不同部分之间互不影响。
public interface UserInfoMapper extends JMethodMapper<UserInfo> { @JProperty(exclude = { "id" }) @JOrderBy(value = { @JOrderProperty(value = "userId", strategy = JOrderStrategy.DESC) }) List<UserInfo> findAll();}
@JProperty
注解描述:用于配置选择或排除的列对应的属性,等价于查询的[(select|find|read|get|query)[Distinct][Exclude][selectProperties]By]
部分。
属性:
属性名 | 必填 | 说明 |
---|---|---|
value | 否 | 用于指定选择的列对应的属性, 优先级高于 exclude ,如果与exclude 都为空则查询全部属性。 |
exclude | 否 | 用于指定排除选择的列对应的属性 |
示例:
@JProperty({"id", "userName"})public User findByUserId(String userId);
@JWhere
注解描述:用于配置条件部分的属性以及条件,等价于查询或删除的[whereProperties]
部分。
属性:
属性名 | 必填 | 说明 |
---|---|---|
value | 是 | 一组动态条件,属性值为@JCriteria 注解 |
示例:
@JWhere(@JCriteria({ @JCriterion("id"), @JCriterion("usrName") }))User selectIdAndUserNameBy(Integer id, String userName);
@JCriteria
注解描述:用于配置一个动态条件的分组内容。
属性:
属性名 | 必填 | 说明 |
---|---|---|
value | 是 | 动态条件,属性值为@JCriterion 注解 |
isOr | 否 | 是否为OR 条件 |
示例:
@JWhere(@JCriteria({ @JCriterion("id"), @JCriterion("usrName") }))User selectIdAndUserNameBy(Integer id, String userName);
@JCriterion
注解描述:用于配置一个动态条件。
属性:
属性名 | 必填 | 说明 |
---|---|---|
value | 是 | 属性名称 |
isOr | 否 | 是否为OR 条件 |
请发表评论