Class MyBatisDataAccessStrategy

java.lang.Object
org.springframework.data.jdbc.mybatis.MyBatisDataAccessStrategy
All Implemented Interfaces:
DataAccessStrategy, RelationResolver

public class MyBatisDataAccessStrategy extends Object implements DataAccessStrategy
DataAccessStrategy implementation based on MyBatis. Each method gets mapped to a statement. The name of the statement gets constructed as follows: By default, the namespace is based on the class of the entity plus the suffix "Mapper". This is then followed by the method name separated by a dot. For methods taking a PropertyPath as argument, the relevant entity is that of the root of the path, and the path itself gets as dot separated String appended to the statement name. Each statement gets an instance of MyBatisContext, which at least has the entityType set. For methods taking a PropertyPath the entityType if the context is set to the class of the leaf type.
Author:
Jens Schauder, Kazuki Shimizu, Oliver Gierke, Mark Paluch, Tyler Van Gorder, Milan Milanov, Myeonghyeon Lee, Chirag Tailor, Christopher Klein
  • Constructor Details

  • Method Details

    • createCombinedAccessStrategy

      public static DataAccessStrategy createCombinedAccessStrategy(RelationalMappingContext context, JdbcConverter converter, org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations operations, org.apache.ibatis.session.SqlSession sqlSession, Dialect dialect)
      Create a DataAccessStrategy that first checks for queries defined by MyBatis and if it doesn't find one uses a DefaultDataAccessStrategy
    • createCombinedAccessStrategy

      public static DataAccessStrategy createCombinedAccessStrategy(RelationalMappingContext context, JdbcConverter converter, org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations operations, org.apache.ibatis.session.SqlSession sqlSession, NamespaceStrategy namespaceStrategy, Dialect dialect)
      Create a DataAccessStrategy that first checks for queries defined by MyBatis and if it doesn't find one uses a DefaultDataAccessStrategy
    • setNamespaceStrategy

      public void setNamespaceStrategy(NamespaceStrategy namespaceStrategy)
      Set a NamespaceStrategy to be used.
      Parameters:
      namespaceStrategy - Must be non null
    • insert

      public <T> Object insert(T instance, Class<T> domainType, Identifier identifier, IdValueSource idValueSource)
      Description copied from interface: DataAccessStrategy
      Inserts the data of a single entity. Referenced entities don't get handled.
      Specified by:
      insert in interface DataAccessStrategy
      Type Parameters:
      T - the type of the instance.
      Parameters:
      instance - the instance to be stored. Must not be null.
      domainType - the type of the instance. Must not be null.
      identifier - information about data that needs to be considered for the insert but which is not part of the entity. Namely, references back to a parent entity and key/index columns for entities that are stored in a Map or List.
      idValueSource - the IdValueSource for the insert.
      Returns:
      the id generated by the database if any.
    • insert

      public <T> Object[] insert(List<InsertSubject<T>> insertSubjects, Class<T> domainType, IdValueSource idValueSource)
      Description copied from interface: DataAccessStrategy
      Inserts the data of multiple entities.
      Specified by:
      insert in interface DataAccessStrategy
      Type Parameters:
      T - the type of the instance.
      Parameters:
      insertSubjects - the subjects to be inserted, where each subject contains the instance and its identifier. Must not be null.
      domainType - the type of the instance. Must not be null.
      idValueSource - the IdValueSource for the insert.
      Returns:
      the ids corresponding to each record that was inserted, if ids were generated. If ids were not generated, elements will be null.
    • update

      public <S> boolean update(S instance, Class<S> domainType)
      Description copied from interface: DataAccessStrategy
      Updates the data of a single entity in the database. Referenced entities don't get handled.
      Specified by:
      update in interface DataAccessStrategy
      Type Parameters:
      S - the type of the instance to save.
      Parameters:
      instance - the instance to save. Must not be null.
      domainType - the type of the instance to save. Must not be null.
      Returns:
      whether the update actually updated a row.
    • updateWithVersion

      public <S> boolean updateWithVersion(S instance, Class<S> domainType, Number previousVersion)
      Description copied from interface: DataAccessStrategy
      Updates the data of a single entity in the database and enforce optimistic record locking using the previousVersion property. Referenced entities don't get handled.

      The statement will be of the form : UPDATE … SET … WHERE ID = :id and VERSION_COLUMN = :previousVersion and throw an optimistic record locking exception if no rows have been updated.

      Specified by:
      updateWithVersion in interface DataAccessStrategy
      Type Parameters:
      S - the type of the instance to save.
      Parameters:
      instance - the instance to save. Must not be null.
      domainType - the type of the instance to save. Must not be null.
      previousVersion - The previous version assigned to the instance being saved.
      Returns:
      whether the update actually updated a row.
    • delete

      public void delete(Object id, Class<?> domainType)
      Description copied from interface: DataAccessStrategy
      Deletes a single row identified by the id, from the table identified by the domainType. Does not handle cascading deletes.

      The statement will be of the form : DELETE FROM … WHERE ID = :id and VERSION_COLUMN = :version and throw an optimistic record locking exception if no rows have been updated.

      Specified by:
      delete in interface DataAccessStrategy
      Parameters:
      id - the id of the row to be deleted. Must not be null.
      domainType - the type of entity to be deleted. Implicitly determines the table to operate on. Must not be null.
    • delete

      public void delete(Iterable<Object> ids, Class<?> domainType)
      Description copied from interface: DataAccessStrategy
      Deletes multiple rows identified by the ids, from the table identified by the domainType. Does not handle cascading deletes.

      The statement will be of the form : DELETE FROM … WHERE ID IN (:ids) and throw an optimistic record locking exception if no rows have been updated.

      Specified by:
      delete in interface DataAccessStrategy
      Parameters:
      ids - the ids of the rows to be deleted. Must not be null.
      domainType - the type of entity to be deleted. Implicitly determines the table to operate on. Must not be null.
    • deleteWithVersion

      public <T> void deleteWithVersion(Object id, Class<T> domainType, Number previousVersion)
      Description copied from interface: DataAccessStrategy
      Deletes a single entity from the database and enforce optimistic record locking using the version property. Does not handle cascading deletes.
      Specified by:
      deleteWithVersion in interface DataAccessStrategy
      Parameters:
      id - the id of the row to be deleted. Must not be null.
      domainType - the type of entity to be deleted. Implicitly determines the table to operate on. Must not be null.
      previousVersion - The previous version assigned to the instance being saved.
    • delete

      public void delete(Object rootId, org.springframework.data.mapping.PersistentPropertyPath<RelationalPersistentProperty> propertyPath)
      Description copied from interface: DataAccessStrategy
      Deletes all entities reachable via propertyPath from the instance identified by rootId.
      Specified by:
      delete in interface DataAccessStrategy
      Parameters:
      rootId - Id of the root object on which the propertyPath is based. Must not be null.
      propertyPath - Leading from the root object to the entities to be deleted. Must not be null.
    • delete

      public void delete(Iterable<Object> rootIds, org.springframework.data.mapping.PersistentPropertyPath<RelationalPersistentProperty> propertyPath)
      Description copied from interface: DataAccessStrategy
      Deletes all entities reachable via propertyPath from the instances identified by rootIds.
      Specified by:
      delete in interface DataAccessStrategy
      Parameters:
      rootIds - Ids of the root objects on which the propertyPath is based. Must not be null or empty.
      propertyPath - Leading from the root object to the entities to be deleted. Must not be null.
    • deleteAll

      public <T> void deleteAll(Class<T> domainType)
      Description copied from interface: DataAccessStrategy
      Deletes all entities of the given domain type.
      Specified by:
      deleteAll in interface DataAccessStrategy
      Type Parameters:
      T - type of the domain type.
      Parameters:
      domainType - the domain type for which to delete all entries. Must not be null.
    • deleteAll

      public void deleteAll(org.springframework.data.mapping.PersistentPropertyPath<RelationalPersistentProperty> propertyPath)
      Description copied from interface: DataAccessStrategy
      Deletes all entities reachable via propertyPath from any instance.
      Specified by:
      deleteAll in interface DataAccessStrategy
      Parameters:
      propertyPath - Leading from the root object to the entities to be deleted. Must not be null.
    • acquireLockById

      public <T> void acquireLockById(Object id, LockMode lockMode, Class<T> domainType)
      Description copied from interface: DataAccessStrategy
      Acquire a lock on the aggregate specified by id.
      Specified by:
      acquireLockById in interface DataAccessStrategy
      Parameters:
      id - the id of the entity to load. Must not be null.
      lockMode - the lock mode for select. Must not be null.
      domainType - the domain type of the entity. Must not be null.
    • acquireLockAll

      public <T> void acquireLockAll(LockMode lockMode, Class<T> domainType)
      Description copied from interface: DataAccessStrategy
      Acquire a lock on all aggregates of the given domain type.
      Specified by:
      acquireLockAll in interface DataAccessStrategy
      Parameters:
      lockMode - the lock mode for select. Must not be null.
      domainType - the domain type of the entity. Must not be null.
    • findById

      public <T> T findById(Object id, Class<T> domainType)
      Description copied from interface: DataAccessStrategy
      Loads a single entity identified by type and id.
      Specified by:
      findById in interface DataAccessStrategy
      Type Parameters:
      T - the type of the entity.
      Parameters:
      id - the id of the entity to load. Must not be null.
      domainType - the domain type of the entity. Must not be null.
      Returns:
      Might return null.
    • findAll

      public <T> Iterable<T> findAll(Class<T> domainType)
      Description copied from interface: DataAccessStrategy
      Loads all entities of the given type.
      Specified by:
      findAll in interface DataAccessStrategy
      Type Parameters:
      T - the type of entities to load.
      Parameters:
      domainType - the type of entities to load. Must not be null.
      Returns:
      Guaranteed to be not null.
    • findAllById

      public <T> Iterable<T> findAllById(Iterable<?> ids, Class<T> domainType)
      Description copied from interface: DataAccessStrategy
      Loads all entities that match one of the ids passed as an argument. It is not guaranteed that the number of ids passed in matches the number of entities returned.
      Specified by:
      findAllById in interface DataAccessStrategy
      Type Parameters:
      T - type of entities to load.
      Parameters:
      ids - the Ids of the entities to load. Must not be null.
      domainType - the type of entities to load. Must not be null.
      Returns:
      the loaded entities. Guaranteed to be not null.
    • findAllByPath

      public Iterable<Object> findAllByPath(Identifier identifier, org.springframework.data.mapping.PersistentPropertyPath<? extends RelationalPersistentProperty> path)
      Description copied from interface: RelationResolver
      Finds all entities reachable via path.
      Specified by:
      findAllByPath in interface DataAccessStrategy
      Specified by:
      findAllByPath in interface RelationResolver
      Parameters:
      identifier - the combination of Id, map keys and list indexes that identify the parent of the entity to be loaded. Must not be null.
      path - the path from the aggregate root to the entities to be resolved. Must not be null.
      Returns:
      guaranteed to be not null.
    • existsById

      public <T> boolean existsById(Object id, Class<T> domainType)
      Description copied from interface: DataAccessStrategy
      returns if a row with the given id exists for the given type.
      Specified by:
      existsById in interface DataAccessStrategy
      Type Parameters:
      T - the type of the entity.
      Parameters:
      id - the id of the entity for which to check. Must not be null.
      domainType - the type of the entity to check for. Must not be null.
      Returns:
      true if a matching row exists, otherwise false.
    • findAll

      public <T> Iterable<T> findAll(Class<T> domainType, org.springframework.data.domain.Sort sort)
      Description copied from interface: DataAccessStrategy
      Loads all entities of the given type, sorted.
      Specified by:
      findAll in interface DataAccessStrategy
      Type Parameters:
      T - the type of entities to load.
      Parameters:
      domainType - the type of entities to load. Must not be null.
      sort - the sorting information. Must not be null.
      Returns:
      Guaranteed to be not null.
    • findAll

      public <T> Iterable<T> findAll(Class<T> domainType, org.springframework.data.domain.Pageable pageable)
      Description copied from interface: DataAccessStrategy
      Loads all entities of the given type, paged and sorted.
      Specified by:
      findAll in interface DataAccessStrategy
      Type Parameters:
      T - the type of entities to load.
      Parameters:
      domainType - the type of entities to load. Must not be null.
      pageable - the pagination information. Must not be null.
      Returns:
      Guaranteed to be not null.
    • findOne

      public <T> Optional<T> findOne(Query query, Class<T> probeType)
      Description copied from interface: DataAccessStrategy
      Execute a SELECT query and convert the resulting item to an entity ensuring exactly one result.
      Specified by:
      findOne in interface DataAccessStrategy
      Parameters:
      query - must not be null.
      probeType - the type of entities. Must not be null.
      Returns:
      exactly one result or Optional.empty() if no match found.
    • findAll

      public <T> Iterable<T> findAll(Query query, Class<T> probeType)
      Description copied from interface: DataAccessStrategy
      Execute a SELECT query and convert the resulting items to a Iterable.
      Specified by:
      findAll in interface DataAccessStrategy
      Parameters:
      query - must not be null.
      probeType - the type of entities. Must not be null.
      Returns:
      a non-null list with all the matching results.
    • findAll

      public <T> Iterable<T> findAll(Query query, Class<T> probeType, org.springframework.data.domain.Pageable pageable)
      Description copied from interface: DataAccessStrategy
      Execute a SELECT query and convert the resulting items to a Iterable. Applies the Pageable to the result.
      Specified by:
      findAll in interface DataAccessStrategy
      Parameters:
      query - must not be null.
      probeType - the type of entities. Must not be null.
      pageable - the pagination that should be applied. Must not be null.
      Returns:
      a non-null list with all the matching results.
    • exists

      public <T> boolean exists(Query query, Class<T> probeType)
      Description copied from interface: DataAccessStrategy
      Determine whether there is an aggregate of type domainType that matches the provided Query.
      Specified by:
      exists in interface DataAccessStrategy
      Parameters:
      query - must not be null.
      probeType - the type of entities. Must not be null.
      Returns:
      true if the object exists.
    • count

      public <T> long count(Query query, Class<T> probeType)
      Description copied from interface: DataAccessStrategy
      Counts the rows in the table representing the given probe type, that match the given query.
      Specified by:
      count in interface DataAccessStrategy
      Parameters:
      query - the query which elements have to match.
      probeType - the probe type for which to count the elements. Must not be null.
      Returns:
      the count. Guaranteed to be not null.
    • count

      public long count(Class<?> domainType)
      Description copied from interface: DataAccessStrategy
      Counts the rows in the table representing the given domain type.
      Specified by:
      count in interface DataAccessStrategy
      Parameters:
      domainType - the domain type for which to count the elements. Must not be null.
      Returns:
      the count. Guaranteed to be not null.