• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

JDBFly: JDBFly是一个基于JAVA的持久层开发框架,包含两部分内容:Mybatis增强、数据 ...

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

JDBFly

开源软件地址:

https://gitee.com/jianggujin/JDBFly

开源软件介绍:

第一部分 简介

JDBFly是一个基于JAVA的持久层开发框架,包含两部分内容:Mybatis增强、数据库版本跟踪。在简化常规开发的同时屏蔽数据库的差异,通过JDBFly使开发者更加关注业务本身,如雄鹰般在天空自由翱翔,从繁琐重复的持久层编码中解放出来。

1.1 特性

  • 侵入小:对Mybatis只做增强,对原有原生代码不会产生影响,仅需调整少量JDBFly配置代码
  • 损耗小:启动即会自动注入内置Mapper,提供基本 CRUD,无额外性能损耗
  • 强大的CRUD操作:内置通用Mapper,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求
  • 支持多种条件查询: 通过字符串或Lambda表达式,方便的编写各类查询条件,开发者可自由使用
  • 多种主键策略:支持6种主键策略(JDBC自增主键方言SQL自定义SQL动态自定义SQLJAVA代码主键标识),可自由配置
  • 支持JPA方法名称解析:支持JPA形式通过方法名称定义Mapper方法
  • 支持自定义Mapper扩展:提供自定义Mapper入口,快速实现常用方法,并可根据实际业务需要自由组合内置Mapper
  • 动态表名:提供自定义动态表名方法,完美解决多租户分表需求
  • 乐观锁:内置乐观锁实现,提供并发处理的快速实现
  • 自定义XML标签扩展:开发者可自由扩展原生Mybatis标签,定制符合自身业务的标签,内置了常用多数据库适配的函数标签
  • 多数据库适配:支持MySQLMariaDBOracle达梦 等多种数据库,针对特殊数据库提供方言接口可有开发者扩展
  • 多种集成方式:支持原生Java项目、SpringSpringBoot项目集成
  • 数据库版本跟踪:对Flyway进行扩展,自动适配数据库脚本,对数据库版本自动维护升级

1.2 支持数据库

标准功能部分支持所有标准数据库,全功能已经测试通过数据库有:MySqlMariaDB H2OraclePostgreSQL达梦

1.3 实现原理

1.3.1 Mybatis增强

JDBFly提供了一些通用的方法,这些通用方法是以接口的形式提供的。接口和方法都使用了泛型,使用该通用方法的接口需要指定泛型的类型。通过Java反射可以得到接口泛型的类型信息,即对应实体类的信息。在实体类上通过特殊的注解完成实体类与数据库关系的映射。

得到了Mapper方法、实体类映射关系之后,通过生成符合Mybatis规范的XML,最终再交由Mybatis解析处理。默认情况下JDBFly不对Mybatis生成的MappedStatement进行修改,但是这个规则并不是强制的,开发者可以自定义构建器进行特殊的处理。JDBFly修改了MapperAnnotationBuilder默认行为,在Mybatis解析完Mapper接口以及关联的XML文件后,进行后置处理,增加自定义增强Mapper的扩展处理。

为了实现对Mybatis默认标签的扩展,JDBFly重写了EntityResolver,将静态DTD文件转换为Java实体,在运行时动态生成DTD规则,允许开发者扩展自己的节点解析器的时候修改DTD实体相关内容。

1.3.2 数据库版本跟踪

JDBFlyflyway进行了二次封装,扩展了针对不同数据库匹配相应脚本的方法。

1.4 安装

使用JDbFly可以直接下载源代码编译或者下载已经编译的jar文件,如果您是使用maven来构建项目,也可以直接在pom.xml中添加JDBFly的坐标:

Maven central

<!-- http://mvnrepository.com/artifact/com.jianggujin/JDBFly --><dependency>    <groupId>com.jianggujin</groupId>    <artifactId>JDBFly</artifactId>    <version>最新版本</version></dependency>

最新的版本可以从Maven仓库或者码云获取。

如果使用快照SNAPSHOT版本需要添加仓库,且版本号为快照版本 点击查看最新快照版本号

<repository>    <id>snapshots</id>    <url>https://oss.sonatype.org/content/repositories/snapshots/</url></repository>

注意:引入 JDBFly 之后请不要再次引入 MyBatisMyBatis-Springmybatis-boot-starter,以避免因版本差异导致的问题。

第二部分 Mybatis增强

2.1 快速开始

2.1.1 JAVA集成

2.1.1.1 从XML中构建 SqlSessionFactory

每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为核心的,JDBFly也同样如此。与直接使用Mybatis的区别在于SqlSessionFactory的实例的构建方式,JDBFly需要将SqlSessionFactoryBuilder替换为JSqlSessionFactoryBuilder

String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new JSqlSessionFactoryBuilder().build(inputStream);

XML配置文件中包含了对MyBatis系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager),示例如下:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>  <environments default="development">    <environment id="development">      <transactionManager type="JDBC"/>      <dataSource type="POOLED">        <property name="driver" value="${driver}"/>        <property name="url" value="${url}"/>        <property name="username" value="${username}"/>        <property name="password" value="${password}"/>      </dataSource>    </environment>  </environments>  <mappers>    <package name="com.jianggujin.dbfly.test.mapper" />  </mappers></configuration>

2.1.1.2不使用XML构建SqlSessionFactory

除了使用XML创建配置之外,JDBFly也可以像Mybatis一样直接从Java代码创建。

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();TransactionFactory transactionFactory = new JdbcTransactionFactory();Environment environment = new Environment("development", transactionFactory, dataSource);Configuration configuration = new JConfiguration(environment);configuration.addMappers("com.jianggujin.dbfly.mapper");SqlSessionFactory sqlSessionFactory = new JSqlSessionFactoryBuilder().build(configuration);

这里需要注意的是与XML创建配置不同的地方,除了需要将SqlSessionFactoryBuilder替换为JSqlSessionFactoryBuilder之外,还需要将Configuration替换为JConfiguration,实际上通过XML方式最终获得的配置类也是JConfiguration

JSqlSessionFactoryBuilderSqlSessionFactoryBuilder的子类,JConfigurationConfiguration的子类,在JDBFly环境下获得的Configuration都应该是JConfiguration

2.1.2 Spring集成

2.1.2.1 通过XML配置

<bean id="sqlSessionFactory" class="com.jianggujin.dbfly.spring.JSqlSessionFactoryBean">    <property name="dataSource" ref="dataSource"/></bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">    <property name="basePackage" value="com.jianggujin.dbfly.test.mapper"/>    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/></bean>

上面是默认的配置,在配置sqlSessionFactory时需要将SqlSessionFactoryBean替换为JSqlSessionFactoryBean,其他配置与直接使用Mybatis一样,有些时候需要一些特殊的配置,可能会需要自定义Configuration,这时候,一定要使用JConfiguration替换MybatisConfiguration

<bean id="configuration" class="com.jianggujin.dbfly.mybatis.JConfiguration"/><bean id="sqlSessionFactory" class="com.jianggujin.dbfly.spring.JSqlSessionFactoryBean">    <property name="dataSource" ref="dataSource"/>    <property name="configuration" ref="configuration"/></bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">    <property name="basePackage" value="com.jianggujin.dbfly.test.mapper"/>    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/></bean>

2.1.2.2 通过@JMapperScan注解配置

Mybatis官方提供的注解为MapperScan,在使用注解进行配置的时候,开发者需要使用JDBFly提供的JMapperScan替换官方注解。二者注解属性相同。

@Configuration@JMapperScan("com.jianggujin.dbfly.test.mapper")public class AppConfig {    @Bean    public DataSource dataSource() {        return new EmbeddedDatabaseBuilder().addScript("schema.sql").build();    }    @Bean    public DataSourceTransactionManager transactionManager() {        return new DataSourceTransactionManager(dataSource());    }    @Bean    public SqlSessionFactory sqlSessionFactory() throws Exception {        SqlSessionFactoryBean sessionFactory = new JSqlSessionFactoryBean();        sessionFactory.setDataSource(dataSource());        return sessionFactory.getObject();    }}

2.1.3 SpringBoot集成

2.1.3.1 自动装配

JDBFly支持SpringBoot自动装配,为了降低集成与迁移成本,JDBFly的自动装配参数与直接使用mybatis-boot-starter保持一致,只是在其基础上增加了JDBFly特有的配置,如果不需要特殊处理,则配置与mybatis-boot-starter相同。需要注意的是,如果没有结合@JMapperScan注解直接使用自动装配,自动装配会从SpringBoot基础包开始扫描,需要在Mapper接口上增加@Mapper注解,否则MyBatis无法判断扫描哪些接口。

例如在properties配置中:

mybatis.configuration.default-enum-type-handler=org.apache.ibatis.type.EnumOrdinalTypeHandlermybatis.type-aliases-package=com.jianggujin.dbfly.test.entitymybatis.dbfly.style=camelhump

mybatis.dbfly开头的是JDBFly特有的配置

2.1.2.2 通过@JMapperScan注解配置

SpringBoot环境中同样可以使用@JMapperScan注解,可以与自动装配配合使用,在不使用该注解的情况下,Mybatis从基础包开始扫描,通过@JMapperScan注解可以限定扫描范围,提升扫描装配效率,也是比较推荐的用法。

2.2 对象关系映射

集成完JDBFly之后,需要做的事情就是将项目中的实体类与数据库中的表进行映射。在JDBFly中提供了实体与表映射的注解,此章节仅介绍常规的通用注解,对于有特殊功能的注解,比如主键策略、动态表名相关注解将在对应章节介绍。

比如在数据库中有人员信息表:

CREATE TABLE user_info (    id INt AUTO_INCREMENT COMMENT '主键',    user_no VARCHAR(8) NOT NULL COMMENT '人员编号',    user_name VARCHAR(8) NOT NULL COMMENT '人员姓名',    PRIMARY KEY (id))

则该表对应的Java实体如下:

Public class UserInfo {    @JUseGeneratedKeys    private Integer id;    private String userNo;    private String userName;    // 省略gettre和setter}

@JNameStyle注解

描述:用于配置Java实体与数据库表、Java实体属性与数据库列之间名称的转换关系。

属性:

属性名必填说明
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
可选值如下:
ARRAYBITTINYINTSMALLINTINTEGER
BIGINTFLOATREALDOUBLENUMERIC
DECIMALCHARVARCHARLONGVARCHARDATE
TIMETIMESTAMPBINARYVARBINARYLONGVARBINARY
NULLOTHERBLOBCLOBBOOLEAN
CURSORUNDEFINEDNVARCHARNCHARNCLOB
STRUCTJAVA_OBJECTDISTINCTREFDATALINK
ROWIDLONGNVARCHARSQLXMLDATETIMEOFFSET

示例:

@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;

2.3 内置Mapper

JDBFly对常用的CRUD操作做了通用Mapper的封装,开发者只需要将自己的Mapper继承JDBFly内置的通用Mapper即可拥有相应的操作方法。比如有一个用户信息实体UserInfo,需要对该实体进行增删改查的操作,开发者只需要定义一个Mapper继承JDBFly通用Mapper即可。

public interface UserInfoMapper extends JBaseMapper<UserInfo> {}

JBaseMapper提供了常用操作的很多方法,有些时候并不需要这么多的操作,针对这种场景,开发者只需要按需选择继承相应的Mapper,同时JDBFly允许开发者自己编写Mapper方法与内置通用Mapper方法在一个Mapper中混合使用,默认情况下,开发者自己的方法优先级高于默认方法。

2.3.1 通用内置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按照对应的操作分类提供了汇总的基础MapperJBaseInsertMapperJBaseDeleteMapperJBaseUpdateMapperJBaseSelectMapper,分别对应了插入删除修改查询的操作。在大部分情况下,开发者仅需要继承基础的JBaseMapper,该Mapper包含了所有通用的内置方法。

2.3.2 扩展内置Mapper

扩展内置Mapper无法保证通用性,开发者按需选择。

Mapper说明
JInsertListMapper批量保存实体,null的属性也会保存,
不会使用数据库默认值
JDeleteByIdsMapper根据主键集合删除
JSelectByIdsMapper根据主键集合查询
JSelectOneOptionalByConditionMapper根据Condition条件进行查询,只能有一个返回值,
有多个结果是抛出异常,需要依赖mybatis3.5+
JSelectOneOptionalMapper根据实体中的属性进行查询,只能有一个返回值,
有多个结果是抛出异常,查询条件使用等号,
需要依赖mybatis3.5+
JSelectOptionalByIdMapper根据主键字段进行查询,
方法参数必须包含完整的主键属性,查询条件使用等号,
需要依赖mybatis3.5+
JSelectPageAllMapper查询全部结果,支持分页
JSelectPageByConditionMapper根据Condition条件进行查询,支持分页
JSelectPageMapper根据实体中的属性值进行查询,查询条件使用等号,支持分页
JBasePageMapper基础Mapper,包含分页

2.4 方法名称解析

使用内置的通用Mapper,可以简化开发,但是有些时候也会有点麻烦,比如通过固定属性作为条件、查询部分属性等,为了进一步简化对数据库的操作,JDBFly支持像JPA那样通过方法名称定义相关的操作。如果需要开启方法名称解析,只需要让对应的Mapper继承JMethodMapper即可,当然JBaseMapper已经默认开启了方法名称解析。

public interface UserInfoMapper extends JMethodMapper<UserInfo> {    findUserIdAndUserNameByid(Integer id);}

2.4.1 命名规则

使用方法名称解析功能,Mapper方法需要按照指定的命名规范才能被正常识别与解析,目前方法名称解析仅支持查询和删除,对应的方法名命名规则如下:

查询[(select|find|read|get|query)[Distinct][Exclude][selectProperties]By][whereProperties][OrderBy(orderProperties)]

删除(delete|remove)By[whereProperties]

各部分说明:

  • ():表示必选项
  • []:表示可选项
  • Distinct:存在该关键词将为查询语句添加DISTINCT
  • Exclude:存在该关键词表示后面的查询属性为需要排除的
  • selectProperties:该表达式表示需要查询的属性,不存在该部分则默认查询全部属性,属性首字母大写且属性与属性之间需要使用And分隔
  • whereProperties:该表达式表示where条件需要使用的属性,分段条件之间通过OrAnd拼接,Or优先级大于And,分段条件格式为:peoperty[Keyword],属性首字母大写,需要注意的是对应方法形参数量必须与拆分后的条件参数数量一致
  • orderProperties:该表达式表示Order by部分需要使用的属性,属性首字母大写,多个排序条件之间使用AscDesc分隔,如果该部分表达式不存在则是使用默认的排序配置

作为条件可用关键词:

关键词示例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

2.4.2 使用注解解析

在使用方法名称解析的时候,在某些情况下可能会导致方法名称冗长,可以在方法上面搭配注解来缩短方法名称。存在注解优先级大于方法名称解析结果且不同部分之间互不影响。

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条件

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap