Spring jdbc 對象Mapper的簡單封裝

來源:互聯網
上載者:User

一般查詢實體的時候,都需要這麼使用

/**     * 根據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);    }

測試通過:

7369749975217566765476987782778878397844

上面是我的一個簡單封裝,在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);      }

這樣就簡單多了,也是用反射實現的.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.