----->码云地址
实现了 ResourceLoaderAware 接口 ,自定义实现了包扫描
public Set<Class<?>> entityScan(String scanPath) {
Set<Class<?>> classes = new LinkedHashSet<Class<?>>();
String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
.concat(ClassUtils.convertClassNameToResourcePath(SystemPropertyUtils.resolvePlaceholders(scanPath))
.concat("/**/*.class"));
System.out.println("实体类包扫描路径 = " + packageSearchPath);
Resource[] resources = new Resource[0];
try {
resources = resolver.getResources(packageSearchPath);
} catch (IOException e) {
e.printStackTrace();
}
MetadataReader metadataReader = null;
for (Resource resource : resources) {
if (resource.isReadable()) {
try {
metadataReader = metadataReaderFactory.getMetadataReader(resource);
} catch (IOException e) {
e.printStackTrace();
}
try {
// 当类型不是抽象类或接口在添加到集合
if (metadataReader.getClassMetadata().isConcrete()) {
classes.add(Class.forName(metadataReader.getClassMetadata().getClassName()));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return classes;
}
利用反射获取类信息,注解,字段
public Map<String, Set<EntityColumn>> entityMap(String scanPagePath){
Set<Class<?>> classes = entityScan(scanPagePath);
//Map<String,Map<String,String>> data = new HashMap<String, Map<String, String>>();
Map<String,Set<EntityColumn>> em = new HashMap<>(classes.size());
String tableName;
Set<EntityColumn> columns = new LinkedHashSet<>();
//Map<String,String> props = null;
for (Class<?> entity : classes) {
boolean entityAnnotationPresent = entity.isAnnotationPresent(Entity.class);
boolean tableAnnotationPresent = entity.isAnnotationPresent(Table.class);
if (entityAnnotationPresent){
Entity e = entity.getAnnotation(Entity.class);
String value = e.name();
if (value.isEmpty()){
tableName = entity.getSimpleName().toLowerCase();
}else {
tableName = value;
}
}else if (tableAnnotationPresent){
Table t = entity.getAnnotation(Table.class);
String value = t.name();
if (value.isEmpty()){
tableName = entity.getSimpleName().toLowerCase();
}else {
tableName = value;
}
}else {
tableName = entity.getSimpleName().toLowerCase();
}
//System.out.println("类名" + tableName);
//props = new HashMap<String,String>(entity.getDeclaredFields().length);
columns = new LinkedHashSet<>(entity.getDeclaredFields().length);
for (Field declaredField : entity.getDeclaredFields()) {
String prop = declaredField.getName().toLowerCase();
String type = declaredField.getType().getSimpleName().toLowerCase();
//System.out.println("类型:属性 " + type+":"+prop);
boolean annotationPresent = declaredField.isAnnotationPresent(Column.class);
if (annotationPresent){
Column c = declaredField.getAnnotation(Column.class);
String cname = c.name();
boolean unique = c.unique();
boolean nullable = c.nullable();
int length = c.length();
//System.out.println(value);
if (cname.isEmpty()){
//props.put(prop,type);
EntityColumn ec = new EntityColumn(prop,unique,nullable,length,type);
columns.add(ec);
}else {
EntityColumn ec = new EntityColumn(cname,unique,nullable,length,type);
columns.add(ec);
//props.put(cname,type);
}
}else {
//props.put(prop,type);
EntityColumn ec = new EntityColumn(prop,type);
columns.add(ec);
}
}
em.put(tableName,columns);
//data.put(tableName,props);
}
/* for (Map.Entry<String, Set<EntityColumn>> entry : em.entrySet()) {
System.out.println(entry);
}*/
//System.out.println(em);
return em;
}
生成sql语句
public void create(String tableName, Set<EntityColumn> ec) {
StringBuilder sb = new StringBuilder();
sb.append("CREATE TABLE " + tableName + " (");
for (EntityColumn column : ec) {
String columnName = column.getName();
String columnType = column.getType();
int columnLength = column.getLength();
boolean columnNullable = column.isNullable();
boolean columnUnique = column.isUnique();
String sqlColumnType = ColumnType.getSqlColumnType(columnType);
String sqlColmunNullable = columnNullable ? "NULL ," : "NOT NULL ,";
String sqlColmunUnique = columnUnique ? "UNIQUE(" + columnName + ") " : "";
sb.append(columnName).append(space).append(sqlColumnType).append("(").append(columnLength).append(")").append(space).append(sqlColmunNullable).append(sqlColmunUnique).append(space);
}
String end = sb.toString().trim().replaceAll(",$", "") + ");";
createSql = end;
System.out.println("createSql = " + createSql);
execute(createSql);
}
定义字段类型
public static String getSqlColumnType(String columnType) {
map.put("string","varchar");
map.put("char","char");
map.put("int","int");
map.put("integer","int");
map.put("boolean","tinyint");
map.put("long","bigint");
map.put("object","int");
return map.get(columnType);
}
加载数据源配置
@ConfigurationProperties(
prefix = "spring.datasource"
)
public class DataSourceConfig{
private Class<? extends DataSource> type;
private String driverClassName;
private String url;
private String username;
private String password;
public Class<? extends DataSource> getType() {
return type;
}
public void setType(Class<? extends DataSource> type) {
this.type = type;
}
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
实体类
@Table(name = "tb_user")
public class User {
public User(String name, String pass, Long id) {
this.name = name;
this.pass = pass;
this.id = id;
}
public User() {
}
@Column(name = "username")
private String name;
private String pass;
@Id
public Long id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
@Id
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}