基于SpringJDBC 实现关键功能-EntityOperation
/*** 实体对象的反射操作*/
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相关推荐
- 基于SpringJDBC 实现关键功能-QueryRuleSqlBulider
/*** 根据QueryRule自动构建sql语句*/ public class QueryRuleSqlBuilder {private int CURR_INDEX = 0; //记录参数所在的位 ...
- 基于SpringJDBC 实现关键功能-ClassMappings
public class ClassMappings {private ClassMappings(){}static final Set<Class<?>> SUPPORTE ...
- 核心网upf作用_高性能5G核心网,动力从何而来? 核心网,是整个通信网络的大脑,是不可或缺的重要组成部分。 网络的管理控制、鉴权认证等关键功能,主要由核心网负责。核心网的... - 雪球...
来源:雪球App,作者: 鲜枣课堂,(https://xueqiu.com/7282046183/152278945) 核心网,是整个通信网络的大脑,是不可或缺的重要组成部分. 网络的管理控制.鉴权认 ...
- 硬件课程设计:基于STM32的多功能播放器之小说阅读
1 小说阅读功能 1.1 功能介绍 1.1.1 设计思路 在TFTLCD屏上显示中英文文本文件是本次硬件课程设计的基本要求,也是我设计的多功能播放器最重要的功能,要求能够读取事先存储在SD卡中的文本文 ...
- 硬件课程设计:基于STM32的多功能播放器之MP3音乐播放
3 MP3音乐播放 3.1 功能介绍 3.1.1 设计思路 音乐播放是手机等电子产品最常见的功能,也是最具娱乐性的功能,在该模块中,我先从SD卡中读取已存放的MP3音乐文件,然后将读取的字节流依次送人 ...
- 企业集成平台即服务的关键功能
2020年9月21日发布-ID G00434187-32分钟阅读 本文是Critical Capabilities for Enterprise Integration Platform as a S ...
- 硬件课程设计:基于STM32的多功能播放器之聊天功能
6 聊天功能 6.1 功能介绍 6.1.1 设计思路 在该功能模块中,我打算模拟手机QQ的聊天功能,不同的是QQ是通过互联网实现手机与手机之间的通信,而我是通过蓝牙实现stm32开发板与 ...
- think php ajax分页,thinkPHP5框架实现基于ajax的分页功能示例
本文实例讲述了thinkPHP5框架实现基于ajax的分页功能.分享给大家供大家参考,具体如下: 最近一个页面的选项卡又牵扯到ajax分页,所以研究了一下tp5的ajax分页使用方法 首先看一下tp5 ...
- 移动端apm关键指标_3个经常被忽视的APM关键功能
移动端apm关键指标 APM核心功能已不再足够. 市场领先的应用程序超越了所有人,树立了其他人必须匹配的新标准. 每当任何针对消费者或企业的Web应用程序达到新的性能高峰时,都会为用户期望值设定基准. ...
最新文章
- Android 实时文件夹
- JAVASCRIPT学习笔记----Javascript引用类型
- 【控制】《现代控制理论》谢克明老师-目录
- HTML5学习笔记(一)(2015-12-2)【新浪云搬运】
- linux 使用buildroot制作文件系统
- flock - 必应词典
- 面试必问之JVM原理
- 黑马商城项目源代码_Python学习路线图--Python框架与项目
- 会计行业被计算机取代马云,会计人:为什么我神烦“人工智能取代说”?
- Ubuntu中MongoDB的安装
- 一张图学会python3语法-一张图理清 Python3 所有知识点
- Groupon的电子邮件营销故事
- 《游戏设计艺术(第2版)》——学习笔记(27)第27章 通过试玩创造好游戏
- 10bit灰阶测试图_色彩深度技术探讨,关于8bit,10bit,12bit,16bit,什么是灰阶?...
- Q4财报再次显示,百度在2B市场的竞争中已占据领先地位
- HTML表单元素、标签、iframe内联框架 详细代码图解
- 极速office(Word)文件怎么在方框里面打对勾
- 迅为iTOP6818开发板QtE5.7应用例程源码
- 尚硅谷python入门
- Android TTS 支持中文