一般查询实体的时候,都需要这么使用/**
     * 根据id查询
     * 
     * @return
     */
    public Emp queryEmpById(Integer id)
    {
        String sql = "select * from emp where empno = ?";
        ParameterizedRowMapper<Emp> mapper = new ParameterizedRowMapper<Emp>()
        {

public Emp mapRow(ResultSet rs, int rowNum) throws SQLException
            {
                Emp emp = new Emp();
                System.out.println("row:" + rowNum);
                emp.setEmpno(rs.getInt("empno"));
                emp.setEname(rs.getString("ename"));
                return emp;
            }
        };

return this.getSimpleJdbcTemplate().queryForObject(sql, mapper, id);
    }
  
能不能像Hibernate那样自动set这些值呢,用反射可以实现.package orm;

import JAVA.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;

/**
* 通用的Object包装类(类型问题,依然是个瓶颈,如果有好的解决方案请pm我)

* 功能:查询对象类型或对象集合时的通用包装类

* @author zdw

*/
@SuppressWarnings("unchecked")
public class ObjectMapper implements ParameterizedRowMapper
{
    private Class clazz;

public ObjectMapper(Class clazz)
    {
        this.clazz = clazz;
    }

/**
     * 重写mapRow方法
     */
    @Override
    public Object mapRow(ResultSet rs, int rowNum) throws SQLException
    {
        try
        {
            Object obj = clazz.newInstance();
            Field fields[] = obj.getClass().getDeclaredFields();
            for (int i = 0; i < fields.length; i++)
            {
                Field field = fields[i];
                // 暴力访问
                field.setAccessible(true);
                this.typeMapper(field, obj, rs);
                // 恢复默认
                field.setAccessible(false);
            }
            return obj;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

/**
     * 数据类型包装器
     * 
     * @param field
     *            目标属性
     * @param obj
     *            目标对象
     * @param rs
     *            结果集
     * @throws Exception
     */
    private void typeMapper(Field field, Object obj, ResultSet rs)
            throws Exception
    {
        String type = field.getType().getName();
        if (type.equals("java.lang.String"))
        {
            field.set(obj, rs.getString(field.getName()));
        }
        else if (type.equals("int") || type.equals("java.lang.Integer"))
        {
            field.set(obj, rs.getInt(field.getName()));
        }
        else if (type.equals("long") || type.equals("java.lang.Long"))
        {
            field.set(obj, rs.getLong(field.getName()));
        }
        else if (type.equals("boolean") || type.equals("java.lang.Boolean"))
        {
            field.set(obj, rs.getBoolean(field.getName()));
        }
        else if (type.equals("java.util.Date"))
        {
            field.set(obj, rs.getDate(field.getName()));
        }
    }
}
  
dao:/**
     * 查询操作 (自动setEmp类型所有值)
     * 
     * @return
     */
    public List queryList()
    {
        return this.getJdbcTemplate().query("select * from emp",
                new ObjectMapper(Emp.class));
    }
  
单个查询:public Emp queryEmpById2(Integer id)
    {
        String sql = "select * from emp where empno = ?";
        ObjectMapper om = new ObjectMapper(Emp.class);
        return (Emp) this.getSimpleJdbcTemplate().queryForObject(sql, om, id);
    }
  
测试通过:7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
  
上面是我的一个简单封装,在Spring2.5中及以后版本,已经提供了便捷方法:/**
     * 查询操作 (自动setEmp类型所有值)
     * 
     * @return
     */
    public List queryList()
    {
        return this.getSimpleJdbcTemplate().query(   
                "SELECT * from emp",   
                ParameterizedBeanPropertyRowMapper.newInstance(Emp.class));  
    }
    
    /**
     * 根据id查询
     * 
     * @return
     */
    public Emp queryById(Integer id)
    {
        return this.getSimpleJdbcTemplate().queryForObject(   
                "SELECT * from emp where id = ?",   
                ParameterizedBeanPropertyRowMapper.newInstance(Emp.class),7369);  
    }
  
这样就简单多了,也是用反射实现的http://www.shengshiyouxi.com.

Spring jdbc 对象Mapper的简单封装的更多相关文章

  1. Spring JDBC对象批量操作

    以下示例将演示如何使用spring jdbc中的对象进行批量更新.我们将在单次批次操作中更新student表中的记录. student表的结果如下 - CREATE TABLE student( id ...

  2. JDBC【2】-- JDBC工作原理以及简单封装

    目录 1. 工作原理 1.1 加载驱动 1.1.1 类加载相关知识 1.1.2 为什么JDK 1.6之后不需要显示加载了? 1.2 驱动加载完成了,然后呢? 2. 简单封装 1. 工作原理 一般我们主 ...

  3. 初学JDBC,JDBC工具类的简单封装

    //工具类不需要被继承 public final class JdbcUtils{ //封装数据库连接参数,便于后期更改参数值 private static String url="jdbc ...

  4. Spring JDBC(一)jdbcTemplate

    前言 最近工作中经常使用Spring JDBC操作数据库,也断断续续的看了一些源码,便有了写一些总结的想法,希望在能帮助别人的同时,也加深一下自己对Spring JDBC的理解. Spring JDB ...

  5. ref:Spring JDBC框架

    ref:https://blog.csdn.net/u011054333/article/details/54772491 Spring JDBC简介 先来看看一个JDBC的例子.我们可以看到为了执行 ...

  6. Spring JDBC查询返回对象代码跟踪

    在封装方法的时候突然发现通过 ResultSetMetaData的getColumnCount()获取到的列明会多一列(ROWSTAT),而且每次的值都是1,目前没有找到相关信息,在国外网站上看到有类 ...

  7. spring jdbc 查询结果返回对象、对象列表

    首先,需要了解spring jdbc查询时,有三种回调方式来处理查询的结果集.可以参考 使用spring的JdbcTemplate进行查询的三种回调方式的比较,写得还不错. 1.返回对象(queryF ...

  8. spring jdbc查询 依赖JdbcTemplate这个类模版封装JDBC的操作

    package cn.itcast.spring.jdbc; import java.util.List; import org.springframework.jdbc.core.support.J ...

  9. 【Spring JDBC】JdbcTemplate(三)

    传统Jdbc API与Spring jdbcTemplate比较 //JDBC API Statement statement = conn.createStatement(); ResultSet ...

随机推荐

  1. 怎样配置PHP环境和安装Zendstdio编辑器

    想学习PHP好久了.苦于环境配置不好,一直感觉无从下手. 在网上找了个视频: 李炎恢PHP教程 第一章前3节给出了具体的配置的方法,即安装Apache和Zendstudio 10.5仅仅须要照着视频做 ...

  2. TMsgThread, TCommThread -- 在delphi线程中实现消息循环(105篇博客,好多研究消息的文章)

    在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使用很方便,但是有时候我们需要在线程类中使用消息循环,delphi没有提供.   花了两天的事件研究了 ...

  3. web desktop在线演示

    http://mydesk.sinaapp.com 基于extjs的web desktop应用框架. 1.跨浏览器 2.动态载入所需css,js文件 3.权限管理 4.支持多语种 5.支持asp,js ...

  4. hdu 2055 An easy problem (java)

    问题: 開始尝试用字符做数组元素.可是并没实用. 在推断语句时把a z排出了. An easy problem Time Limit: 1000/1000 MS (Java/Others)    Me ...

  5. codeforces 659C Tanya and Toys

    题目链接:http://codeforces.com/problemset/problem/659/C 题意: n是已经有的数字,m是可用的最大数字和 要求选自己没有的数字,且这些数字的数字和不能超过 ...

  6. thinkPHP 模板中的语法知识 详细介绍(十二)

    原文:thinkPHP 模板中的语法知识 详细介绍(十二) 本章节:介绍模板中的语法,详细的语法介绍 一.导入CSS和JS文件    ==>记住常量的是大写 1.css link .js  sc ...

  7. Java 建立mysql数据库连接的语句

    每次在面试时被问到jdbc的数据路链接过程都卡着,这次不怕了,背会了... 第一个,比较粗糙的 try{   Class.forName("com.mysql.jdbc.Driver&quo ...

  8. ZOJ 3542 2011大连现场赛D题(简单模拟)

    Hexadecimal View Time Limit: 2 Seconds       Memory Limit: 65536 KB Hexadecimal is very important an ...

  9. android设置中的Preferencescreen使用方法介绍与分析

    今天主要研究了一下设置中的Preferencescreen应用,它不仅可以作为设置界面显示,并且还可以启动activity,以下主要是对启动activity的介绍 1. Preferencescree ...

  10. 彻底删除&quot;提示删除文件和目录&quot;时出错的文件或目录

    当删除文件是出现上图时  能够用以下的方法删除文件 策略一:系统大法 第一招  进程帮你搞定 很多时候乱码文件名称里的文件是explorer.exe进程联系在一起的. 假设要删除的话能够这样:首先命令 ...