With uniVocity all your data problems become trivial. Its unique features make it easy for you to accomplish much more in a fraction of the time and cost!


uniVocity is simple. All you need to do is to configure your mappings and all the rest is taken care of.

Data consistency, data management, performance and the complexity involved in the process are no longer problems you should worry about.


uniVocity is extremely fast. It's faster than what most developers can implement manually.

It is also faster than any other commercial ETL application in the market. We have years of experience developing real-time, concurrent and distributed systems. Performance is our top priority.


uniVocity is free for non-commercial use.

For commercial users, a 30-day trial license is available to test uniVocity in your enterprise environment.

Easy mapping definition

With the fluent API uniVocity provides, you need very little to accomplish a lot.

        EntityMapping entityMapping = dataStoreMapping.map("source_entity", "destination_entity");
        entityMapping.identity().associate("pk1", "pk2").toGeneratedId("id");
        entityMapping.value().copy("name", "quantity", "price").to("description", "amount", "price");

Data management

uniVocity is the only data integration solution that cares about your data once it has been mapped. You can easily manage how to handle data updates, and leverage the automatic update detection and synchronization features to deliver extremely complex mapping solutions in no time.


Information integrity

Decompose your input data and map it into a new schema. uniVocity manages referential constraints and generated keys, even when information is obtained from irregular data (such as words in free text). It doesn't matter how data is stored, uniVocity can transform it whilst maintaining information integrity.


Have access to each step of the mapping process and tailor your data flow from one end to another.

        entityMapping.addOutputRowReader(new RowReader() {

                public void processRow(Object[] inputRow, Object[] outputRow, RowMappingContext context) {
                    // modify data as it is processed               
                    String name = context.getOutputValue("name", String.class);
                    if(name != null){
                        context.setOutputValue("name", name.toUpperCase());
                    } else {

                    // use any objects accessible from within your application 
                    context.setOutputValue("processed_date", new Date());
                    context.setOutputValue("username", session.getAttribute("currentSessionUser"));


Use components from your existing application: are you using a distributed cache? Do you need to use data from external services, or from objects in your system? You can make uniVocity use these and any other resources from your application stack.

            engine.addFunction(EngineScope.CYCLE, "getAccountBalance", new FunctionCall<BigDecimal, String>() {
                public BigDecimal execute(String accountNumber) {
                    return yourAccountService.findAccount(accountNumber).getBalance();




uniVocity gives you control over what records to update, when and how.

        engine.disableUpdateOnRecords("myEntity", datasetWithRecords);




No limitations

Data inputs and outputs can be anything. uniVocity lets you create custom data entities, data stores and queries. Any database that has a JDBC driver will work out of the box with uniVocity.

        public class MyEntity implements com.univocity.api.entity.custom.CustomDataEntity {

            private final MyDataStore dataStore;

            public com.univocity.api.entity.custom.ReadingProcess preareToRead(String[] fieldNames){

            public com.univocity.api.entity.custom.WritingProcess prepareToWrite(String[] fieldNames){



Manage the use of potentially slow operations and determine when to invoke them using the various scope levels provided by uniVocity.

        engine.addQuery(EngineScope.APPLICATION, "findAccountType")
                    .fromString("SELECT account_type_id FROM account_type WHERE code = :accountTypeCode")



And much, much more! Check our tutorials, documentation and source code