| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| reservedwordsmap.properties | 2026-05-31 | 1.4 kB | |
| README.md | 2026-05-31 | 8.9 kB | |
| examplecodedtypes.zip | 2026-05-31 | 26.3 kB | |
| lgpl.txt | 2026-05-31 | 7.4 kB | |
| daomedge-javadoc-12.2.0.zip | 2026-05-31 | 797.3 kB | |
| daomedge-src-12.2.0.zip | 2026-05-31 | 192.4 kB | |
| daomedgegen-src-12.2.0.zip | 2026-05-31 | 2.9 MB | |
| daomedgegen-12.2.0.zip | 2026-05-31 | 2.9 MB | |
| daomanual-12.2.0.pdf | 2026-05-31 | 3.1 MB | |
| daomedge-12.2.0.jar | 2026-05-31 | 226.6 kB | |
| daomanual-12.2.0.odt | 2026-05-31 | 2.8 MB | |
| dao.png | 2026-05-31 | 1.8 kB | |
| Totals: 12 Items | 12.8 MB | 0 | |
NOTE:
This is a simple, fully documented, POJO using, light weight, fast, thoroughly tested, data access library with a code generator.
DAOMedge targets Java 17 and doesn't, strictly speaking, conform to the DAO pattern. It was developed over many years and simply works well as it is. Although DAOMedge is compiled to Java 17, you can run it using later JDKs and it will compile to that JDK (see the status label on the bottom of the screen).
For convenience the daomedgegen uses the latest daomedge.jar, but without the version number and date. This is useful to keep the projects together. You just really need the generator binary (currently daomedgegen-11.0.2-28022026.zip) as that has daomedgegen.jar, daomedge.jar (in lib/), the reservedwordsmap.properties (for syntax highlighting and reserve word avoidance), documentation, and a slightly less cheesey icon than earlier.
The actual daomedge.jar has a version number in the file name but you can use either one.
I've attempted to ensure the documentation is extensive and up to date. You can grab either the source (daomedge.odt) or the compiled version (daomedge.pdf).
They are also in the source and compiled zips respectively.
There are entries in the supporting documents (manual and READMEs) that might sound condescending but that is because I have made these mistakes so I keep adding to the documentation to remind me.
Known Issues
There is a weird issue when adding the first interface, sometimes it works, other times it fails
and doesn't show up even though it is there (if you attempt to add the interface again it tells you that it is already there) I think it is a race condition, but am not sure. If you attempt to add another interface it fails with an index out of bounds exception. To get around this simply exit and restart.
Bash script to run the generator:
#!/bin/bash
cd /folder/daomedge/daomedgegen/
java -Xmx2g -jar daomedgegen.jar
Bash script to run the generator command line interface:
#!/bin/bash
cd /folder/daomedge/daomedgegen/
java -Xmx2g -jar daomedgegen.jar my_database
Or even:
#!/bin/bash
cd /folder/daomedge/daomedgegen/
java -Xmx2g -jar daomedgegen.jar $*
Sample Code
Simplest:
List<Customer> customers = dao.select(Customer.class);
Pattern Matching:
Customer c = new Customer();
c.setSurname("Smith");
List<Customer> customers = dao.select(c);
Sort and Filter:
daotable table = dao.getTable(Customer.class);
daoproperty property1 = dao.getProperty(Customer.class, Customer.SURNAME);
daoproperty property2 = dao.getProperty(Customer.class, Customer.GIVENS);
OrderBy orderBy2 = new OrderBy(property2);
SelectColumn column1 = new SelectColumn(property1);
SelectColumn column2 = new SelectColumn(property2);
Filter filter = new PropertyFilter(table, property1, "Smith");
List<Customer> customers = dao.select(table, new SelectColumn[]{column1, column2}, filter, new OrderBy[]{orderBy2});
NotSQL
Limits
Simple queries can only have one table's columns in the get clasue.
Multi-table queries cannot use the * syntaxt.
Aggregate queries need the operand and value (even if it is != null or similar)
The Script
set classbase my.business;
{Query1}
get database.Customer.*
filter (database.Customer.surname = Smith | database.Customer.surname = 'Jones') & database.Customer.givens = 'John'
sort home.Person.dateOfBirth >;
{Query2}
sort home.Person.dateOfBirth >;
filter (database.Customer.surname not in [Smith, Jones) & database.Customer.givens = 'John'
get database.Customer.*
The Code For NotSQL
SimpleNotSQL notsql = new SimpleNotSQL(dao, notSQLScriptFromAbove);
List<Customer> customers = notsql.selectNotSQL("Query1");
customers = notsql.selectNotSQL("Query2");
// OR
customers = notsql.selectNotSQL(0);
customers = notsql.selectNotSQL(1);
Grab the latest documentation for a full list of examples.
Version 12.2.0 changelog
BulkDelete has issues with filters with multiple tables, the from clause wasn't correctly built. I have fixed that.
BulkUpdate has been added, you can bulk update to a fixed value or bulk update across tables.
BulkInsert has been added, you can bulk insert to a fixed values or bulk insert across tables.
With the success of bulk deletes I am adding CRUD into NotSQL. To this end I have added 'read' as a replacement for 'get'; 'get' will still work for the foreseeable future.
There are now Bulk Update and Bulk Delete NotSQL dialogs in the generator.
The NotSQL interpreter can be used to call for the select equivalent for any bulk update/delete queries.
The editors will compare the number of rows about to be updated with the max rows setting on the dialog throw an exception if it is too high.
Bulk insert, update, and delete are designed to be bulk changes and thus bypass validators and auto type columns.
You can now copy one table's data dictionary to the clipboard and paste/merge it into another table. There are no table name checks and it will only change the data dictionary entry if the entry exists, the column/relationship exists and either the receiving table's entry is blank (merge) or you're overriding it (paste).
The table's data entry value will only be copied to a same named table.
This means if you have a number of tables with the same set of columns (e.g. auto types) you can copy from the first and paste to all of the others. You can copy from test to live, you can copy and paste the data dictionary into a text editor and, carefully, edit the entries and copy and paste it back.
I've switched from splitting on "\n" to splitting on "[\r\n]+", not sure if this was needed, but there are a number of places that allow for external editing, particularly of the data dictionary.
There is some additions the the DAO cloneDatabaseObject method, it is more tolerant of switching between Date, LocalDateTime, String and CodedType that are different on the cloned table.
SQLite doesn't do date time correctly, treats them as 12 varchar rather than 93 or 94, date or timestamp.
I've started to remove the annoying 'Yes I Copied it to a Clipboard' confirmation type dialogs.
The view other extn etc. dialog now propagates the changes up to the top so the folder and files are coloured blue when changes are detected.
I have 'externalized' the help for NotSQL. It is in the working folder and called notsql.help. You can edit it, just leave the headers (==== lines).
If an insert has been completed, then we can safely set completely loaded as the database has excepted the values.
Copy data dictionary is now on the changes to extn dialog.
Version 12.2.0 was released on 31-May-2026.
Known Issues
In version 11.0.0 I introduced a check against used imports. If you have an import from another jar file that has the same package name, the 'Show Usage' dialog will incorrectly list it as being in use.
e.g. I have two jars, both have the same utilities package so both are flagged as being in use.
I cannot get the JTree to expand to and show the selection of a new node. It selects the new node as the Edit Panel is set correctly it's just the JTree that is failing to show it.
I use Tree Types which extend AbstractTreeType which, in turn, extends DefaultMutableTreeNode.
For example, Adding a new Relationship builds the RealationshipTreeType, adds it to the tree model and calls the selection code inside a SwingUtilities.invokeLater call and, yet, it doesn't seem to work.
Thus:
private void newRelationship() {
RelationshipTreeType relationshipTreeType = getTreeType().createNewRelationship();
if (relationshipTreeType != null) {
RelationshipTypeTreeType parentNode = getTreeType();
DefaultTreeModel treeModel = getTreeModel();
treeModel.insertNodeInto(relationshipTreeType, parentNode, parentNode.getChildCount() - 1);
TreePath path = new TreePath(relationshipTreeType);
SwingUtilities.invokeLater(() -> {
getTree().setSelectionPath(path);
getTree().expandPath(path.getParentPath());
getTree().scrollPathToVisible(path);
});
}
}