MyBatis SQL mapper framework for Java

Related tags

ORM java sql mybatis
Overview

MyBatis SQL Mapper Framework for Java

build Coverage Status Maven central Sonatype Nexus (Snapshots) License Stack Overflow Project Stats

mybatis

The MyBatis SQL mapper framework makes it easier to use a relational database with object-oriented applications. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations. Simplicity is the biggest advantage of the MyBatis data mapper over object relational mapping tools.

Essentials

Comments
  • 3.2.x release: NestedResultSetHandler.handleRowValues discarding row.

    3.2.x release: NestedResultSetHandler.handleRowValues discarding row.

    I ran into a bug in which I expected a result set of about 3600 rows and get 1. The row I get back is the last row of the result set I see in Oracle SQL Developer. I've traced the issue to handleRowValues() in NestedResultSetHandler. Based on tracing thru that code in the debugger the row value gets set by the line:

    rowValue = getRowValue(rs, discriminatedResultMap, rowKey, rowKey, null, resultColumnCache, partialObject);
    

    but then nothing actually happens with the value. It would appear that the if statement right after should be within the bracket directly above it (existing source below):

    while (shouldProcessMoreRows(rs, resultContext, rowBounds)) {
      final ResultMap discriminatedResultMap = resolveDiscriminatedResultMap(rs, resultMap, null);
      final CacheKey rowKey = createRowKey(discriminatedResultMap, rs, null, resultColumnCache);
      Object partialObject = objectCache.get(rowKey);
      if (partialObject == null && rowValue != null) { // issue #542 delay calling ResultHandler until object ends
        if (mappedStatement.isResultOrdered()) objectCache.clear(); // issue #577 clear memory if ordered
        callResultHandler(resultHandler, resultContext, rowValue);
      } 
      rowValue = getRowValue(rs, discriminatedResultMap, rowKey, rowKey, null, resultColumnCache, partialObject);
    }
    if (rowValue != null) callResultHandler(resultHandler, resultContext, rowValue);
    

    In the 3.1.1 release the rowValue is bieng put into another collection:

    while (shouldProcessMoreRows(rs, resultContext, rowBounds)) {
      final ResultMap discriminatedResultMap = resolveDiscriminatedResultMap(rs, resultMap, null);
      final CacheKey rowKey = createRowKey(discriminatedResultMap, rs, null, resultColumnCache);
      final boolean knownValue = objectCache.containsKey(rowKey);
      Object rowValue = getRowValue(rs, discriminatedResultMap, rowKey, resultColumnCache);
      if (!knownValue) {
        resultContext.nextResultObject(rowValue);
        resultHandler.handleResult(resultContext);
      }
    }
    

    EDIT: maybe not quite that simple as I didn't look at the source enough before posting. Based on more debugging the callResultHandler inside the if statement (thats inside the while loop) is never getting called. That would explain why i am only seeing the last row of the resultset in the returned collection. its being put in there by the second if.

    bug 
    opened by ghost 42
  • Support for Java's  Optional<T>

    Support for Java's Optional

    Hi,

    Are there any plans to support support for Java's 8 Optional<T>. I guess however due to the type erasure you would always have to specify the wrapped javaType.

    If not plans, did anybody developed either a plugin or type handler?

    Thanks.,

    Raphael

    enhancement 
    opened by rparree 38
  • Getting

    Getting "NoSuchPropertyException" Randomly

    Hi,

    We are using mybatis-3.3.0. Recently we got one strange error from mybatis code while executing a query that gets executed successfully many times during the day, but failed several times.

    Below is the stacktrace:

    org.apache.ibatis.ognl.NoSuchPropertyException: OrderXEO.cinemaAddress
        at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:46) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:41) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:280) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:80) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:73) ~[mybatis-3.3.0.jar:3.3.0]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_45]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_45]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_45]
        at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_45]
        at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:358) ~[mybatis-spring-1.2.2.jar:1.2.2]
        ... 36 more
    Caused by: org.apache.ibatis.ognl.NoSuchPropertyException: OrderXEO.cinemaAddress
        at org.apache.ibatis.ognl.ObjectPropertyAccessor.getProperty(ObjectPropertyAccessor.java:151) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.ognl.OgnlRuntime.getProperty(OgnlRuntime.java:2434) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.ognl.ASTProperty.getValueBody(ASTProperty.java:114) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.ognl.ASTChain.getValueBody(ASTChain.java:141) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:50) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.ognl.ASTAnd.getValueBody(ASTAnd.java:61) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:494) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:458) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:44) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:41) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:280) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:80) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113) ~[mybatis-3.3.0.jar:3.3.0]
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:73) ~[mybatis-3.3.0.jar:3.3.0]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_45]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_45]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_45]
        at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_45]
        at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:358) ~[mybatis-spring-1.2.2.jar:1.2.2]
    

    Any help to find root cause of above error will be greatly appreciated. Ps. We have met a similar problem(https://github.com/mybatis/mybatis-3/issues/199) when using mybatis-3.1.0, which has fixed in mybatis-3.3.0. Is this the same cause?

    MyBatis version

    3.3.1

    Database vendor and version

    Test case or example project

    Steps to reproduce

    Expected result

    Actual result

    opened by infear-on-the-way 37
  • Support insert multiple rows and write-back id.More about insert multipl...

    Support insert multiple rows and write-back id.More about insert multipl...

    Support insert multiple rows and write-back id.

    Multirow inserts

    A SQL feature (since SQL-92) is the use of row value constructors to insert multiple rows at a time in a single SQL statement:

    INSERT INTO tablename (column-a, [column-b, ...])
    VALUES ('value-1a', ['value-1b', ...]),
           ('value-2a', ['value-2b', ...]),
           ...
    

    This feature is supported by DB2, SQL Server (since version 10.0 - i.e. 2008), PostgreSQL (since version 8.2), MySQL, sqlite (since version 3.7.11) and H2.

    More about insert see here:

    http://en.wikipedia.org/wiki/Insert_(SQL)

    More details of this pull request see here: https://github.com/mybatis/mybatis-3/pull/324

    duplicate 
    opened by abel533 33
  • org.apache.ibatis.ognl.NoSuchPropertyException,  java.lang.String with mybatis 5.0

    org.apache.ibatis.ognl.NoSuchPropertyException, java.lang.String with mybatis 5.0

    MyBatis version

    3.5.0

    Database vendor and version

    Oracle

    Test case or example project

    Using the following spring 5.1.8 mybatis: 3.5.0 mybatis-spring - 2.0.1 ,

    Context: a. We were using the mybatis 1.1.1 having no issues using criteriawithListvalue with earlier version of spring 3xx

    b. We upgraded to spring 5.xx as part of app remediation.

    c. we started getting the spring jdk version with respective mybatis 1.1.1 as it was pointing to spring core 3.xx and now we have 5.xx

    d. So upgraded mybatis-spring 2.0.1 and mybatis 3.5.0 , with jdk 8

    Then we started getting the ibatis builder exception with list.key as

    org.apache.ibatis.ognl.NoSuchPropertyException java.string.String.key.

    Please suggest the above stated issue fixed in mybatis 3.5.1 without any other consequences during runtime. ?

    Steps to reproduce

    Expected result

    Actual result

    bug on dependency library 
    opened by phanikardev 31
  • Reusing @Results annotation

    Reusing @Results annotation

    It is currently not possible to reuse a resultmap created using the @ConstructorArgs and/or @Results annotation.

    If would be nice if you could name and reference @Results, e.g.:

    @Select("select * from users")
    @Results(id = "User", value = {
      @Result(property = "id", column = "id", id = "true"),
      @Result(property = "firstName", column = "first_name")
      @Result(property = "lastName", column = "last_name")
    })
    List<User> getUsers();
    
    @Select("select * from users where id = #{value}")
    @ResultMap("User")
    User getUserById(int id);
    
    @Select("select * from users where first_name = #{value}")
    @ResultMap("User")
    List<User> getUsersByFirstName(String firstName);
    

    Note: Please also consider implementing issue #81

    enhancement 
    opened by Condor70 30
  • When insert a list or array,resolve the useGeneratedKeys error.

    When insert a list or array,resolve the useGeneratedKeys error.

    When insert a list or array,resolve the useGeneratedKeys error.

    The Sample:

    Mapper.xml File:

    <insert id="insertAll" keyProperty="id" useGeneratedKeys="true">
      insert into country(countryname,countrycode)
      VALUES
      <foreach collection="list" item="country" separator=",">
        (#{country.countryname},#{country.countrycode})
      </foreach>
    </insert>
    

    The Java code File:

    List<Country> countryList = new ArrayList<Country>();
    Country country = new Country();
    country.setCountryname("Name1");
    country.setCountrycode("N1");
    countryList.add(country);
    
    country = new Country();
    country.setCountryname("Name2");
    country.setCountrycode("N2");
    countryList.add(country);
    
    country = new Country();
    country.setCountryname("Name3");
    country.setCountrycode("N3");
    countryList.add(country);
    
    country = new Country();
    country.setCountryname("Name4");
    country.setCountrycode("N4");
    countryList.add(country);
    //ERROR:
    //Caused by: org.apache.ibatis.binding.BindingException: 
    //Parameter 'id' not found. Available parameters are [list]
    int result = sqlSession.insert("insertAll",countryList);
    
    for (Country country1 : countryList) {
        System.out.println(country1.getId());
    }
    

    Solution

    Add a method to handle the parameters:

    private Collection<Object> getParameters(Object parameter)
    

    Add a first Key keys,and then developer can use keys to specify the reveive param.

    If not specif,find listorarray.If not existed,use the parameter only.

    Note:use Collectionsupport more than List,like Set.

    duplicate 
    opened by abel533 28
  • Bug: Constructor instantiation does not map data types correctly

    Bug: Constructor instantiation does not map data types correctly

    MyBatis version

    3.4.5

    Database vendor and version

    H2

    Test case or example project

    See attached

    Steps to reproduce

    Run BadChannelDaoTest Note the failure message contains "org.apache.ibatis.executor.ExecutorException: No constructor found ..."

    Run GoodChannelDaoTest Note that the test passes.

    Expected result

    Both tests should pass.

    Actual result

    The BadChannelDaoTest fails. This is because the constructor selector code in Mybatis does not check whether the type mappings can be applied; it simply compares the DB column types with the constructor parameter types for an exact match, which it cannot find.

    waiting for feedback 
    opened by rickb777 27
  • Add new option for specify the behavior when detects an unknown column of automatic mapping target

    Add new option for specify the behavior when detects an unknown column of automatic mapping target

    I added a new option for specify the behavior when detects an unknown column (or unknown property type) of automatic mapping target.

    Options are as follow:

    • NONE : Do nothing (Default) -> Same with current implementation
    • WARNING : Output warning log with detail
    • FAILING : Fail mapping (throw SqlSessionException with detail)

    I think this option is useful for detects a type mistake during development.

    What do you think ?

    enhancement 
    opened by kazuki43zoo 27
  • Per DB file parsing support

    Per DB file parsing support

    #1158

    This PR is the implementation of the approach outlined in 1158. I am working on the tests but before I get too much further and spend more time I want to make sure I can get this merged in. The vast majority of changes are just about back-porting tests. All new code is in org.apache.ibatis.jdbc

    1. It is backward compatible. Original functionality is maintained
    2. This allows for subsequent implementations for MySqlScriptRunner and OracleScriptRunner etc.
    3. The current parsing code doesn't handle ; within COMMENT 'this is a ; semicolon'; And allows for individual implementation
    4. Resolves multiple ScriptRunners that may support the same DB type by assigning priority. This, for example, allows OriginalScriptRunner to always respond yes to any DB connection but taking a backseat to any others that claim to do the job better
    opened by chb0github 26
  • A row with null column values is mapped to null instead of an object with null fields

    A row with null column values is mapped to null instead of an object with null fields

    I have a query that returns a single row, but the single row contains only nulls in each of its columns. When MyBatis executes this query, it returns null, rather than provide me with the appropriate object with its fields initialised to null.

    I have debugged this and I can see that the MyBatis FastResultSetHandler throws the result away, even when callSettersOnNulls is set to true. The applyPropertyMappings method checks the value of the callSettersOnNulls, but if the field being mapped is null, the object is not returned, but simply thrown away.

    I am using MyBatis 3.2.2. I have provided some simplified snippets of my Java code and MyBatis configuration below.

    <select id="getSomething" parameterType="int" resultMap="getSomethingMap">
        SELECT top 1
               property_a,
               property_b
        FROM   SOME_USER..SOMETHING_TABLE
        WHERE  entity_id = #{entityId}
    </select>
    
    <resultMap id="getSomethingMap" type="Something">
        <result property="propertyA" column="property_a" javaType="java.lang.String" jdbcType="VARCHAR"/>
        <result property="propertyB" column="property_b" javaType="java.lang.String" jdbcType="VARCHAR"/>
    </resultMap>    
    
    // Snippet of "Something" Java class
    public class Something {
    
        private String propertyA;
        private String propertyB;
    
        public void setPropertyA(String propertyA) {
            this.propertyA = propertyA;
        }
    
        public String getPropertyA() {
            return propertyA;
        }
    
        public void setPropertyB(String propertyB) {
            this.propertyB = propertyB;
        }
    
        public String getPropertyB() {
            return propertyB;
        }
    }
    
    opened by YoungCurmudgeon 26
  • Resolve resultType by namespace and id when not provide resultType and resultMap

    Resolve resultType by namespace and id when not provide resultType and resultMap

    In our work time it's is possible to write a error resultType in mapper.xml. I think we can resolve resultType by namespce and id in mapper.xml, then we can avoid this error

    opened by FlyInWind1 0
  • Update dependency org.hsqldb:hsqldb to v2.7.1 [SECURITY]

    Update dependency org.hsqldb:hsqldb to v2.7.1 [SECURITY]

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | org.hsqldb:hsqldb (source) | 2.6.1 -> 2.7.1 | age | adoption | passing | confidence |

    GitHub Vulnerability Alerts

    CVE-2022-41853

    Those using java.sql.Statement or java.sql.PreparedStatement in hsqldb (HyperSQL DataBase) to process untrusted input may be vulnerable to a remote code execution attack. By default it is allowed to call any static method of any Java class in the classpath resulting in code execution. The issue can be prevented by updating to 2.7.1 or by setting the system property "hsqldb.method_class_names" to classes which are allowed to be called. For example, System.setProperty("hsqldb.method_class_names", "abc") or Java argument -Dhsqldb.method_class_names="abc" can be used. From version 2.7.1 all classes by default are not accessible except those in java.lang.Math and need to be manually enabled.


    Configuration

    📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    opened by renovate[bot] 0
  • Add ListTypeHandler

    Add ListTypeHandler

    I know this is really a big change, and may bring up some backward compatible problem, so suggest is welcome

    Add future

    1. Add ResolvedType, only wrap Jackson JavaType. For not depend on jackson, copy classes relate to JavaType into org.apache.ibatis.reflection.type.jackson package. Now use JavaType from external Jackson first. #2187
    2. Add ResolvedMethod, to get returnType and parameterType easier
    3. Implement ListTypeHandler SetTypeHandler. #1445
    4. Register ListTypeHandler, SetTypeHandler and ArrayTypeHandler into TypeHandlerRegistry, then we don't need to write typeHandler="ArrayTypeHandler" in xml
    5. resultType and resultMap in xml is not obligatory, get Mapper Class by namespace and get Method by id, then we can get returnType

    Other changes

    1. Add ParamNameResolver#getNamedParamsType, this may return a MapDescriptorResolvedType when ParamNameResolver#getNamedParams return a ParamMap, MapDescriptorResolvedType contains each value ResolvedType
    2. List or array index access check, see PropertyTokenizer#isIndexAccess, without this change ArrayTypeHandler will use for #{array[0]}
    3. LanguageDriver interface add two createSqlSource methods that use ResolvedType instead of Class, all createSqlSource methods are default for backward compatible
    4. TypeReference do not resolve TypeParameter at construct time, getRawType is useless for now
    5. Make some method and field protected. I tried to make my futures compatible with mybatisPlus, but fond they copy lost of code to their project. make method protected, so that mybatisPlus do not need copy

    May be not backward compatible

    1. TypeHandlerRegistry#typeHandlerMap use ResolvedType as map key, this may have problem for user custom typeHandler. For example user write a typeHandler for ArrayList<Object> but hope autoMapping for ArrayList<String>, this may no problem before, but now autoMapping will can't find typeHandler, because of typeParameter not match
    2. TypeHandlerRegistry#getMappingTypeHandler will check whether the TypeHandler need a Class for construct. I hope user can just write typeHandler without write javaType, because javaType attribute can't resolve ParameterizedType. #995
    3. Try to resolve TypeHandler at SqlSourceBuilder, not use UnknownTypeHandler, because in UnknownTypeHandler can only get parameter Class, not ParameterizedType
    4. DynamicSqlSource add ParamType, for pass ParameterizedType, I add a parameterType parameter to constructor, this may occur exception if user pass instance that not instanceof parameterType
    5. User can pass Map<String,String> into function with Map<Map,Integer> parameter by cast, just like (Map) stringValueMap. Mybatis use UnknownTypeHandler for Map parameter at before, there is no problem if user pass wrong type. but now we can know we just need use IntegerTypeHandler to handle Map values, use IntegerTypeHandler to handle String will occur exception
    opened by FlyInWind1 1
  • Handle `<bind>` correctly inside `<foreach>`

    Handle `` correctly inside ``

    An attempt at fixing #2754 Related to #206 and #575

    When processing DynamicSqlSource, evaluate param values in scripting phase and store them in ParameterMapping. This does not affect RawSqlSource.

    Just to be clear, it still is not possible to invoke a method inside a parameter reference like #{_parameter.mymethod(_parameter.value)}. It might be possible to accept OGNL expression in a param reference (e.g. #{${_parameter.mymethod(_parameter.value)}}), but I'm not sure if that's a good idea.

    This should not break backward compatibility for normal usages, however, plugins that manipulate internal stuff might be affected.

    @emacarron @mnesarco If this does not seem like the right approach to you, please let me know!

    opened by harawata 11
  • <bind> should behave like a local variable inside <foreach>

    should behave like a local variable inside

    I found the following problem and report it. If I have time, I will fix it and create a pull request.

    MyBatis version

    3.5.11

    Database vendor and version

    SQLite3 (probably for any vendor)

    Test case or example project

    https://github.com/tsasaki609/mybatis-3-sscce-foreach-with-bind

    Steps to reproduce

    check out the example project and run

    Expected result

    09:44:57.720 [main] DEBUG mybatis.sscce.foreach.with.bind.FooMapper.countBar - ==> Preparing: SELECT count(*) FROM bar WHERE id IN ( ? , ? ) 09:44:57.755 [main] DEBUG mybatis.sscce.foreach.with.bind.FooMapper.countBar - ==> Parameters: test001(String), test002(String) 09:44:57.787 [main] DEBUG mybatis.sscce.foreach.with.bind.FooMapper.countBar - <== Total: 1 2

    Actual result

    09:44:57.720 [main] DEBUG mybatis.sscce.foreach.with.bind.FooMapper.countBar - ==> Preparing: SELECT count(*) FROM bar WHERE id IN ( ? , ? ) 09:44:57.755 [main] DEBUG mybatis.sscce.foreach.with.bind.FooMapper.countBar - ==> Parameters: test002(String), test002(String) 09:44:57.787 [main] DEBUG mybatis.sscce.foreach.with.bind.FooMapper.countBar - <== Total: 1 1

    opened by tsasaki609 5
Releases(mybatis-3.5.11)
  • mybatis-3.5.11(Sep 18, 2022)

  • mybatis-3.5.10(May 23, 2022)

    Bug fixes:

    • Unexpected illegal reflective access warning (or InaccessibleObjectException on Java 16+) when calling method in OGNL expression. #2392
    • IllegalAccessException when auto-mapping Records (JEP-359) #2195
    • 'interrupted' status is not set when PooledConnection#getConnection() is interrupted. #2503

    Enhancements:

    • A new option argNameBasedConstructorAutoMapping is added. If enabled, constructor argument names are used to look up columns when auto-mapping. #2192
    • Added a new property skipSetAutoCommitOnClose to JdbcTransactionFactory. Skipping setAutoCommit() call could improve performance with some drivers. #2426
    • <idArg /> can now be listed after <arg /> in <constructor />. #2541

    There is no known backward incompatible change since 3.5.9.

    Please see the 3.5.10 milestone page for the complete list of changes.

    Source code(tar.gz)
    Source code(zip)
    mybatis-3.5.10.zip(3.68 MB)
  • mybatis-3.5.9(Dec 25, 2021)

    List of changes:

    • Add nullable to <foreach />. If enabled, it skips the iteration when the collection is null instead of throwing an exception. To enable this feature globally, set nullableOnForEach=true in the config. #1883

    We also updated the version of Log4J dependency to 2.17.0. Note that the scope of Log4J dependency in MyBatis' pom.xml is 'optional' and it is very important for you to understand what it means.

    • You can use MyBatis without Log4J.
    • Adding MyBatis to your project's dependency does not bring in Log4J implicitly.
    • Updating MyBatis version does not make your project safer because it does not affect the Log4J version in your project.
    • Regardless of the MyBatis version you are using, you can/have to update Log4J version independently.

    Please see the 3.5.9 milestone page for the complete list of changes. There is no known backward incompatible change since 3.5.8.

    Source code(tar.gz)
    Source code(zip)
    mybatis-3.5.9.zip(3.94 MB)
  • mybatis-3.5.8(Dec 12, 2021)

    List of changes:

    • Avoid NullPointerException when mapping an empty string to java.lang.Character. #2368
    • Fixed an incorrect argument when initializing static object. This resolves a compatibility issue with quarkus-mybatis. #2284
    • Performance improvements. #2297 #2335 #2340
    • And many doc updates!

    Please see the 3.5.8 milestone page for the complete list of changes. There is no known backward incompatible change since 3.5.7.

    Source code(tar.gz)
    Source code(zip)
    mybatis-3.5.8.zip(5.47 MB)
  • mybatis-3.5.7(Apr 26, 2021)

  • mybatis-3.5.6(Oct 6, 2020)

    Enhancements:

    • A new configuration option defaultSqlProviderType is added. The specified class will be used as the SQL provider when the value() or type() is not specified in @SelectProvider, @UpdateProvider, @InsertProvider and @DeleteProvider. #1951
    • A new transaction isolation level SQL_SERVER_SNAPSHOT is added to TransactionIsolationLevel enum to support the MS SQL Server specific isolation level SNAPSHOT. #1973
    • When there is no JEP-290 serialization filter defined, a WARN level message is logged on deserializing object streams. #2079

    Bug fixes:

    • Possible NoSuchPropertyException under heavy load. #1648
    • Possible InvalidPathException when registering type aliases by specifying package name. #1974
    • Possible OutOfMemoryError when using BlockingCache. #2044

    There is no known backward incompatible change since 3.5.5.

    Please see the 3.5.6 milestone page for the complete list of changes.

    Source code(tar.gz)
    Source code(zip)
    mybatis-3.5.6.zip(5.26 MB)
  • mybatis-3.5.5(Jun 4, 2020)

    Enhancements:

    • You can reference single List or Collection type parameter using its actual parameter name when useActualParamName is enabled. #1237
    • You can specify resultMap in @One and @Many. #1771
    • You can specify columnPrefix in @One and @Many. #1829
    • A new option shrinkWhitespacesInSql to remove extra whitespaces in SQL. #1901

    Bug fixes:

    • Possible IllegalArgumentException when using @CacheNamespaceRef . #1719
    • Mapper method invocation should be non-blocking (work around JDK-8161372). #1929

    There is no known backward incompatible change since 3.5.4.

    Please see the 3.5.5 milestone page for the complete list of changes.

    Source code(tar.gz)
    Source code(zip)
    mybatis-3.5.5.zip(5.26 MB)
  • mybatis-3.5.4(Feb 3, 2020)

    Enhancements:

    • You can now omit unnecessary @Results and @ConstructorArgs annotation. #1698

    Bug fixes:

    • Avoid invoking hashCode() method when setting auto-generated keys. #1719
    • Possible ResultMapException when using nested select. #1551
    • Possible incorrect TypeVariable resolution in TypeParameterResolver. #1794
    • Race condition in TypeHandlerRegistry. #1819

    There is no known backward incompatible change since 3.5.3.

    Please see the 3.5.4 milestone page for the complete list of changes.

    Source code(tar.gz)
    Source code(zip)
    mybatis-3.5.4.zip(5.23 MB)
  • mybatis-3.5.3(Oct 20, 2019)

    Enhancements:

    • Support variable substitution in CDATA of included <sql />. #1615
    • Support default method invocation on JDK 14+8 or later. #1626
    • Avoid illegal reflective access warning when invoking default mapper method. #1636
    • Ambiguous getter/setter now throws ReflectionException only when it is actually accessed. #1201

    Bug fixes:

    • Possible infinite loop when a SQL provider throws an exception. #1616
    • Unable to iterate Cursor if the next element is null. #1653
    • queryCursor() fails in streaming mode of MySQL Connector/J. #1654

    There is no known backward incompatible change since 3.5.2.

    Please see the 3.5.3 milestone page for the complete list of changes.

    Source code(tar.gz)
    Source code(zip)
    mybatis-3.5.3.zip(7.08 MB)
  • mybatis-3.5.2(Jul 15, 2019)

    Enhancements:

    • SQL builder now supports LIMIT, OFFSET #1521 and FETCH FIRST #1582.
    • SQL builder now supports multi-row insert syntax #1333.
    • A new property defaultNetworkTimeout has been added to the built-in data sources i.e. PooledDataSource and UnpooledDataSource #1527.
    • SQL provider annotations now takes value attribute which is an alias for type #1522.
    • You can now pass Java array to ArrayTypeHandler#setNonNullParameter() #1548.
    • You can reference single simple type unnamed parameter with any name in OGNL expressions #1487.
    • A new configuration option defaultResultSetType is added #1056.

    Bugs:

    • SQL provider method with a primitive parameter causes BuilderException #1604.
    • Fixes a possible NullPointerException #1590.

    There is no known backward incompatible change since 3.5.1.

    Please see the 3.5.2 milestone page for the complete list of changes.

    Source code(tar.gz)
    Source code(zip)
    mybatis-3.5.2.zip(7.08 MB)
  • mybatis-3.5.1(Apr 7, 2019)

    Bug fixes:

    • keyProperty specified with parameter name could cause ExecutorException. #1485
    • False positive error 'Ambiguous collection type ...' . #1472
    • EnumTypeHandler is not used when the enum has methods. #1489
    • Auto-mapping fails in a result map referenced from a constructor arg with columnPrefix. #1496
    • Constructor auto-mapping could fail when columnPrefix is specified in the parent result map. #1495
    • LocalTimeTypeHandler loses fractional seconds part. #1478
    • LocalDateTypeHandler and LocalDateTimeTypeHandler could return unexpected value. #1478

    Enhancements:

    • You can now return 'script' from a SQL provider. The returned script is parsed using the language driver specified by @Lang. #1391
    • You can now omit method attribute from SQL provider annotations when the provider method has the same name as the mapper method or its name is provideSql. #1279
    • You can now get databaseId in SQL providers. #1503
    • The default type handler for LONGVARCHAR is changed from ClobTypeHandler to StringTypeHandler. This improves compatibility with SAP ASE. #1484

    There is a backward incompatible change.

    • Because of the fix for #1478 , LocalDateTypeHandler, LocalTimeTypeHandler and LocalDateTimeTypeHandler now require a JDBC driver that supports JDBC 4.2 API. Also, these type handlers no longer work with Druid. See #1516
    Source code(tar.gz)
    Source code(zip)
    mybatis-3.5.1.zip(7.07 MB)
  • mybatis-3.5.0(Jan 20, 2019)

    MyBatis 3.5.0 requires Java 8 and later.

    Enhancements:

    • Avoid 'Illegal reflective access' warning on JDK 9+. #1156
    • Added Automatic-Module-Name : org.mybatis #1199
    • Support java.util.Optional as return type of mapper method. #799
    • Avoid unnecessary wasNull() calls from the built-in type handlers. #1244
    • It is now possible to specify columnPrefix in constructor arguments. #968
    • Improved reliability when searching constructor for auto-mapping. #1277
    • It is now possible to access private, package private and protected members in OGNL expressions. #1258
    • Throw exception if the specified keyProperty is not found when assigning generated keys.  #1250
    • Added a type handler for SQLXML data type. #1221
    • Allow accessing private, package private and protected members in OGNL expression. #1258
    • <set /> tag now trims the leading comma. #21
    • Infer <case /> tag's resultType from the enclosing resultMap. #486
    • Allow specifying columnPrefix in constructor mapping. #968
    • Combination of @CacheNamespace and <cache-ref /> does not throw exception anymore. #1194
    • Support Log4J 2.6+. #1210
    • Slightly improved compatibility with drivers that only support JDBC 3 API. #1386
    • Upgraded testing framework to JUnit 5. #1425

    Bug fixes:

    • OffsetDateTimeTypeHandler, OffsetTimeTypeHandler and ZonedDateTimeTypeHandler loses time zone information. #1081
    • Avoid SQLException when using Cursor with Db2. #1345
    • Avoid exception when using Cursor with ReuseExecutor. #1351
    • RowBounds with out-of-range offset causes SQLException on DB2. #1355
    • Specified logging implementation is not used in some classes. #1272
    • Unable to resolve javaType for <association />. #1381
    • Deeply nested (3+ levels) result map could cause IllegalArgumentException. #1176
    • Generic type parameter is not correctly resolved when the class hierarchy is deeper than 3 levels. #1260

    Please see the 3.5.0 milestone page for the complete list of changes.

    Note that there are some backward incompatible changes since the last release 3.4.6.

    • Specifying keyProperty is now mandatory when using useGeneratedKeys. If you relied on the implicit default value (="id"), generated keys will be silently ignored. #1198
    • Using Cursor now requires a driver that supports JDBC 4.1 API. #1351
    • If you extended org.apache.ibatis.type.BaseTypeHandler, you might need to add wasNull() check in your type handler. #1144
    • The default resultSetType value has been changed from FORWARD_ONLY to UNSET. This is applied only to annotation based mappers (for XML based mappers, the default is/was UNSET). #1334
    • If you extended org.apache.ibatis.transaction.jdbc.JdbcTransaction for some reason, the property autoCommmit has been renamed to autoCommit. #941
    Source code(tar.gz)
    Source code(zip)
    mybatis-3.5.0.zip(7.04 MB)
  • mybatis-3.4.6(Mar 11, 2018)

    Enhancements:

    • Apply custom ResultHandler to CURSOR type OUT parameter. #493
    • Substitute variables in attribute values of included SQL fragments. #1069
    • BatchExecutor now closes each statement immediately after execution. #1110
    • It is now possible to use a static method as SQL provider. #1131
    • SQL provider method can now return CharSequence instead of String. #1134
    • Add resource path to the exception message when parsing XML mapper failed. #1172

    Bug fixes:

    • Registering type handler against HashMap causes ClassCastException. #1089
    • Unable to register TypeHandler once TypeHandlerRegistry.hasTypeHandler is called. #1177
    • Serializing and deserializing cached objects causes NullPointerException. #1084
    • Invalid error message 'Two methods with same method signature but not providing classes assignable?' in System.err. #929

    There should be no backward incompatible change since 3.4.5. Follow this link to see the full list of changes.

    Source code(tar.gz)
    Source code(zip)
    mybatis-3.4.6.zip(5.94 MB)
  • mybatis-3.4.5(Aug 20, 2017)

    Enhancements:

    • Make default enum type handler customizable. #971
    • Make mapper method and its interface type accessible to SqlProvider. #1055
    • Allow using configuration properties in SqlProvider. #1061
    • Merge type handlers for JSR-310 (Java Date and Time API) into the core. #974

    Bug fixes:

    • The type handler registered for a common interface of enums was not applied correctly. #976
    • Lazy loading should not overwrite a property value set by user. #988
    • Prevent foreach xml tag from polluting the global context. #966
    • Some parameter names (e.g. 'size') can cause ClassCastException. #1031
    • Not all result sets are processed when UPDATE or INSERT is performed in between. #1036
    • With PostgreSQL, ExecutorException is thrown if useGeneratedKeys is enabled globally. #902

    There should be no backward incompatible change since 3.4.4. Follow this link to see the full list of changes.

    Source code(tar.gz)
    Source code(zip)
    mybatis-3.4.5.zip(5.93 MB)
  • mybatis-3.4.4(Apr 8, 2017)

  • mybatis-3.4.3(Apr 7, 2017)

    Enhancements:

    • Allow registering a type handler for a common interface of enums. #947
    • Share Jdbc3KeyGenerator and NoKeyGenerator instances #882
    • Building UPDATE JOIN statement by SQL Builder #903

    Bug fixes:

    • Failed to find a statement mapped to a super interface #481
    • Default methods support on mappers, does not work for non-public mappers. #905
    • foreignColumns with multiple columns validation error #526
    • Fix wrong registration logic for LanguageDriver #914
    • A boolean property should be able to have two getters: isX() and getX() #906
    • Possible unexpected auto-mapping #895
    • Excessive memory allocation for primitive arrays in nested resultmaps #927

    There should be no backward incompatible change [1]. Follow this link to see the full list of changes.

    [1] It is possible that an incorrect result mapping previously worked because of the bug fixed in #895 stops working. Please see #1100 for the details.

    Source code(tar.gz)
    Source code(zip)
    mybatis-3.4.3.zip(5.91 MB)
  • mybatis-3.4.2(Jan 3, 2017)

    Here is a list of major enhancements in MyBatis 3.4.2.

    • New option 'returnInstanceForEmptyRow' to control the behavior when a query returns a row with all columuns being null. #800
    • Support 'default methods' on mapper interfaces. #709
    • When no type handler is registered to a class, a type handler registered to its superclass can be used. #859
    • New attributes properties is added to @CacheNamespace. #841
    • New attributes name is added to @CacheNamespaceRef. #842
    • Support the mechanism for initializing a cache after set all properties. #816
    • Allow users to set default value in placeholders. #852
    • Auto-detecting type handlers newly added in version 1.0.2 of TypeHandlers-JSR310. #727 #878

    Although it may be rare, the following changes could affect existing solutions.

    • The default value of aggressiveLazyLoading is changed to false. #825
    • Raise a exception when keyProperty is not found. #782

    Follow this link to see the full list of changes.

    Source code(tar.gz)
    Source code(zip)
    mybatis-3.4.2.zip(5.90 MB)
  • mybatis-3.4.1(Jun 26, 2016)

    This release includes four user visible enhancements

    • Allow referencing parameters by their declared names when compiled with Java 8 -parameters option. #549
    • Added auto-detection of Year/MonthTypeHandler added in mybatis-typehandlers-jsr310 1.0.1. #646
    • @Select can now return an array of objects. #669
    • Allow specifying custom reflectorFactory in XML config. #657

    and six bug fixes.

    • Circularly referenced resultMap was filled with ancestor object even when columnPrefix was specified. #215
    • Select statement with @Param couldn't be used as a nested select statement of association. #649
    • RuntimeException was thrown at the startup on IBM WebSphere Application Server 8.5.5.9. #706
    • Couldn't use Cursor as the return type of @Select statements. #661
    • Couldn't use RowBounds as a parameter of select statement whose return type is Cursor. #667
    • NullPointerException was thrown when used with Kylin JDBC driver. #699

    Here is the complete list of changes.

    Source code(tar.gz)
    Source code(zip)
    mybatis-3.4.1.zip(5.88 MB)
  • mybatis-3.4.0(Apr 19, 2016)

    MyBatis 3.4.0 with the following main features:

    • New Cursor List method in SqlSession.
    • Inherit Spring timeout in transactions.
    • Better support for generic types.
    • Out-of-the-box support new Date and Time API (JSR-310) classes added in Java 8.

    Note that there are changes that may break existing code.

    • New method getTimeout() in the Transaction interface. If you implemented your own transaction adapter you will need to implement this method at least with a "return null"
    • @Options( flushCache ) now takes enum values (DEFAULT/TRUE/FALSE) instead of boolean.
    • StatementHandler#prepare(Connection) has been changed to StatementHandler#prepare(Connection,Integer) given that now it gets the transaction timeout.
    • SqlSession#selectCursor, Executor#queryCursor, ResultSetHandler#handleCursorResultSets and StatementHandler#queryCursor added. You will need to implement methods if you implemented those interfaces already.

    See the details at https://github.com/mybatis/mybatis-3/issues?q=milestone%3A3.4.0+is%3Aclosed

    Source code(tar.gz)
    Source code(zip)
  • mybatis-3.3.1(Feb 13, 2016)

  • mybatis-3.3.0(May 23, 2015)

    Includes two main changes:

    • Ognl has been upgraded to 3.0.11 that is the latest version
    • The default proxy tool is now Javassist and is included inside the mybatis jar

    There are some other minor changes and bug fixes. See the details at https://github.com/mybatis/mybatis-3/issues?q=milestone%3A3.3.0

    Note that you can still use CGLIB as the proxy factory tool by adding CGLIB to your classpath and setting the MyBatis global parameter as follows:

    <settings>
        <setting name="proxyFactory" value="CGLIB"/>
    </settings>
    
    Source code(tar.gz)
    Source code(zip)
    mybatis-3.3.0.zip(3.04 MB)
  • mybatis-3.2.8(Oct 11, 2014)

  • mybatis-3.2.7(Apr 6, 2014)

  • mybatis-3.2.6(Mar 24, 2014)

    See the details at https://github.com/mybatis/mybatis-3/issues?milestone=6&page=1&state=closed

    Provides some new features:

    • Caches nested selects
    • Lazy loading can be enabled only for specific relations
    • Supports returning multiple fields in a select key
    • Some other minor improvements

    A note for users who implemented their own caches or 3rd party cache adapters. MyBatis no longer calls Cache#getReadWriteLock(). Any locking needed by the cache should be implemented internally by the cache. So in case you coded your own cache make sure it is properly synchronized. See issue #159.

    Source code(tar.gz)
    Source code(zip)
    mybatis-3.2.6.zip(3.21 MB)
  • mybatis-3.2.5(Feb 15, 2014)

  • mybatis-3.2.4(Jan 17, 2014)

    See the details at https://github.com/mybatis/mybatis-3/issues?milestone=4&page=1&state=closed

    This version calculates bindings during startup for all statements that are not dynamic, so there is no longer needed to use lang="raw" to improve performance. See issue #98.

    An special remark about this feature. Previous versions ignored the "parameterType" attribute and used the actual parameter to calculate bindings. This version builds the binding information during startup and the "parameterType" attribute is used if present (though it is still optional), so in case you had a wrong value for it you will have to change it.

    Source code(tar.gz)
    Source code(zip)
    mybatis-3.2.4.zip(3.19 MB)
  • mybatis-3.2.3(Nov 8, 2013)

  • mybatis-3.2.2(Nov 8, 2013)

  • mybatis-3.2.1(Nov 8, 2013)

  • mybatis-3.2.0(Nov 8, 2013)

    New features:

    • Support for plugable scripting engines.
    • Support pluggable bytecode providers & Javassist.
    • Can fill nested queries from cache.
    • Logging improvements.
    • More than 40 bug fixes.

    Upgrade notes:

    • MyBatis 3.2 requires Jdk 1.6 while previous versions required Jdk 1.5.
    Source code(tar.gz)
    Source code(zip)
    mybatis-3.2.0.zip(4.51 MB)
DAO oriented database mapping framework for Java 8+

Doma Doma 2 is a database access framework for Java 8+. Doma has various strengths: Verifies and generates source code at compile time using annotatio

domaframework 353 Dec 28, 2022
ObjectiveSQL is an ORM framework in Java based on ActiveRecord pattern

ObjectiveSQL is an ORM framework in Java based on ActiveRecord pattern, which encourages rapid development and clean, codes with the least, and convention over configuration.

Braisdom 1.2k Dec 28, 2022
Language-Natural Persistence Layer for Java

Permazen is a better persistence layer for Java Persistence is central to most applications. But there are many challenges involved in persistence pro

Permazen 322 Dec 12, 2022
Storm - a fast, easy to use, no-bullshit opinionated Java ORM inspired by Doctrine

A stupidly simple Java/MySQL ORM with native Hikaricp and Redis cache support supporting MariaDB and Sqlite

Mats 18 Dec 1, 2022
ORM16 is a library exploring code generation-based approach to ORM for Java 17 and focusing on records as persistent data model

About ORM16 ORM16 is a library exploring code generation-based approach to ORM for Java 17 and focusing on records as persistent data model. Example I

Ivan Gammel 1 Mar 30, 2022
Java SQL (JDBC) code generator with GUI. SQL and OOP finally united.

jSQL-Gen Java SQL (JDBC) code generator with GUI. SQL and OOP finally united. Usage Install the latest release. Create a database, tables and their co

Osiris-Team 11 Nov 14, 2022
Dozer is a Java Bean to Java Bean mapper that recursively copies data from one object to another.

Dozer Active Contributors We are always looking for more help. The below is the current active list: Core @garethahealy @orange-buffalo ?? Protobuf @j

null 2k Jan 5, 2023
HasorDB is a Full-featured database access tool, Providing object mapping,Richer type handling than Mybatis, Dynamic SQL

HasorDB is a Full-featured database access tool, Providing object mapping,Richer type handling than Mybatis, Dynamic SQL, stored procedures, more dialect 20+, nested transactions, multiple data sources, conditional constructors, INSERT strategies, multiple statements/multiple results. And compatible with Spring and MyBatis usage.

赵永春 17 Oct 27, 2022
sql2o is a small library, which makes it easy to convert the result of your sql-statements into objects. No resultset hacking required. Kind of like an orm, but without the sql-generation capabilities. Supports named parameters.

sql2o Sql2o is a small java library, with the purpose of making database interaction easy. When fetching data from the database, the ResultSet will au

Lars Aaberg 1.1k Dec 28, 2022
🚀flink-sql-submit is a custom SQL submission client

??flink-sql-submit is a custom SQL submission client This is a customizable extension of the client, unlike flink's official default client.

ccinn 3 Mar 28, 2022
Elegance, high performance and robustness all in one java bean mapper

JMapper Framework Fast as hand-written code with zero compromise. Artifact information Status Write the configuration using what you prefer: Annotatio

null 200 Dec 29, 2022
Fast and Easy mapping from database and csv to POJO. A java micro ORM, lightweight alternative to iBatis and Hibernate. Fast Csv Parser and Csv Mapper

Simple Flat Mapper Release Notes Getting Started Docs Building it The build is using Maven. git clone https://github.com/arnaudroger/SimpleFlatMapper.

Arnaud Roger 418 Dec 17, 2022
The Mixin re-mapper for Lunar Client.

LunarRemapper The Mixin re-mapper for Lunar Client. I have little time to work on this project, if you know what you're doing and have familiarized yo

null 45 Nov 28, 2022
Multi-DBMS SQL Benchmarking Framework via JDBC

BenchBase BenchBase (formerly OLTPBench) is a Multi-DBMS SQL Benchmarking Framework via JDBC. Table of Contents Quickstart Description Usage Guide Con

CMU Database Group 213 Dec 29, 2022
💡极致性能的企业级Java服务器框架,RPC,游戏服务器框架,web应用服务器框架。(Extreme fast enterprise Java server framework, can be RPC, game server framework, web server framework.)

?? 为性能而生的万能服务器框架 ?? Ⅰ. zfoo简介 ?? 性能炸裂,天生异步,Actor设计思想,无锁化设计,基于Spring的MVC式用法的万能RPC框架 极致序列化,原生集成的目前二进制序列化和反序列化速度最快的 zfoo protocol 作为网络通讯协议 高可拓展性,单台服务器部署,

null 1k Jan 1, 2023
Java 项目快速开发脚手架。核心技术采用 SpringBoot、MyBatis、Thymeleaf、Bootstrap。

前言 闲来无事,整一个 Java 项目快速开发脚手架。 正文 一、简介 Chewing 是一个简单的 Java 项目快速开发脚手架。既适合需要开发小型项目的小伙伴使用,也适合刚入门的新手用来学习一些常用的技术。 二、源码 Github:https://github.com/jingqueyimu/c

null 33 Sep 26, 2022