`
coach
  • 浏览: 386696 次
  • 性别: Icon_minigender_2
  • 来自: 印度
社区版块
存档分类
最新评论

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我)
*
* 功能:查询对象类型或对象集合时的通用包装类
*
*/
@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); 
    }
这样就简单多了,也是用反射实现的.

分享到:
评论
1 楼 ie0ie0ie 2011-03-25  
String type = field.getType().getName();
        这句好像不对吧?

相关推荐

    springjdbc使用及mybatis-generator

    1. **Spring JDBC核心组件**:Spring JDBC的核心是JdbcTemplate,它是一个模板类,封装了基本的JDBC操作,如执行SQL查询、更新、存储过程等。通过使用JdbcTemplate,开发者可以避免编写大量重复的JDBC模板代码,例如...

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

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

    访问数据库基本封装(spring/hibernate/ibatis)

    Spring JDBC模块提供了对JDBC的简单封装,使得编写SQL和处理结果集变得更简洁。同时,Spring Data JPA和Spring Data JDBC则提供了更高层次的抽象,支持与ORM(对象关系映射)框架如Hibernate集成。Spring Data的...

    itheima_spring_jdbc.rar

    Spring JDBC是Spring对JDBC的封装,提供了一种更方便、更面向对象的方式来操作数据库。它简化了数据库连接的建立、关闭以及SQL语句的执行,同时提供了事务管理的支持。 学习SSM的过程中,你可能会接触到以下知识点...

    spring mvc+mybatis封装

    - 配置Spring的SqlSessionFactoryBean,用于创建SqlSessionFactory对象,它是MyBatis的核心。 - 创建MyBatis的Mapper接口和XML配置文件,定义SQL语句和结果映射。 - 在Spring配置文件中定义...

    spring+mybatis+jdbc.rar

    综上所述,"spring+mybatis+jdbc.rar"项目是一个基于Java的后端应用,利用Spring的全面功能、MyBatis的简单映射以及JDBC的直接数据库操作,构建了一个适用于中小规模应用的框架。通过合理的架构设计和性能优化,该...

    MyBatis与Spring整合——通过官方文档进行最简单的整合

    它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索封装工作。MyBatis可以使用简单的XML或注解来进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录...

    SpringBoot整合Mybatis初学者,简单实用

    spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.jdbc.Driver mybatis....

    mybatis-spring-1.3.3.jar官方下载

    1. **SqlSessionTemplate**:这是一个 Spring 封装的 SqlSession 对象,提供了线程安全的 SQL 执行操作。开发者可以通过 SqlSessionTemplate 直接执行 SQL 语句,无需关心事务管理、资源关闭等细节。 2. **...

    Mybatsi与spring的简单整合

    SqlSessionFactory是Mybatis的核心对象,用于创建SqlSession,而SqlSessionTemplate则是Spring对SqlSession的封装,提供了线程安全的操作。 1. **添加依赖**: 在项目的pom.xml或build.gradle文件中,需要引入...

    spring-jdbc-orm-test:基于spring-jdbc 写的一个小型ORM

    其中,Spring-JDBC模块是Spring对Java数据库连接(JDBC)的封装,它提供了一种更高级、更简洁的方式来处理数据库操作。本篇文章将详细探讨一个基于Spring-JDBC构建的小型ORM(对象关系映射)实现,帮助开发者理解其...

    Spring3-Mybatis-Spring3MVC所需架包

    "Spring3-Mybatis-Spring3MVC所需架包"这个标题揭示了我们需要关注的是这三个技术的整合,而描述则强调了这是为了实现一个简单的整合所需的库文件。下面,我们将深入探讨这些技术及其整合的关键知识点。 **1. ...

    mybatis-spring-1.3.0.jar 下载

    1. **自动扫描Mapper接口并注入SqlSession**:MyBatis-Spring能自动扫描项目中的Mapper接口,并为每个接口注入一个实现了该接口的代理对象,该代理对象内部封装了SqlSession,从而简化了对数据库操作的代码。...

    spring+springMVC+mybatis简单实例

    例如,SpringMVC的Controller与Service层的bean可以通过@Autowired注解实现自动装配,而MyBatis的SqlSessionFactory和Mapper接口则通过Spring管理。 通过这个简单的SSM实例,开发者可以快速理解如何搭建一个基础的...

    mybatis.3.2.3.jar+mybatis连接spring的jar

    3. **配置Mapper扫描**: 在Spring配置文件中,使用MapperScannerConfigurer扫描包中的Mapper接口,使Spring能够自动发现并注册它们。 4. **使用SqlSessionTemplate**: 在需要执行数据库操作的地方,注入...

    spring-mybatis-spring-1.0.0-RC2.zip

    MyBatis则是一个基于Java的持久层框架,它封装了JDBC,让开发者可以更专注于SQL语句的编写,同时通过XML或注解方式将SQL语句与Java代码解耦。MyBatis的主要特点是它的动态SQL支持,使得SQL的编写更加灵活。 整合...

    spring与mybatis所需jar包

    - **Spring JDBC** 和 **Spring Data**:Spring 提供了对 JDBC 的简化封装,同时 Spring Data 提供了与多种数据存储的交互接口,使得数据库操作更加简单。 - **Spring Boot**:为了简化 Spring 应用的初始化和配置...

    spring框架开发相关jar包

    Spring与Mybatis的整合可以利用Spring的IOC和AOP特性,让Mybatis的Mapper接口和SqlSession管理更加方便,同时保持Mybatis的灵活性。 6. **Spring-Json** 这可能是Spring对JSON数据处理的支持,比如使用Jackson或...

    spring-spring mvc-mybaties整合dome

    - Model表示业务数据,可以是简单的Java对象(POJOs)。 - View负责渲染视图,通常与模板引擎(如Thymeleaf、JSP)配合使用。 - ViewModel是Model和View之间的桥梁,用于传递数据。 3. **MyBatis**:MyBatis避免...

    pring对JDBC和orm的支持共10页.pdf.zip

    Spring是一个广泛使用的Java企业级应用开发框架,它提供了一整套工具和功能来简化JDBC(Java Database Connectivity)的使用,并且支持ORM(Object-Relational Mapping)框架,如Hibernate和MyBatis,来实现对象与...

Global site tag (gtag.js) - Google Analytics