您的位置:首页 > 其它

Jinx项目2015-12-30日记

2015-12-30 15:30 232 查看
通过JPA注解描述实体对象后,我们需要一个方法来获取这些关系,代码如下:
public class JpaUtils {

static Logger log = Logger.getLogger(JpaUtils.class);

protected static List<Field> scanBean(Class<?> t) {
List<Field> list = new ArrayList<Field>();
for (Field field : t.getDeclaredFields()) {
if (field.isAnnotationPresent(Column.class)) {
list.add(field);
}
}
return list;
}

public static String createSql(Class<?> t) {
String tableName = t.getAnnotation(Table.class).name();
List<Field> list = scanBean(t);
StringBuilder sql = new StringBuilder();
sql.append("create table " + tableName + " (\n" + createColumns(list) + ")");
log.debug("[DEBUG] create table sql : " + sql.toString());
return sql.toString();
}

protected static String createColumns(List<Field> list) {
StringBuilder columns = new StringBuilder();
for (Field field : list) {
Column c = field.getAnnotation(Column.class);
String nullable = c.nullable()? "" : "not null";
String pk = "";
if (field.isAnnotationPresent(Id.class)) {
pk = "primary key";
}
columns.append(c.name() + " " + ColumnType.getColumnType(field.getType().getSimpleName()) + " " + nullable + " " + pk + ",\n");
}
columns.deleteCharAt(columns.length() - 2);
return columns.toString();
}

}

scanBean这个方法负责扫描实体Bean获得所有被注解的字段,createColumns接收scanBean的返回值为参数,它组装出sql格式的字段语句,如"xxx varchar2(10) not null, ...",值得注意的是,java类型与数据库字段类型的对应关系被我封装在枚举里了public enum ColumnType {

STRING("VARCHAR2(10)"),
BYTE("NUMBER"),
INT("NUMBER"),
INTEGER("NUMBER"),
LONG("NUMBER"),
FLOAT("NUMBER"),
DOUBLE("NUMBER"),
BIGDECIMAL("NUMBER"),
BOOLEAN("NUMBER"),
DATE("DATE");

private final String columnType;

private ColumnType(String columnType) {
this.columnType = columnType;
}

public static String getColumnType(String type) {
for (ColumnType columnType : ColumnType.values()) {
if (type.toUpperCase().equals(columnType.toString())) {
return columnType.columnType;
}
}
return "VARCHAR2(10)";
}

}最后一个createSql方法负责组装出完整的sql语句。接下来我们完善之前的ConnectionUtils中的createTable方法
public class ConnectionUtils {

static Logger log = Logger.getLogger(ConnectionUtils.class);

protected static Connection getConnection(DataBase dataBase) {
Connection conn = null;
try {
Class.forName(dataBase.getDriverClass()).newInstance();
conn = DriverManager.getConnection(dataBase.getJdbcUrl(), dataBase.getUser(), dataBase.getPassword());
log.info("[INFO] connect database success");
} catch (Exception e) {
log.error("[ERROR] connect database failed");
e.printStackTrace();
}
return conn;
}

public static void createTable(Class<?> t) {
DataBase dataBase = DataBase.getDataBase(PropertiesUtils.getProperties("/jdbc.properties"));
Connection connection = getConnection(dataBase);
if (connection == null) {
return;
}
Statement stmt = null;
try {
log.info("[INFO] create table begin");
stmt=connection.createStatement();
stmt.executeUpdate(JpaUtils.createSql(t));
log.info("[INFO] create table success");
} catch (SQLException e) {
e.printStackTrace();
log.error("[ERROR] create table failed");
} finally {
try {
if (stmt != null) {
stmt.close();
}
if (connection != null) {
connection.close();
}
log.info("[INFO]  close connection success");
} catch (SQLException e) {
e.printStackTrace();
log.error("[ERROR] close Connection or Statement failed");
}
}
}

}
在单元测试中测试ConnectionUtils.createTable(xxx.class),执行通过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: