Step 1

Command Line

If you are looking to generate your files from the command line, you will need to download the latest release from the github releases page. Ensure that you download the file with the -all classifier (e.g. h2zero-1.4.1-all.jar)

Ant/Gradle/Maven

See the dependencies listed in the README file in the github project

Step 2

Create your .h2zero file

To get started quickly, you can use the following h2zero file as a reference point - which is used throughout the examples listed in this documentation set.

This file generates a simple schema for a database that records users and their pets. Each user may have multiple pets and each pet may have multiple users.

{
"options": {
	"generators": [ "java", "sql", "taglib" ]
},
"database": {
	"schema": "sample",
	"package": "synapticloop.sample.h2zero",

	"tables": [
		{
			"name": "user_type",
			"comments": [
				"This is the user type table, which is a constant-generated table for all",
				"of the user types."
			],
			"fields": [
				{ "name": "id_user_type", "type": "bigint", "nullable": false, "primary": true },
				{ "name": "nm_user_type", "type": "varchar", "length": "32", "nullable": false },
			],
			"constants": [
				{ "name": "NORMAL", "values": [ 1, "normal" ] },
				{ "name": "SPECIAL", "values": [ 2, "special" ] },
				{ "name": "ADMIN", "values": [ 3, "admin" ] },
				{ "name": "SUPER_ADMIN", "values": [ 4, "super admin" ] }
			]
		},


		{
			"name": "user",
			"fields": [
				{ "name": "id_user", "type": "bigint", "nullable": false, "primary": true },
				{ "name": "id_user_type", "type": "bigint", "nullable": false, "index": true, "foreignKey": "user_type.id_user_type" },
				{ "name": "fl_is_alive", "type": "boolean", "nullable": true, "default": "'0'", "index": true },
				{ "name": "num_age", "type": "int", "nullable": false },
				{ "name": "nm_username", "type": "varchar", "length": "64", "nullable": false, "unique": true },
				{ "name": "txt_address_email", "type": "varchar", "length": "256", "nullable": false, "unique": true },
				{ "name": "txt_password", "type": "varchar", "length": "32", "nullable": false, "unique": true },
				{ "name": "dtm_signup", "type": "datetime", "nullable": true }
			],

			"fieldFinders": [
				{ "nm_username": "unique" },
				{ "txt_address_email": "unique" },
				{ "num_age": "multiple" },
				{ "fl_is_alive,num_age": "multiple" }
			],


			"finders": [
				{
					"name": "findByTxtAddressEmailTxtPassword",
					"whereClause": "where txt_address_email = ? and txt_password = ?",
					"whereFields": [
						"txt_address_email",
						"txt_password"
					],
					"unique": true
				},
				{
					"name": "findNmUserDtmSignup",
					"selectClause": "select nm_user, dtm_signup from user",
					"selectFields": [
						{ "name": "nm_user", "type": "varchar" },
						{ "name": "dtm_signup", "type": "datetime" }
					],
					"unique": false
				},
				{
					"name": "findGroupNumAge",
					"selectClause": "select count(*) as num_count, num_age from user group by num_count",
					"selectFields": [
						{ "name": "num_count", "type": "int" },
						{ "name": "num_age", "type": "int" }
					],
					"unique": false
				},
				{
					"name": "findByNumAgeIn",
					"whereClause": "where num_age in (...)",
					"whereFields": [
						"in:num_age"
					],
					"unique": false
				},
				{
					"name": "findByNumAgeBetween",
					"whereClause": "where num_age > ? and num_age < ?",
					"whereFields": [
						{ "name": "num_age", "alias": "numAgeMin" },
						{ "name": "num_age", "alias": "numAgeMax" }
					],
					"unique": false
				}


			],

			"questions": [
				{
					"name": "doWeHaveMoreThanTwentyUsers",
					"selectClause": "select count(*) > 20 from user"
				},
				{
					"name": "doesUserNameExist",
					"selectClause": "select count(*) > 0 from user"
				},
				{
					"name": "doWeHaveUsersBetweenAgeExclusive",
					"selectClause": "select count(*) > 0 from user",
					"whereClause": "where num_age > ? and num_age < ?",
					"whereFields": [
						{ "name": "num_age", "alias": "numAgeFrom" },
						{ "name": "num_age", "alias": "numAgeTo" }
					]
				},
				{
					"name": "doWeHaveUsersInAges",
					"selectClause": "select count(*) > 0 from user",
					"whereClause": "where num_age in (...)",
					"whereFields": [
						"in:num_age"
					]
				}
			],

			"counters": [
				{
					"name": "countNumberOfUsers",
					"selectClause": "select count(*) from user",
				},
				{
					"name": "countNumberOfUsersOverAge",
					"selectClause": "select count(*) from user",
					"whereClause": "where num_age > ?",
					"whereFields": [
						"num_age"
					]
				},
				{
					"name": "countNumberOfUsersBetweenAge",
					"selectClause": "select count(*) from user",
					"whereClause": "where num_age > ? and num_age < ?",
					"whereFields": [
						{ "name": "num_age", "alias": "numAgeFrom" },
						{ "name": "num_age", "alias": "numAgeTo" }
					]
				},
				{
					"name": "countUsersInAges",
					"selectClause": "select count(*) from user",
					"whereClause": "where num_age in (...)",
					"whereFields": [
						"in:num_age"
					]
				}
			]
		},


		{
			"name": "pet",
			"fields": [
				{ "name": "id_pet", "type": "bigint", "nullable": false, "primary": true },
				{ "name": "nm_pet", "type": "boolean", "nullable": true, "default": "'0'", "index": true },
				{ "name": "num_age", "type": "int", "nullable": false },
				{ "name": "flt_weight", "type": "float", "length": "6", "decimalLength": 1, "nullable": true },
				{ "name": "dt_birthday", "type": "date", "nullable": true }
			]
		},


		{
			"name": "user_pet",
			"fields": [
				{ "name": "id_user_pet", "type": "bigint", "nullable": false, "primary": true },
				{ "name": "id_user", "type": "bigint", "nullable": false, "index": true, "foreignKey": "user.id_user" },
				{ "name": "id_pet", "type": "bigint", "nullable": false, "index": true, "foreignKey": "pet.id_pet" }
			]
		}
	]
}
}

Step 3

Ant/gradle

See the Readme in the project root - the h2zero generation section

Step 4

Generate the code!

command line
java -jar h2zero-all.jar generate -in src/main/resources/sample.h2zero -out .
gradle
gradle h2zero
ant
ant h2zero

This will generate all of the required code for you h2zero file and database creation scripts, see the generated code page for an overview of the directory structure and the code that is generated.

Step 5

Run the code

Don't forget to include your c3po.properties file: And the required JDBC drivers

c3p0.user=your_user_name_here
c3p0.password=your_password_here

c3p0.jdbcUrl=jdbc:mysql://127.0.0.1:3306/your_schema_name_here?autoReconnect=true

c3p0.maxPoolSize=40
c3p0.maxStatements=0
c3p0.maxStatementsPerConnection=0
c3p0.minPoolSize=20
c3p0.acquireIncrement=3
c3p0.initialPoolSize=20
c3p0.acquireRetryAttempts=1
#c3p0.idleConnectionTestPeriod=300
c3p0.debugUnreturnedConnectionStackTraces=true