A Java CRUD generator example

I'm still spending a couple of hours a day working on my Java CRUD generator. Technically, because this is all driven by templates, this is also a PHP CRUD generator, and a Python CRUD generator, and in general a programming-language independent CRUD generator, but at the moment it seems easiest to refer to it as a "Java CRUD generator", so I'll call it that for the moment.

How my CRUD generator works

In today's update I'd like to show you how this works. In short, you start with a database table like this one:

mysql> desc users;
+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| uid       | int(10) unsigned | NO   | PRI | NULL    | auto_increment | 
| name      | varchar(60)      | NO   | UNI |         |                | 
| pass      | varchar(32)      | NO   |     |         |                | 
| mail      | varchar(64)      | YES  | MUL |         |                | 
| mode      | tinyint(4)       | NO   |     | 0       |                | 
| sort      | tinyint(4)       | YES  |     | 0       |                | 
| threshold | tinyint(4)       | YES  |     | 0       |                | 
| theme     | varchar(255)     | NO   |     |         |                | 
| signature | varchar(255)     | NO   |     |         |                | 
| created   | int(11)          | NO   | MUL | 0       |                | 
| access    | int(11)          | NO   | MUL | 0       |                | 
| login     | int(11)          | NO   |     | 0       |                | 
| status    | tinyint(4)       | NO   |     | 0       |                | 
| timezone  | varchar(8)       | YES  |     | NULL    |                | 
| language  | varchar(12)      | NO   |     |         |                | 
| picture   | varchar(255)     | NO   |     |         |                | 
| init      | varchar(64)      | YES  |     |         |                | 
| data      | longtext         | YES  |     | NULL    |                | 
+-----------+------------------+------+-----+---------+----------------+
18 rows in set (0.28 sec)

Next, you run my script to create a Java model class, which looks something like this:

db gen model User

This uses a Java model template class that looks like this:

public class <<$classname|capitalize>>
{
<<section name=id loop=$fields>>
  private <<$types[id]>> <<$fields[id]>>;
<</section>>

<<* --- getters --- *>>
<<section name=id loop=$fields>>
  public <<$types[id]>> get<<$fields[id]|capitalize>>();
  {
    return <<$fields[id]|capitalize>>;
  }
<</section>>
<<* --- setters --- *>>
<<section name=id loop=$fields>>
  public void set<<$fields[id]|capitalize>>(<<$types[id]>> <<$fields[id]>>);
  {
    this.<<$fields[id]>> = <<$fields[id]>>;
  }
<</section>>
}

and produces an output Java model class that looks like this:

public class User
{
  private int uid;
  private String name;
  private String pass;
  private String mail;
  private int mode;
  private int sort;
  private int threshold;
  private String theme;
  private String signature;
  private int created;
  private int access;
  private int login;
  private int status;
  private String timezone;
  private String language;
  private String picture;
  private String init;
  private Object data;

  public int getUid();
  {
    return Uid;
  }
  public String getName();
  {
    return Name;
  }
  public String getPass();
  {
    return Pass;
  }
  public String getMail();
  {
    return Mail;
  }
  public int getMode();
  {
    return Mode;
  }
  public int getSort();
  {
    return Sort;
  }
  public int getThreshold();
  {
    return Threshold;
  }
  public String getTheme();
  {
    return Theme;
  }
  public String getSignature();
  {
    return Signature;
  }
  public int getCreated();
  {
    return Created;
  }
  public int getAccess();
  {
    return Access;
  }
  public int getLogin();
  {
    return Login;
  }
  public int getStatus();
  {
    return Status;
  }
  public String getTimezone();
  {
    return Timezone;
  }
  public String getLanguage();
  {
    return Language;
  }
  public String getPicture();
  {
    return Picture;
  }
  public String getInit();
  {
    return Init;
  }
  public Object getData();
  {
    return Data;
  }
  public void setUid(int uid);
  {
    this.uid = uid;
  }
  public void setName(String name);
  {
    this.name = name;
  }
  public void setPass(String pass);
  {
    this.pass = pass;
  }
  public void setMail(String mail);
  {
    this.mail = mail;
  }
  public void setMode(int mode);
  {
    this.mode = mode;
  }
  public void setSort(int sort);
  {
    this.sort = sort;
  }
  public void setThreshold(int threshold);
  {
    this.threshold = threshold;
  }
  public void setTheme(String theme);
  {
    this.theme = theme;
  }
  public void setSignature(String signature);
  {
    this.signature = signature;
  }
  public void setCreated(int created);
  {
    this.created = created;
  }
  public void setAccess(int access);
  {
    this.access = access;
  }
  public void setLogin(int login);
  {
    this.login = login;
  }
  public void setStatus(int status);
  {
    this.status = status;
  }
  public void setTimezone(String timezone);
  {
    this.timezone = timezone;
  }
  public void setLanguage(String language);
  {
    this.language = language;
  }
  public void setPicture(String picture);
  {
    this.picture = picture;
  }
  public void setInit(String init);
  {
    this.init = init;
  }
  public void setData(Object data);
  {
    this.data = data;
  }
}

Once again, my approach is template based, so my script reads both (1) the database and (2) the template you specify, and produces the output shown here. This is described in more detail in my initial Java/PHP CRUD generator article.

Java CRUD generator - Java views

As you might be able to imagine, if I can generate a Java model class like this, I can also generate Java view elements as well. For instance, if I want to create an "Add" JSP for this same database table, I'd start with a template I've named view_add.tpl:

<%@ page import="<<$PACKAGE_NAME>>.<<$classname>>" errorPage="error.jsp" %>

<html>
<head>
  <title>Add a new <<$classname>></title>
</head>

<body>

<h2>Add a new <<$classname>></h2>

<form action="<<$classname|capitalize>>Controller" method="post">

  <input type="hidden" name="ACTION" value="ADD">
  <input type="hidden" name="CURRENT_PAGE" value="<<$classname>>Add.jsp">

  <table>

<<* --- create an input field for each database table field --- *>>
<<section name=id loop=$fields>>
    <tr>
      <td align=left valign=top>
        <b><<$fields[id]>>:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="<<$fields[id]>>">
      </td>
    </tr>
<</section>>

    <!-- TODO: Change this for your own "Cancel" navigation. -->
    <tr>
      <td align=left valign=top>
         
      </td>
      <td align=left valign=top><input type=submit name="ADD" value="  Add  "><input
             type="button"
             value="  Cancel  "
             onClick="window.location.href='GO_SOMEWHERE.jsp'">
      </td>
    </tr>
  </table>

</form>
</body>
</html>

And now when I run this command:

db gen view_add User

this will generate a JSP view page that looks like this:

<%@ page import="com.devdaily.foo.model.User" errorPage="error.jsp" %>

<html>
<head>
  <title>Add a new User</title>
</head>

<body>

<h2>Add a new User</h2>

<form action="UserController" method="post">

  <input type="hidden" name="ACTION" value="ADD">
  <input type="hidden" name="CURRENT_PAGE" value="UserAdd.jsp">

  <table>
    <tr>
      <td align=left valign=top>
        <b>uid:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="uid">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>name:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="name">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>pass:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="pass">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>mail:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="mail">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>mode:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="mode">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>sort:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="sort">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>threshold:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="threshold">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>theme:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="theme">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>signature:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="signature">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>created:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="created">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>access:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="access">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>login:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="login">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>status:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="status">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>timezone:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="timezone">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>language:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="language">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>picture:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="picture">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>init:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="init">
      </td>
    </tr>
    <tr>
      <td align=left valign=top>
        <b>data:</b>
      </td>
      <td align=left valign=top>
        <input type="text" name="data">
      </td>
    </tr>

    <!-- TODO: Change this for your own "Cancel" navigation. -->
    <tr>
      <td align=left valign=top>
         
      </td>
      <td align=left valign=top><input type=submit name="ADD" value="  Add  "><input
             type="button"
             value="  Cancel  "
             onClick="window.location.href='GO_SOMEWHERE.jsp'">
      </td>
    </tr>
  </table>

</form>
</body>
</html>

My Java/PHP CRUD generator - Summary

I'm sorry that I don't have time to detail this any more today, I'm just trying to provide updates to the status of my Java CRUD generator as I go along. And again, not only is this tool a Java CRUD generator, it's also a:

  • JSF CRUD generator
  • Struts CRUD generator
  • PHP CRUD generator
  • Ruby CRUD generator
  • Python CRUD generator
  • Perl CRUD generator
  • Any-Programming-Language CRUD generator
  • Any-Framework-You-Want CRUD generator

That's because rather than being written for any one programming language, it's being created with templates, and with those templates you can do whatever you want.

Again, please see my initial Java/PHP CRUD generator article for more information on my approach.

Update: This software is now publicly available. See my Programming Language-Independent CRUD Generator page for more information.