Jinx项目2015-12-30日记
2015-12-30 15:30
232 查看
通过JPA注解描述实体对象后,我们需要一个方法来获取这些关系,代码如下:
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 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),执行通过。
相关文章推荐
- Shiro HelloWorld (二)从数据库中获得数据
- LeetCodeP079 Word Search
- Linux下实现U盘、SD卡自动挂载功能(转)
- iOS 微信分享
- 列出目录和文件并链接的两种方法
- android 动态改变字体大小
- 减少网卡中断收包产生的CPU消耗
- Android编程获取系统隐藏服务实现锁屏的方法
- Django-blog开源
- 通过ViewController的关键流程来理解流程建模
- 2015.12.30
- 动态链接库与静态链接库区别
- 实验四主存空间的分配和回收
- shell获取目录下最新的文件,文件是以日期命名
- Android HttpURLConnection Post 参数 (https)
- Scala 抽象类型Type
- java在linux系统中获取网关
- mysql客户端操作 简数据库建立
- 软件测试过程模型-前置测试模型
- 点九图