/*** 实体对象的反射操作*/
public class EntityOperation<T> {private Logger log = Logger.getLogger(EntityOperation.class);public Class<T> entityClass = null; // 泛型实体Class对象public final Map<String, PropertyMapping> mappings;public final RowMapper<T> rowMapper;public final String tableName;public String allColumn = "*";public Field pkField;public EntityOperation(Class<T> clazz,String pk) throws Exception{if(!clazz.isAnnotationPresent(Entity.class)){throw new Exception("在" + clazz.getName() + "中没有找到Entity注解,不能做ORM映射");}this.entityClass = clazz;Table table = entityClass.getAnnotation(Table.class);if (table != null) {this.tableName = table.name();} else {this.tableName =  entityClass.getSimpleName();}Map<String, Method> getters = ClassMappings.findPublicGetters(entityClass);Map<String, Method> setters = ClassMappings.findPublicSetters(entityClass);Field[] fields = ClassMappings.findFields(entityClass);fillPkFieldAndAllColumn(pk,fields);this.mappings = getPropertyMappings(getters, setters, fields);this.allColumn = this.mappings.keySet().toString().replace("[", "").replace("]","").replaceAll(" ","");this.rowMapper = createRowMapper();}Map<String, PropertyMapping> getPropertyMappings(Map<String, Method> getters, Map<String, Method> setters, Field[] fields) {Map<String, PropertyMapping> mappings = new HashMap<String, PropertyMapping>();String name;for (Field field : fields) {if (field.isAnnotationPresent(Transient.class))continue;name = field.getName();if(name.startsWith("is")){name = name.substring(2);}name = Character.toLowerCase(name.charAt(0)) + name.substring(1);Method setter = setters.get(name);Method getter = getters.get(name);if (setter == null || getter == null){continue;}Column column = field.getAnnotation(Column.class);if (column == null) {mappings.put(field.getName(), new PropertyMapping(getter, setter, field));} else {mappings.put(column.name(), new PropertyMapping(getter, setter, field));}}return mappings;}RowMapper<T> createRowMapper() {return new RowMapper<T>() {public T mapRow(ResultSet rs, int rowNum) throws SQLException {try {T t = entityClass.newInstance();ResultSetMetaData meta = rs.getMetaData();int columns = meta.getColumnCount();String columnName;for (int i = 1; i <= columns; i++) {Object value = rs.getObject(i);columnName = meta.getColumnName(i);fillBeanFieldValue(t,columnName,value);}return t;}catch (Exception e) {throw new RuntimeException(e);}}};}protected void fillBeanFieldValue(T t, String columnName, Object value) {if (value != null) {PropertyMapping pm = mappings.get(columnName);if (pm != null) {try {pm.set(t, value);} catch (Exception e) {e.printStackTrace();}}}}private void fillPkFieldAndAllColumn(String pk, Field[] fields) {//设定主键try {if(!StringUtils.isEmpty(pk)){pkField = entityClass.getDeclaredField(pk);pkField.setAccessible(true);}} catch (Exception e) {log.debug("没找到主键列,主键列名必须与属性名相同");}for (int i = 0 ; i < fields.length ;i ++) {Field f = fields[i];if(StringUtils.isEmpty(pk)){Id id = f.getAnnotation(Id.class);if(id != null){pkField = f;break;}}}}public T parse(ResultSet rs) {T t = null;if (null == rs) {return null;}Object value = null;try {t = (T) entityClass.newInstance();for (String columnName : mappings.keySet()) {try {value = rs.getObject(columnName);} catch (Exception e) {e.printStackTrace();}fillBeanFieldValue(t,columnName,value);}} catch (Exception ex) {ex.printStackTrace();}return t;}public Map<String, Object> parse(T t) {Map<String, Object> _map = new TreeMap<String, Object>();try {for (String columnName : mappings.keySet()) {Object value = mappings.get(columnName).getter.invoke(t);if (value == null)continue;_map.put(columnName, value);}} catch (Exception e) {e.printStackTrace();}return _map;}public void println(T t) {try {for (String columnName : mappings.keySet()) {Object value = mappings.get(columnName).getter.invoke(t);if (value == null)continue;System.out.println(columnName + " = " + value);}} catch (Exception e) {e.printStackTrace();}}
}class PropertyMapping {final boolean insertable;final boolean updatable;final String columnName;final boolean id;final Method getter;final Method setter;final Class enumClass;final String fieldName;public PropertyMapping(Method getter, Method setter, Field field) {this.getter = getter;this.setter = setter;this.enumClass = getter.getReturnType().isEnum() ? getter.getReturnType() : null;Column column = field.getAnnotation(Column.class);this.insertable = column == null || column.insertable();this.updatable = column == null || column.updatable();this.columnName = column == null ? ClassMappings.getGetterName(getter) : ("".equals(column.name()) ? ClassMappings.getGetterName(getter) : column.name());this.id = field.isAnnotationPresent(Id.class);this.fieldName = field.getName();}@SuppressWarnings("unchecked")Object get(Object target) throws Exception {Object r = getter.invoke(target);return enumClass == null ? r : Enum.valueOf(enumClass, (String) r);}@SuppressWarnings("unchecked")void set(Object target, Object value) throws Exception {if (enumClass != null && value != null) {value = Enum.valueOf(enumClass, (String) value);}//BeanUtils.setProperty(target, fieldName, value);try {if(value != null){setter.invoke(target, setter.getParameterTypes()[0].cast(value));}} catch (Exception e) {e.printStackTrace();/*** 出错原因如果是boolean字段 mysql字段类型 设置tinyint(1)*/System.err.println(fieldName + "--" + value);}}
}

基于SpringJDBC 实现关键功能-EntityOperation相关推荐

  1. 基于SpringJDBC 实现关键功能-QueryRuleSqlBulider

    /*** 根据QueryRule自动构建sql语句*/ public class QueryRuleSqlBuilder {private int CURR_INDEX = 0; //记录参数所在的位 ...

  2. 基于SpringJDBC 实现关键功能-ClassMappings

    public class ClassMappings {private ClassMappings(){}static final Set<Class<?>> SUPPORTE ...

  3. 核心网upf作用_高性能5G核心网,动力从何而来? 核心网,是整个通信网络的大脑,是不可或缺的重要组成部分。 网络的管理控制、鉴权认证等关键功能,主要由核心网负责。核心网的... - 雪球...

    来源:雪球App,作者: 鲜枣课堂,(https://xueqiu.com/7282046183/152278945) 核心网,是整个通信网络的大脑,是不可或缺的重要组成部分. 网络的管理控制.鉴权认 ...

  4. 硬件课程设计:基于STM32的多功能播放器之小说阅读

    1 小说阅读功能 1.1 功能介绍 1.1.1 设计思路 在TFTLCD屏上显示中英文文本文件是本次硬件课程设计的基本要求,也是我设计的多功能播放器最重要的功能,要求能够读取事先存储在SD卡中的文本文 ...

  5. 硬件课程设计:基于STM32的多功能播放器之MP3音乐播放

    3 MP3音乐播放 3.1 功能介绍 3.1.1 设计思路 音乐播放是手机等电子产品最常见的功能,也是最具娱乐性的功能,在该模块中,我先从SD卡中读取已存放的MP3音乐文件,然后将读取的字节流依次送人 ...

  6. 企业集成平台即服务的关键功能

    2020年9月21日发布-ID G00434187-32分钟阅读 本文是Critical Capabilities for Enterprise Integration Platform as a S ...

  7. 硬件课程设计:基于STM32的多功能播放器之聊天功能

    6 聊天功能 6.1 功能介绍 6.1.1 设计思路        在该功能模块中,我打算模拟手机QQ的聊天功能,不同的是QQ是通过互联网实现手机与手机之间的通信,而我是通过蓝牙实现stm32开发板与 ...

  8. think php ajax分页,thinkPHP5框架实现基于ajax的分页功能示例

    本文实例讲述了thinkPHP5框架实现基于ajax的分页功能.分享给大家供大家参考,具体如下: 最近一个页面的选项卡又牵扯到ajax分页,所以研究了一下tp5的ajax分页使用方法 首先看一下tp5 ...

  9. 移动端apm关键指标_3个经常被忽视的APM关键功能

    移动端apm关键指标 APM核心功能已不再足够. 市场领先的应用程序超越了所有人,树立了其他人必须匹配的新标准. 每当任何针对消费者或企业的Web应用程序达到新的性能高峰时,都会为用户期望值设定基准. ...

最新文章

  1. Android 实时文件夹
  2. JAVASCRIPT学习笔记----Javascript引用类型
  3. 【控制】《现代控制理论》谢克明老师-目录
  4. HTML5学习笔记(一)(2015-12-2)【新浪云搬运】
  5. linux 使用buildroot制作文件系统
  6. flock - 必应词典
  7. 面试必问之JVM原理
  8. 黑马商城项目源代码_Python学习路线图--Python框架与项目
  9. 会计行业被计算机取代马云,会计人:为什么我神烦“人工智能取代说”?
  10. Ubuntu中MongoDB的安装
  11. 一张图学会python3语法-一张图理清 Python3 所有知识点
  12. Groupon的电子邮件营销故事
  13. 《游戏设计艺术(第2版)》——学习笔记(27)第27章 通过试玩创造好游戏
  14. 10bit灰阶测试图_色彩深度技术探讨,关于8bit,10bit,12bit,16bit,什么是灰阶?...
  15. Q4财报再次显示,百度在2B市场的竞争中已占据领先地位
  16. HTML表单元素、标签、iframe内联框架 详细代码图解
  17. 极速office(Word)文件怎么在方框里面打对勾
  18. 迅为iTOP6818开发板QtE5.7应用例程源码
  19. 尚硅谷python入门
  20. Android TTS 支持中文

热门文章

  1. Javaweb学习路线(自学规划)
  2. Anaconda安装更新库
  3. 各大公司容器云的技术栈对比
  4. 个人Wordpress站点设置Windows Live writer
  5. the Open Source Community
  6. IE JS关闭窗口不提示的方法
  7. delphi开发日志——基窗体,使用面向对象编程的编程思想创建基类
  8. 记一次特别的往事 while 循环
  9. 【Redis学习】Redis管理命令总结
  10. 真正掌握vuex的使用方法(六)