`
yongguang423
  • 浏览: 110554 次
  • 性别: Icon_minigender_1
  • 来自: 山东
社区版块
存档分类
最新评论

Spring JdbcTemplate 查询结果 实体生成工具

 
阅读更多
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());


    }
}

 

0
4
分享到:
评论
1 楼 osacar 2011-10-03  
写得不错啊。
相当实用啊!

相关推荐

    Springboot jdbctemplate整合实现步骤解析

    在Spring Boot应用中,JdbcTemplate是一个强大的工具,它简化了与数据库交互的过程。下面将详细讲解如何在Spring Boot项目中整合并使用JdbcTemplate。 一、创建项目并导入依赖 首先,我们需要创建一个新的Spring ...

    JdbcTemplate.7z

    为了解决这些问题,Spring框架提供了一个强大的工具——JdbcTemplate,它对JDBC进行了高度封装,使得数据库操作更加简洁、安全且易于维护。 JdbcTemplate的核心理念是将数据库操作与业务逻辑分离,通过模板方法模式...

    springboot,jpa,spring data,jdbc template使用代码

    Spring Boot提供了一系列强大的工具,如JPA、Hibernate、Spring Data和JdbcTemplate,来简化这一过程。让我们深入探讨这些技术以及它们在实际项目中的应用。 1. **JPA(Java Persistence API)**: JPA是Java平台...

    Spring集成Hibernate所需jar包

    - Hibernate工具:`hibernate-tools.jar`,包含代码生成器、逆向工程等实用工具。 3. **MySQL驱动**: - `mysql-connector-java.jar`,这是连接MySQL数据库的驱动,Spring和Hibernate在处理MySQL数据时都需要它。...

    spring boot mybatis 国际化 拦截器

    在Spring Boot中,可以使用`@Autowired`注解来注入JdbcTemplate或JPA实体管理器,或者通过MyBatis的Mapper接口来执行SQL查询。例如,创建一个Mapper接口: ```java public interface UserMapper { User ...

    springjdbc使用及mybatis-generator

    在本项目中,SpringJDBCTemplate的使用将展示如何在Spring应用中进行CRUD(创建、读取、更新和删除)操作,包括连接池的配置、SQL语句的执行以及异常处理。 1. **Spring JDBC核心组件**:Spring JDBC的核心是...

    Spring查询数据时返回指定的对象

    在运行时,Spring Data JPA会根据这个方法名生成对应的查询逻辑。 在服务层,我们可以注入`ActorRepository`并调用这些方法来获取数据: ```java import org.springframework.beans.factory.annotation.Autowired;...

    springmvc, spring5.x , hibernate5.x 整合

    在IT行业中,Spring框架是Java领域最广泛应用的轻量级框架之一,而Spring MVC是它的一个模块,专门用于处理Web应用程序的模型-视图-控制器(MVC)架构。Spring 5.x带来了许多性能改进和新特性,如Reactor支持以实现...

    webservice提供数据访问spring+hibernate

    2. **配置Spring**:编写Spring配置文件,配置DataSource、SessionFactory以及事务管理器。使用`&lt;tx:annotation-driven/&gt;`开启基于注解的事务管理。 3. **配置Hibernate**:创建Hibernate配置文件,定义数据库连接...

    spring-boot-1.5.3.RELEASE

    2. JPA与Hibernate:Spring Boot 1.5.3.RELEASE对JPA和Hibernate的支持更加完善,包括实体管理、事务控制和查询语言等。 五、Spring Boot CLI 1. Spring Boot命令行接口(CLI):提供了快速试用和开发Spring Boot...

    Spring Boot 学习笔记完整教程.docx

    Spring Boot 是一个基于 Spring 框架的快速开发工具,它简化了初始化、配置和运行新项目的流程。这个学习笔记的完整教程将涵盖多个关键领域,帮助开发者深入理解和使用 Spring Boot。 1. **Spring Boot 教程** - *...

    基于实体属性/表列名的前后端自定义通用条件查询

    本文将详细讲解如何实现基于实体属性/表列名的前后端自定义通用条件查询,以及如何利用JdbcTemplate和Gson解析进行这一过程。 首先,我们要理解“实体属性/表列名”的概念。在Java开发中,实体类通常对应数据库中的...

    springMVC+springJDBC

    Spring MVC 是一个模型-视图-控制器(MVC)架构模式的实现,它简化了开发人员处理 HTTP 请求和生成动态内容的工作。Spring MVC 的主要组件包括 DispatcherServlet、Controllers、Models、Views 和 ViewResolvers。...

    spring-boot-reference-guide-zh-中文, spring-boot参考指南

    - **Spring Initializr**:在线工具或Maven插件用于快速生成Spring Boot项目结构。 - **主类与@SpringBootApplication注解**:主类通常包含@SpringBootApplication注解,它结合了@ComponentScan、@...

    Java Web 基于Spring Struts Hibernate 轻量级架构开发基础

    5. Struts2的基础:Struts2的MVC架构、拦截器、Action配置、结果类型和国际化。 6. Struts2的表单验证:利用Struts2的Validator框架进行前端表单数据的验证。 7. Hibernate的实体映射:理解实体类、主键生成策略、...

    spring mvc之实现简单的用户管理四--查看用户信息

    然后,实现这个接口,例如在UserServiceImpl类中,这里可能会涉及到数据库操作,使用JdbcTemplate或Hibernate等持久层技术来查询数据库。 在Controller层,我们创建一个UserController类,它会包含一个处理GET请求...

    struts22.3.4.1+hibernate4.1.6+spring3.1.2整合jar包

    Hibernate则通过Spring的数据访问抽象层(如HibernateTemplate或JdbcTemplate)进行集成,使得数据库操作更加简洁。 整合SSH的过程通常涉及以下步骤: 1. 引入相关jar包:包括Struts2、Hibernate、Spring以及它们的...

    springboot整合clickhouse代码

    在本文中,我们将深入探讨如何将Spring Boot框架与ClickHouse数据库进行整合,以便在Java应用程序中高效...随着ClickHouse的不断发展和Spring Boot生态的完善,这种整合方式将为大数据分析和实时查询带来更多的可能性。

    【Spring项目源码】超市仓库管理系统.zip

    报表生成模块则可能利用了如Apache POI或JasperReports等工具,根据业务需求生成库存报告、销售报告等,以便管理人员分析决策。 安全性方面,Spring Security可以用来保护系统免受未经授权的访问,实现用户的登录...

    spring+hibernate编程

    6. **DAO层**:创建DAO(数据访问对象)接口和实现,利用Spring的JdbcTemplate或Hibernate的Session进行数据库操作。 7. **事务管理**:配置Spring的事务管理器,可以使用编程式或声明式事务管理。 8. **服务层**...

Global site tag (gtag.js) - Google Analytics