`
nanjingjiangbiao_T
  • 浏览: 2595440 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Spring jdbc 对象Mapper的简单封装

 
阅读更多
一般查询实体的时候,都需要这么使用:
/** *//**
     * 根据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);  
    }

这样就简单多了,也是用反射实现的.
分享到:
评论

相关推荐

    基于SpringJDBC的轻量级ORM框架sborm.zip

    SBORM只是针对spring jdbc的一些不方便的地方,做了一些封装,更加简化日常的开发工作,基于spring jdbc的RowMapper自动实现对象映射,也勉强算的上叫ORM,只是大部分功能已经由spring jdbc实现了。 平时不太...

    devX:devX 基于spring boot2.0 开发一些系统常用工具集成,jdbc封装,mybatis Mapper4,mybatis-plus,集群缓存 Lock等

    devX devX 基于spring boot2.0 开发一些系统常用工具集成,jdbc封装,mybatis Mapper4,mybatis-plus,集群缓存 Lock等

    SSM框架整合的资料,可以用Typora打开查看

    - mybatis:作为数据对象的持久化引擎,用做处理数据交互,对jdbc做了透明化的封装,相比于hibernate这种全自动的框架,mybatis属于半自动化的,程序员可以自己写sql语句,相比于hibernate跟具灵活性。 需要注意的...

    day01_eesy_01mybatis.zip

    Spring中对jdbc的简单封装 Apache的DBUtils: 它和Spring的JdbcTemplate很想,也是对Jdbc的简单封装 以上这些都不是框架 JDBC是规范 Spring的JdbcTemplate和Apache的DBUtils都只是工具类 4.mybatis的...

    springmybatis

    MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...

    SSMProject.zip

     mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql...

    SSM框架完整jar包,可直接使用

     mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql...

    simple-data-mapper:一个简单的 SQL Mapping Demo,通过映射表结构生成 Domain 和 Dao

    这是一个简单的数据库映射Demo,目的是通过JDBC封装,提供对象与数据库表之间的相互映射关系。类似的成熟产品已经有Mybatis了,所以这个Demo也只是写着玩,并不会用在生产环境中。 ###依赖 这个项目依赖以下第三方库...

    高清版图片展示了ssm框架

    mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql...

    ssm框架思维导图.rar

     mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql...

    mybatis-config.xml

     mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql...

    ssm框架搭建所需要的全部jar包

    Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。SpringMVC在项目中拦截用户请求,它的核心Servlet即DispatcherServlet承担中介或是前台这样的...

    StudentManagerSSM.rar

    SSM:spring+springMVC+mybaits Spring:是一个容器,就是一个bean(实体对象)大集合。 JavaBean SpringMVC:控制器(业务逻辑层)(视图分发器)。...Mybaits:jdbc的封装(数据库框架)Mapper.xml

    java springboot项目(登录及注册功能)

    我们可以通过Spring官网的初始化工具来快速创建一个SpringBoot项目,只需要选择我们需要的依赖,比如web,thymeleaf,jdbc,mybatis,mysql等, 第二步:创建一个数据库表 我们需要在MySQL中创建一个数据库表来存储...

    SSM框架整合

    -- Spring对JDBC的封装 --&gt; &lt;groupId&gt;org.springframework &lt;artifactId&gt;spring-jdbc &lt;groupId&gt;org.springframework &lt;artifactId&gt;spring-aspects &lt;!-- 关系型数据库整合时需配置 如hibernate jpa...

    BeetlSQL是提供开发高效维护高效运行高效的数据库访问框架

    BeetlSQL 不仅仅是简单的类似MyBatis或者是Hibernate,或者是二者的综合,BeetlSQL远大理想是对标甚至超越Spring Data,是实现数据访问统一的框架,无论是传统数据库,还是大数据,还是查询引擎或者时序库,内存...

    基于SSM+Mysql实现的CRM信息管理系统源码+数据库+项目说明.zip

    再通过一个对象封装起来,传入前端。 ``` * 使用了PageHelper之后,我们就不需要再如此繁琐的进行分页了。 * ```Java 使用PageHelper.startPage(第几页,每页显示多少条);就可以在这段代码之后的下一个查询的...

    叮当书城项目-叮当书城项目部署代码视频教程带源码(java毕业设计项目-java练手项目)

    3、config文件,里面是我们的配置文件,jdbc.properties是对数据库连接的配置,mybatis-config.xml是对mapper.xml文件进行扫描的配置, spring.xml主要是配置组件扫描器,加载外部的properties配置文件,配置数据库...

    t淘淘商城项目 商城项目 视频和源码教程 详细

    &lt;artifactId&gt;spring-jdbc ${spring.version} &lt;groupId&gt;org.springframework &lt;artifactId&gt;spring-aspects ${spring.version} &lt;!-- JSP相关 --&gt; &lt;groupId&gt;jstl &lt;artifactId&gt;jstl ${jstl.version...

    Eclipse开发分布式商城系统+完整视频代码及文档

    │ 06.jedis客户端在spring中的配置.avi │ 07.测试spring中的JedisClient.avi │ 08.缓存同步-服务发布.avi │ 09.后台调用缓存同步服务.avi │ 10.solr单机版安装.avi │ 11.中文分析器配置.avi │ 12.导入数据-...

Global site tag (gtag.js) - Google Analytics