import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.lang.reflect.Field;
import java.util.*;
/**
* Created by 黄永光
* User: Administrator
* Date: 2011-8-11
* Time: 10:30:15
* <p/>
* 将实体工具类,Spring查询对象封装实体工具.
*/
public class EntityTool {
static Log LOGGER = LogFactory.getLog(EntityTool.class);
/**
* 将map转成实体,map中的key必须与实体中的属性名相同才可以转换成功
*
* @param entityMap 实体map,属性键值对,其中key为实体的属性名,value为属性的值
* @param entityType 实体类
* @param <T>
* @return
*/
public static <T> T converToEntity(Map<String, Object> entityMap, Class<T> entityType) {
T result = null;
try {
result = entityType.newInstance();
Map<String, Field> fieldsMap = getFieldMap(entityType);
Field field = null;
for (Map.Entry<String, Object> entry : entityMap.entrySet()) {
field = fieldsMap.get(entry.getKey().toLowerCase());
if (field == null) {
LOGGER.error("键值" + entry.getKey().toLowerCase() + "在" + entityType.getName() + "中找不到对应的属性!");
throw new Exception();
}
field.setAccessible(true);
Object value = entry.getValue();
if (value == null) {
continue;
}
if (isBasicType(field.getType())) {
// System.out.println(field.getName()+"="+value);
System.out.println(field.getType());
if (field.getType().equals(boolean.class) || field.getType().equals(Boolean.class)) {
if (value.equals(new Boolean(true) || value.equals(true)) || value.equals(new Boolean(true) || value.equals(true))) {
field.set(result, value);
} else {
if (value.toString().equals("1")) {
field.set(result, true);
} else {
field.set(result, false);
}
}
} else {
field.set(result, value);
}
} else {
/*
设置复合类型属性,只设id如果存在
*/
Class fildType = field.getType();
Field idField = null;
try {
idField = getDeclaredField("id", fildType, true);
} catch (NoSuchFieldException e) {
continue;
}
if (idField != null) {
idField.setAccessible(true);
Object compositeFieldValue = fildType.newInstance();
idField.set(compositeFieldValue, value);
field.set(result, compositeFieldValue);
} else {
LOGGER.warn("复合属性" + entry.getKey().toLowerCase() + "没有id属性,没有赋值!");
}
}
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return result;
}
/**
* 得到某类的属性
* @param fieldName 属性名
* @param clazz 类
* @param withSuperClass 是否从父类中取属性
* @return
*/
private static Field getDeclaredField(String fieldName, Class clazz, boolean withSuperClass) throws NoSuchFieldException {
Field field = null;
try {
field = clazz.getDeclaredField(fieldName);
} catch (NoSuchFieldException e) {
if (field == null && withSuperClass) {
Class superClazz = clazz.getSuperclass();
if (superClazz != null) {
field = getDeclaredField(fieldName, superClazz, withSuperClass);
}
} else {
throw e;
}
}
return field;
}
/**
* 将多个map转换成实体集合
*
* @param datas
* @param entityType
* @param <E>
* @return
*/
public static <E> List<E> convertToEntities(List<Map<String, Object>> datas, Class<E> entityType) {
List<E> result = new ArrayList<E>();
E data = null;
for (Map<String, Object> map : datas) {
data = converToEntity(map, entityType);
result.add(data);
data = null;
}
return result;
}
/**
* 判断是不是基本类型
*
* @param type
* @return
*/
public static boolean isBasicType(Class type) {
if (type.isPrimitive()) {
return true;
}
if (type.getPackage().getName().equals("java.lang") || type.getPackage().getName().equals(("java.util"))) {
return true;
} else if (type.equals(java.sql.Date.class)) {
return true;
} else {
return false;
}
}
/**
* 得到某个类的属性map key为属性名,value为属性
*
* @param entityClass
* @return
*/
public static Map<String, Field> getFieldMap(Class entityClass) {
Field[] fields = entityClass.getDeclaredFields();
Map<String, Field> fieldsMap = new HashMap<String, Field>();
for (Field field : fields) {
fieldsMap.put(field.getName().toLowerCase(), field);
}
Class superclass = entityClass.getSuperclass();
if (superclass != null) {
fieldsMap.putAll(getFieldMap(superclass));
}
return fieldsMap;
}
public static void main(String[] args) {
/*Map<String,Field> fields= getFieldMap(User.class);
for(Map.Entry<String,Field> entry:fields.entrySet()){
System.out.println(entry.getKey()+":"+entry.getValue());
}*/
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", null);
map.put("userId", null);
map.put("employee", null);
map.put("password", null);
map.put("userStatus", null);
map.put("historyPwdList", null);
map.put("statusChangeTime", null);
map.put("updateTimeStamp", null);
map.put("passwordUpdateTime", null);
map.put("createTimeStamp", null);
map.put("removed", null);
User user = converToEntity(map, User.class);
System.out.println(user.getId());
}
}
分享到:
相关推荐
在Spring Boot应用中,JdbcTemplate是一个强大的工具,它简化了与数据库交互的过程。下面将详细讲解如何在Spring Boot项目中整合并使用JdbcTemplate。 一、创建项目并导入依赖 首先,我们需要创建一个新的Spring ...
为了解决这些问题,Spring框架提供了一个强大的工具——JdbcTemplate,它对JDBC进行了高度封装,使得数据库操作更加简洁、安全且易于维护。 JdbcTemplate的核心理念是将数据库操作与业务逻辑分离,通过模板方法模式...
Spring Boot提供了一系列强大的工具,如JPA、Hibernate、Spring Data和JdbcTemplate,来简化这一过程。让我们深入探讨这些技术以及它们在实际项目中的应用。 1. **JPA(Java Persistence API)**: JPA是Java平台...
- Hibernate工具:`hibernate-tools.jar`,包含代码生成器、逆向工程等实用工具。 3. **MySQL驱动**: - `mysql-connector-java.jar`,这是连接MySQL数据库的驱动,Spring和Hibernate在处理MySQL数据时都需要它。...
在Spring Boot中,可以使用`@Autowired`注解来注入JdbcTemplate或JPA实体管理器,或者通过MyBatis的Mapper接口来执行SQL查询。例如,创建一个Mapper接口: ```java public interface UserMapper { User ...
在本项目中,SpringJDBCTemplate的使用将展示如何在Spring应用中进行CRUD(创建、读取、更新和删除)操作,包括连接池的配置、SQL语句的执行以及异常处理。 1. **Spring JDBC核心组件**:Spring JDBC的核心是...
在运行时,Spring Data JPA会根据这个方法名生成对应的查询逻辑。 在服务层,我们可以注入`ActorRepository`并调用这些方法来获取数据: ```java import org.springframework.beans.factory.annotation.Autowired;...
在IT行业中,Spring框架是Java领域最广泛应用的轻量级框架之一,而Spring MVC是它的一个模块,专门用于处理Web应用程序的模型-视图-控制器(MVC)架构。Spring 5.x带来了许多性能改进和新特性,如Reactor支持以实现...
2. **配置Spring**:编写Spring配置文件,配置DataSource、SessionFactory以及事务管理器。使用`<tx:annotation-driven/>`开启基于注解的事务管理。 3. **配置Hibernate**:创建Hibernate配置文件,定义数据库连接...
2. JPA与Hibernate:Spring Boot 1.5.3.RELEASE对JPA和Hibernate的支持更加完善,包括实体管理、事务控制和查询语言等。 五、Spring Boot CLI 1. Spring Boot命令行接口(CLI):提供了快速试用和开发Spring Boot...
Spring Boot 是一个基于 Spring 框架的快速开发工具,它简化了初始化、配置和运行新项目的流程。这个学习笔记的完整教程将涵盖多个关键领域,帮助开发者深入理解和使用 Spring Boot。 1. **Spring Boot 教程** - *...
本文将详细讲解如何实现基于实体属性/表列名的前后端自定义通用条件查询,以及如何利用JdbcTemplate和Gson解析进行这一过程。 首先,我们要理解“实体属性/表列名”的概念。在Java开发中,实体类通常对应数据库中的...
Spring MVC 是一个模型-视图-控制器(MVC)架构模式的实现,它简化了开发人员处理 HTTP 请求和生成动态内容的工作。Spring MVC 的主要组件包括 DispatcherServlet、Controllers、Models、Views 和 ViewResolvers。...
- **Spring Initializr**:在线工具或Maven插件用于快速生成Spring Boot项目结构。 - **主类与@SpringBootApplication注解**:主类通常包含@SpringBootApplication注解,它结合了@ComponentScan、@...
5. Struts2的基础:Struts2的MVC架构、拦截器、Action配置、结果类型和国际化。 6. Struts2的表单验证:利用Struts2的Validator框架进行前端表单数据的验证。 7. Hibernate的实体映射:理解实体类、主键生成策略、...
然后,实现这个接口,例如在UserServiceImpl类中,这里可能会涉及到数据库操作,使用JdbcTemplate或Hibernate等持久层技术来查询数据库。 在Controller层,我们创建一个UserController类,它会包含一个处理GET请求...
Hibernate则通过Spring的数据访问抽象层(如HibernateTemplate或JdbcTemplate)进行集成,使得数据库操作更加简洁。 整合SSH的过程通常涉及以下步骤: 1. 引入相关jar包:包括Struts2、Hibernate、Spring以及它们的...
在本文中,我们将深入探讨如何将Spring Boot框架与ClickHouse数据库进行整合,以便在Java应用程序中高效...随着ClickHouse的不断发展和Spring Boot生态的完善,这种整合方式将为大数据分析和实时查询带来更多的可能性。
报表生成模块则可能利用了如Apache POI或JasperReports等工具,根据业务需求生成库存报告、销售报告等,以便管理人员分析决策。 安全性方面,Spring Security可以用来保护系统免受未经授权的访问,实现用户的登录...
6. **DAO层**:创建DAO(数据访问对象)接口和实现,利用Spring的JdbcTemplate或Hibernate的Session进行数据库操作。 7. **事务管理**:配置Spring的事务管理器,可以使用编程式或声明式事务管理。 8. **服务层**...