package io.trygvis.persistence; import io.trygvis.container.compiler.model.ClassG; import io.trygvis.container.compiler.model.ParameterRef; import io.trygvis.container.compiler.model.TypeRef; import javax.lang.model.type.DeclaredType; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import static org.apache.commons.lang.StringUtils.join; public class EntityMirror { public final GeneratorSupport generatorSupport; public final List fields = new ArrayList<>(); public final DeclaredType javaName; public final String tableName; public final String daoName; public EntityMirror(GeneratorSupport generatorSupport, DeclaredType javaName, String tableName) { this.generatorSupport = generatorSupport; this.javaName = javaName; this.tableName = tableName; this.daoName = javaName.asElement().getSimpleName() + "Dao"; } public void add(FieldMirror field) { fields.add(field); } public String insertIntoSql() { List names = new ArrayList<>(); List placeholders = new ArrayList<>(); for (FieldMirror field : fields) { names.add(field.sqlName); placeholders.add("?"); } return "INSERT INTO " + tableName + "(" + join(names, ", ") + ") " + "VALUES(" + join(placeholders, ", ") + ");"; } public void insertInto(ClassG g) { TypeRef conType = g.addImport(Connection.class); TypeRef psType = g.addImport(PreparedStatement.class); TypeRef objectType = g.addImport(javaName); ParameterRef con = new ParameterRef(conType, "con"); ParameterRef object = new ParameterRef(objectType, "o"); List body = new ArrayList<>(); body.add("try(" + psType.name + " stmt = " + con.name + ".prepareStatement(insertIntoSql)) {"); for (int i = 0; i < fields.size(); i++) { FieldMirror field = fields.get(i); TypeHandler typeHandler = generatorSupport.typeHandler(field.element); body.add(" stmt." + typeHandler.resultSetSetter(i + 1, "o", field) + ";"); } body.add(" stmt.executeUpdate();"); body.add("}"); g.addStaticMethod(body, TypeRef.VOID, "insertInto", con, object). exception(g.addImport(SQLException.class)); } }