mybatis根据实体类产生mapper文件
来源:互联网 发布:bf风森系部落卫衣淘宝 编辑:程序博客网 时间:2024/06/05 09:18
主要思路是根据po上的注解来生成相应的mapper文件,并输出在控制台上。
解析类:
package com.video.util;
import java.lang.reflect.Field;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.ResourceBundle;
import com.video.annotation.Column;
import com.video.annotation.ID;
import com.video.annotation.Table;
public class GeneratorUtil {
private static final ResourceBundle generatorBundle = ResourceBundle
.getBundle("generator");
private static final String START_KEY = "start";
private static final String END_KEY = "end";
private static final String INSERT_STATEMENT = "insert";
private static final String SEARCH_VO_STATEMENT = "selectVoBySo";
private static final String SEARCH_PO_STATEMENT = "selectPoBySo";
private static final String UPDATE_STATEMENT = "update";
private static final String DELETE_STATEMENT = "delete";
private static String tableName;
private static Map<String, String> propertyToColumnMap;
private static final String DECIMAL_SPLIT = ":";
public static void main(String[] args) {
String targetClassName = "com.video.domain.User";
init(targetClassName);
StringBuffer buffer = new StringBuffer();
buffer.append(generatorStart(targetClassName));
buffer.append(generatorSearchPoBySo(targetClassName));
buffer.append(generatorInsert(targetClassName));
buffer.append(generatorUpdate(targetClassName));
buffer.append(generatorEnd(targetClassName));
System.out.println(buffer.toString());
}
private static void init(String targetClassName) {
Class clazz = loadClassByName(targetClassName);
Table tableAno = (Table) clazz.getAnnotation(Table.class);
tableName = tableAno.name();
propertyToColumnMap = new HashMap<String, String>();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(ID.class)) {
ID id = field.getAnnotation(ID.class);
try {
propertyToColumnMap.put(field.getName() + DECIMAL_SPLIT
+ field.getType().getName(), id.name());
} catch (Exception e) {
e.printStackTrace();
}
} else if (field.isAnnotationPresent(Column.class)) {
Column column = field.getAnnotation(Column.class);
propertyToColumnMap.put(field.getName() + DECIMAL_SPLIT
+ field.getType().getName(), column.name());
}
}
}
private static String generatorStart(String targetClassName) {
String start = generatorBundle.getString(START_KEY);
return MessageFormat.format(start, new Object[] { targetClassName })
+ "\n\n";
}
private static String generatorEnd(String targetClassName) {
String end = generatorBundle.getString(END_KEY);
return MessageFormat.format(end, new Object[] {}) + "\n";
}
private static String generatorSearchPoBySo(String targetClassName) {
String src = generatorBundle.getString("select");
return MessageFormat.format(src, new Object[] { SEARCH_PO_STATEMENT,
targetClassName, tableName })
+ "\n";
}
private static String generatorSearchVoBySo(String targetClassName) {
String src = generatorBundle.getString("select");
return MessageFormat.format(src, new Object[] { SEARCH_VO_STATEMENT,
targetClassName, tableName })
+ "\n";
}
private static String generatorInsert(String targetClassName) {
String src = generatorBundle.getString(INSERT_STATEMENT);
StringBuffer columnContent = new StringBuffer();
StringBuffer valuesContent = new StringBuffer();
int count = 0;
for (Entry<String, String> entry : propertyToColumnMap.entrySet()) {
if (count > 0) {
columnContent.append(",");
valuesContent.append(",");
}
columnContent.append(entry.getValue());
String[] keys = entry.getKey().split("\\" + DECIMAL_SPLIT);
valuesContent.append("#{" + keys[0] + ",");
valuesContent.append(getStringByType(keys[1]));
valuesContent.append("}");
count++;
}
return MessageFormat.format(src, new Object[] { targetClassName,
tableName, columnContent.toString(),valuesContent.toString() })
+ "\n";
}
private static String getStringByType(String type){
String res=null;
if (Long.class.getName().equals(type)) {
res="jdbcType=BIGINT";
} else if (String.class.getName().equals(type)) {
res="jdbcType=VARCHAR";
} else {
throw new RuntimeException("不支持的属性类型:" + type);
}
return res;
}
private static String generatorUpdate(String targetClassName) {
String src = generatorBundle.getString(UPDATE_STATEMENT);
StringBuffer content = new StringBuffer();
int count=0;
for(Entry<String, String> entity:propertyToColumnMap.entrySet()){
if(count>0){
content.append(",");
}
String[] keys=entity.getKey().split("\\"+DECIMAL_SPLIT);
content.append(entity.getValue()+"=#{"+keys[0]+",");
content.append(getStringByType(keys[1])+"}");
count++;
}
return MessageFormat.format(src, new Object[] { targetClassName,
tableName, content.toString()})
+ "\n";
}
public static Class loadClassByName(String targetClassName) {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
try {
Class target = cl.loadClass(targetClassName);
return target;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
- mybatis根据实体类产生mapper文件
- 根据数据库生成mybatis 用到的实体类,及mapper文件
- mybatis 自动生成实体类、mapper.xml文件
- Mysql+mybatis 反转生成实体类和Mapper文件以及Mapper.xml文件
- maven插件mybatis-generator自动生成实体类、mapper.xml、mapper.java文件
- 工具类生成mybatis的Mapper类和xml文件以及实体
- 整合maven+mybatis+generator生成java自定义model实体类,dao接口和mapper映射文件
- Mybatis逆向生成实体类,DAO层与mapper.xml文件
- 使用Mybatis生成工具自动生成实体类和对应的mapper映射文件以及接口文件
- mybatis自动生成mapper.xml和接口实体类工具
- mybatis反转自动生成dao、实体类和mapper.xml
- Mybatis自动生成实体类、mapper.xml和dao
- mybatis根据数据库生成mapper
- mybatis如何根据mapper接口生成其实现类
- mybatis如何根据mapper接口生成其实现类
- mybatis如何根据mapper接口生成其实现类
- mybatis如何根据mapper接口生成其实现类
- mybatis如何根据mapper接口生成其实现类
- 一个neodatis-odb.jar包使用的例子
- 求二叉树的先序遍历
- 先排序,然后根据排序删除前几条数据oracl
- zigzag扫描 简单介绍
- Android面试之---谈谈你对Android NDK的理解.
- mybatis根据实体类产生mapper文件
- CSS基础
- 黑马程序员——HTML学习笔记
- 電容容量判讀方法
- Android面试之----Android系统架构图及简单的系统架构介绍分类:
- 脾气大了
- sql中top使用方法
- 一个硕士是怎么样发5篇SCI的--------谈研究感悟
- POJ 3281 Dining